projectile
По ходу, в проджектайле много всего добавилось за то время, пока я в доки не заглядывала. Правда, кажется, мне не особо это надо :))
Проект — это каталог, в котором содержится специальный файл: либо .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-commander, а там нажать ?, чтоб посмотреть варианты.
То, что забываю, а актуально: переключение проектов - projectile-switch-project
- C-c p p.
То, что дико понравилось: искать файлы через helm-projectile (C-c p h)
- иначе я в своём наилюбимейшем проекте нафиг теряюсь. Естественно, требует установленного helm-projectile, который нашёлся в melpa. дополнение и предложение в emacs - тут у меня про helm что-то. (UPD 2022-08-21: давно не пользуюсь. C-c p f - (найти файл) вместо этого вполне достаточен, vertico прекрасно показывает варианты).
- C-c p s s - поиск по проекту с ag
- С-с p s g - grep
- C-c p s r - ripgrep
- С-с p r - replace in project
Разумеется, можно добавлять свои команды.
Настройки проекта
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. Пишут, слишком медленная операция получается.
Проблемы (неактуально)
TRAMP c /sudo::
не дружил с projectile-global-mode. Если возникала проблема, надо было выключить projectile, открыть нужное, потом можно снова включить projectile, и до перезапуска emacs проблемы не будет.
Ссылки
- https://docs.projectile.mx/projectile/index.html
- https://github.com/bbatsov/projectile
- https://github.com/IvanMalison/org-projectile - тудушки для проектов
- https://docs.projectile.mx/projectile/projects.html - здесь есть про настройку типов проектов и настройку в них команд.
- https://github.com/sabof/project-explorer - вроде, сайдбар c файлами, который учитывает projectile-project-root. Впрочем, если я хочу что-то такое, у меня dired-sidebar.