Как запустить хук в зависимости от расположения файла - PullRequest
5 голосов
/ 16 июня 2011

Я участвую в проекте Python, где используются вкладки, однако я не использую их в любом другом коде, который я пишу, важно использовать их в этом конкретном проекте.Проекты расположены в одном каталоге под определенными каталогами.IE:

\main_folder
    \project1
    \project2
    \project3
...etc

У меня есть пара функций / хуков при открытии файла и сохранении, что позволяет удалить и восстановить весь буфер, над которым я работаю.запускается на каждом .py файле, который я открываю, что не то, что я хочу.Я хотел бы, чтобы эти хуки использовались только в одной конкретной папке с соответствующими подпапками.Пробовал .dir_locals, но он работает только для свойств, а не хуков.Я не могу использовать хуки в определенных режимах (например, python-mode), так как почти все проекты написаны на python.Честно говоря, я попытался написать условное сохранение elisp, но не получилось.

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Очень простое решение - просто добавить переменную конфигурации, которая может использоваться для отключения хуков. Например:

(defvar tweak-tabs t)
(add-hook 'find-file-hook
          (lambda () (when tweak-tabs (untabify (point-min) (point-max)))))
(add-hook 'before-save-hook
          (lambda () (when tweak-tabs (tabify (point-min) (point-max)))))

Теперь вы можете добавить файл .dir-locals.el в соответствующие каталоги, установив tweak-tabs на nil, отключив эту функцию там.

(Но другая проблема в том, что это довольно плохой способ работы с вкладками. Например, после сохранения файла вы делаете видите вкладки в нем.)

0 голосов
/ 10 июня 2015

Просто для записи, чтобы ответить на буквальный вопрос в заголовке (как я дошел до этого вопроса с помощью веб-поиска): один из способов добавить хук, который зависит от расположения файла, - сделать его функцией, которая проверяет buffer-file-name.(Идея от этот ответ .)

Например, для точно такой же проблемы (включите вкладки только в определенном каталоге и оставьте вкладки отключенными в другом месте), в настоящее время я делаючто-то вроде (после установки пакета smart-tabs-mode с M-x package-install):

(smart-tabs-insinuate 'python) ; This screws up all Python files (inserts tabs)
(add-hook 'python-mode-hook    ; So we need to un-screw most of them
          (lambda ()
            (unless (and (stringp buffer-file-name)
                         (string-match "specialproject" buffer-file-name))
              (setq smart-tabs-mode nil)))
          t)                   ; Add this hook to end of the list

(Это немного инвертировано, так как smart-tabs-insinuate сам изменяет python-mode-hook, а затем мы модифицируем его обратно, но это следует сделать в качестве примера.)

...