如何根据文件位置运行hook

Mic*_*ich 5 emacs elisp

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

\main_folder
    \project1
    \project2
    \project3
...etc
Run Code Online (Sandbox Code Playgroud)

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

 ;; 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)
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*lay 3

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

(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)))))
Run Code Online (Sandbox Code Playgroud)

.dir-locals.el现在您可以在相关目录中添加一个文件,设置tweak-tabsnil,在那里禁用此功能。

(但另一个问题是,这是处理选项卡的一种非常糟糕的方法。例如,保存文件后,您确实会看到其中的选项卡。)