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
- https://gist.github.com/ptrv/4576213 - настроечный файл для ctags, чтоб тежить латех. Правда, я не уверена, что оно мне надо.
- http://endlessparentheses.com/improving-projectile-with-extra-commands.html - полезняшки на когда руки дойдут.