?

Log in

No account? Create an account

Красивые фотографии с митинга

Рекомендации репортажным фотографам. http://color-foto.com

Previous Entry Share Next Entry
Статичний project root (emacs)
atykhonov
Переходжу в корінь проекту:

M-x cd RET /project/root/ RET

Відкриваю (C-x C-f) файл, наприклад /project/root/dir1/dir2/foo.py

Далі хочу відкрити інший файл, наприклад, /project/root/dir0/dir00/bar.py

Натискаю C-x C-f і бачу що поточна директорія в стрічці запиту /project/root/dir1/dir2/, тобто директорія щойно відкритого файла.

Тому для того, щоби відкрити файл /project/root/dir0/dir00/bar.py спочатку потрібно перейти в /project/root/, і лишень тоді в dir0/dir00/.

Для швидкого переходу в project-root користувався наступною функцією:

(defun goto-project-root () 
  (interactive) 
  (setq filename (format "%s/" project-root)) 
  (message project-root) 
  (ido-set-current-directory filename) 
  (setq ido-text "") 
  (ido-set-current-directory (file-name-directory filename)) 
  (setq ido-exit 'refresh ido-text-init ido-text ido-rotate-temp t) 
  (exit-minibuffer))

Вона у мене зав"язана на комбінацію клавіш M-a. Коли знаходжуся в стрічці запиту, натискаю M-a і тут же переходжу в project-root.

Звичайно що хотілося би зробити так, щоби без цієї додаткової комбінації, можна було би відразу потрапляти в project-root, і сьогодні в irc, якраз це обговорювали. Нотую по гарячих слідах, щоби не забути.

Отже project-root можна вказати в файлі .dir-locals.el, який кладемо в project-root. Зміст файлу:

((nil . ((default-directory . "/project/root/"))))

Emacs кожен раз зчитуючу певну директорію буде знаходити цей файл і завантажувати, і буде перевизначати змінну default-directory, яка власне і відповідає за директорію в якій будемо знаходитись натиснувши C-x C-f.

nil в цьому коді означає, що змінна буде застосовуватися до будь-якого mode'у. Замість nil можна прописати будь-який інший mode: c-mode, python-mode etc.

Можна поступити і по-інакшому. В момент ініціалізації проекту (скажімо задопомогою elisp-функції, яка підготовлює середовище до роботи, як наприклад завантажує відповідний virtualenv, запускає http-server і т.д. і т.п.), можна виконати наступні стрічки коду:

(let ((root-path "/project/root/")) 
  (dir-locals-set-class-variables 'project-root `((nil . ((default-directory . ,root-path)))))                
  (dir-locals-set-directory-class root-path 'project-root))

В документації (info "(emacs) Directory Variables"), описаний інший приклад, який підійде для ситуацій, коли директорія захищена від запису і немає можливості покласти туди файл .dir-locals.el:

(dir-locals-set-class-variables 'unwritable-directory '((nil . ((some-useful-setting . value))))) 
(dir-locals-set-directory-class "/usr/include/" 'unwritable-directory)


Ось і все наразі.