Цифровой садик - приветственная

Цифровой садик - приветственная | Полный список всего, что тут есть | RSS | Подписаться через follow.it

01.02.2022

projectile

Написано хз когда несколько лет назад, с тех пор не пересматривалось. Просто пользуюсь. :) Projectile — средство для работы с проектами в emacs.

Проект — это каталог, в котором содержится специальный файл: либо .projectile, либо файлы/каталоги, по которым можно узнать репозиторий какой-то vcs, либо ещё какие-то незнакомые мне варианты. У меня обычно проект под git. Впрочем, .projectile тоже делала.

Я упоминаю тут сильно не всё, только то, что сама хотела либо помнить, либо держать под рукой.

Про установку

http://projectile.readthedocs.io/en/latest/installation/ или https://projectile.mx/

Существенно, что projectile в какой-то момент перестал назначать кнопочки по умолчанию. Будь добра сама добавить в конфиг примерно такое:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "s-p") 'projectile-command-map) ; это с кнопочкой Win, она же Super
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) ; Ctrl+c p

Кэширование

Так как индексирование больших проектов не совсем быстро, Projectile умеет кэшировать файлы проекта. Чтобы разрешить кэширование:

(setq projectile-enable-caching t)

Кэш сохраняется в папке emacs. У меня есть, мне удобно. Даже при том, что проекты у меня невелики. Во всяком случае, кэширование редко мешает, а если что, запуск C-u C-c p f очистит кэш перед тем, как спросить, к какому файлу мы хотим перейти. Можно удалить из кэша конкретный файл (M-x projectile-purge-file-from-cache) или каталог (M-x projectile-purge-dir-from-cache). Но мне не было нужно. А C-c p z, наоборот, добавляет текущий файл в кэш проекта, что тоже как-то не было нужно. Обычно новый файл в папке проекта добавляется в кэш, как только открываешь этот файл.

Игнорировать файлы и подкаталоги

Если мы хотим велеть Projectile игнорировать определённые файлы при индексировании проекта, можно указать в файле .projectile пути к ним относительно корня проекта, начинающиеся со /. То, что надо игнорировать, указываем со знаком - в начале строки. Или просто ничего не ставим.

Пример:

-/log
-/tmp
-/vendor
-/public/uploads

Это заставит игнорировать папки в корне проекта. Можно и иначе:

-tmp
-*.rb
-*.yml
-models

Можно, наоборот, игнорировать всё, кроме определённых нужных каталогов, если так проще. Если мы выбрали, какие каталоги смотреть, это значит, что всё остальное игнорируется.

Пример:

+/src/foo
+/tests/foo

К сожалению, маски файлов так выбирать нельзя. Только подкаталоги.

Если указаны и подкаталоги, которые игнорировать, и те, которые смотреть, то сначала применяются правила, что смотреть, потом выбранное проверяется на предмет, не надо ли там ещё что-то игнорировать.

Кнопочки

Удобно смотреть список по C-c p C-h. Можно заменить префикс C-c p на что-то другое примерно так: (setq projectile-keymap-prefix (kbd "C-c C-p")). Или добавить альтернативный префикс: (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map).

То, что забываю, а актуально: переключение проектов - projectile-switch-project - C-c p p.

То, что дико понравилось: искать файлы через helm-projectile (C-c p h) - иначе я в своём наилюбимейшем проекте нафиг теряюсь. Естественно, требует установленного helm-projectile, который нашёлся в melpa. дополнение и предложение в emacs - тут у меня про helm что-то.

Разумеется, можно добавлять свои команды.

Настройки проекта

Настройки могут отличаться от проекта к проекту, даже если это один язык. На этот случай есть .dir-locals.el, чтоб устанавливать настройки конкретно для каталога (и подкаталогов) проекта. В projectile можно открыть так: C-c p E (M-x projectile-edit-dir-locals RET).

В файле может быть что-то такое:

((nil . ((secret-ftp-password . "secret")
         (compile-command . "make target-x")
         (eval . (progn
                   (defun my-project-specific-function ()
                     ;; ...
                     ))))
 (c-mode . (c-file-style . "BSD")))

Скобочки надо ещё пересчитать, что-то я в них не уверена.

Projectile предлагает много настроек через defcustom. Эти же настройки для отдельного проекта пишутся в dir-locals.el.

Так можно включить кэширование только для отдельного проекта:

((nil . ((projectile-enable-caching . t))))

Так добавить игнорируемый файл:

((nil . ((projectile-globally-ignored-files . '("MyBinaryFile")))))

Так поменять название проекта в modeline. И именно этим я пользуюсь!

((nil . ((projectile-project-name . "your-project-name-here"))))

Mode line

В modeline по умолчанию Projectile выглядит как Projectile[ProjectName:Project Type]. Но! Это настраивается.

  • projectile-mode-line-prefix (by default " Projectile") controls the static part of the mode-line
  • projectile-dynamic-mode-line (by default t) controls whether to display the project name \& type part of the mode-line
  • projectile-mode-line-function (by default projectile-default-mode-line) controls the actual function to be invoked to generate the mode-line. If you'd like to show different info you should supply a custom function to replace the default, for example (setq projectile-mode-line-function '(lambda () (format " Proj[%s]" (projectile-project-name))))

И это хорошо, потому что поумолчательный вариант уж очень длинный. А как укоротить project-name было чуть выше.

Название проекта по умолчанию не возникает, если это удалённые файлы, редактируемые через TRAMP. Пишут, слишком медленная операция получается.

Как сделать проектом подпапку

  • .projectile - собственно, говорит, что вот эта папка - проект.
  • .gitignore - чтоб не делиться с другими этим набором файликов (в принципе, это можно и в глобальный gitignore)
  • .dir-locals.el - необязательно, туда просто настроек можно.

и в .gitignore

.projectile
.gitignore
.dir-locals.el
.projectile~
.gitignore~
.dir-locals.el~

Проблемы

TRAMP c /sudo:: не дружил с projectile-global-mode. Если возникала проблема, надо было выключить projectile, открыть нужное, потом можно снова включить projectile, и до перезапуска emacs проблемы не будет.

https://github.com/bbatsov/projectile/issues/835

Ссылки


Если у вас есть мысли, комментарии, предложения или отклики по поводу этой страницы или этого цифрового сада в целом, напишите мне сообщение через Яндекс.Форму или на agnessa@agnessa.pp.ru. Мне ооочень интересно!

Задонатить.


An IndieWeb Webring 🕸💍