cc模式的保存前挂钩


13

我想自定义cc-mode以在保存之前执行功能。一种解决方案是修改键cc-mode映射以绑定C-x C-s到执行我需要的工作的函数,然后将其保存。

我的问题是我是否可以为此定制钩子?该CC钩文档不提一个before-save-hook专门为cc-mode。应该如何通过钩子完成?

另外,我该怎么做defadvice呢?通过阅读手册,我唯一能看到的方法是在保存之前启用建议,然后在工作完成后将其禁用。这听起来很麻烦。使用advices 的惯用方式是什么?


3
您添加到的功能before-save-hook可以检查当前的主模式(例如(eq major-mode ...)),如果它与您自定义的模式不匹配,则不执行任何操作。
君士坦丁

@康斯坦丁同意。我想检查一下这种事情是否还有“内置”功能。IIRC haskell-mode至少有一个after/before-save挂钩,我认为这是编模式的标准做法。
Pradhan 2014年

@康斯坦丁:您能将您的评论转换为答案吗(当然要扩大一点)?
Dan

1
有关使用示例;请参见此线程after-save-hook。您可以使用相同的过程,但可以替代before-save-hook

Answers:


12

将挂钩的动作限制为特定的主要模式的一种相当普遍的方法是检查的值major-mode

例如,此钩子在使用c++-mode以下命令保存缓冲区之前会打印一条消息:

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

附带说明:有时检查主要模式是否源自CC模式可能很有用;我们可以通过检查是否c-buffer-is-cc-mode不是来做到这一点nil

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

或者,使用本地钩子:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

这会将每个C ++模式缓冲区的本地缓冲区添加MY-HOOK-FUNC到C ++模式派生的任何缓冲区中。 before-save-hook

我发现进行显式检查会更优雅,major-mode它的优点是您可以在不影响任何其他缓冲区的情况下为每个缓冲区禁用before-save-hook 本地M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)


-1

我曾经需要类似的东西来在保存时自动编译elisp文件,我使用了类似的方法(将方法转换为cc模式):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
首先,你的意思是c-mode-common-hook?其次,它似乎会在before-save-hook您第一次输入C相关语言时将函数添加到其中,但是随后该函数将在每个缓冲区的每次保存之前被调用。OP需要做的是在特定模式的缓冲区中运行条件函数(有关方法,请参见@Constantine的注释)。
Dan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.