如何根据文件位置运行hook

时间:2011-06-16 07:56:06

标签: emacs elisp

我参与了使用选项卡的python项目,但是我没有在我编写的所有其他代码中使用它们,在特定项目中使用它们至关重要。项目位于特定目录下的一个目录中。即:

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

我打开文件中的几个函数/钩子并保存unabify并列出我正在处理的整个缓冲区。

 ;; My Functions
(defun untabify-buffer ()
            "Untabify current buffer"
        (interactive)
        (untabify (point-min) (point-max)))

(defun tabify-buffer ()
        "Tabify current buffer"
        (interactive)
        (tabify (point-min) (point-max)))

;; HOOKS
; untabify buffer on open
(add-hook 'find-file-hook 'untabify-buffer)
; tabify on save
(add-hook 'before-save-hook 'tabify-buffer)

如果我把它放在.emacs文件中,它会在我打开的每个.py文件上运行,这不是我想要的。我想要的是将这些钩子仅用于具有相应子文件夹的一个特定文件夹中。尝试.dir_locals,但它只适用于不挂钩的属性。我不能在特定模式(即python-mode)中使用钩子,因为几乎所有项目都是用python编写的。说实话,我尝试编写elisp条件保存但失败了。

2 个答案:

答案 0 :(得分:2)

一个非常简单的解决方案是只添加一个可用于禁用挂钩的配置变量。例如:

(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,然后在此处停用此功能。

(但另一个问题是这是处理标签的一种非常糟糕的方式。例如,在您保存文件后执行查看其中的标签。)

答案 1 :(得分:0)

仅仅是为了记录,回答标题中的文字问题(当我通过网络搜索到达这个问题时):添加依赖于文件位置的钩子的一种方法是使其成为检查{{的{{ 1}}。 (来自this answer的想法。)

例如,对于完全相同的问题(仅在特定目录中启用选项卡,并在其他位置关闭选项卡),我目前正在执行类似的操作(在使用{{安装包buffer-file-name之后) 1}}):

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 ,然后我们会修改它,但它应该作为一个例子。)