add-hook的写法


#1

我想实现保存文件前,进行括号匹配检查check-parens,有如下几种写法:

1、(add-hook 'write-file-functions (lambda () (check-parens)))

2、(add-hook 'write-file-functions 'check-parens)

3、(add-hook 'emacs-lisp-mode-hook

  (lambda ()
    (add-hook 'write-file-functions 'check-parens)))

第一种写法有效、能实现我需要的效果;

第二种写法不行、没有效果,请教这是啥原因?

将第二种写法,再加一层add-hook即用第三种写法,这时又能达到第一种写法的效果。 请大神指导指导这是何缘故。


#2

To perform various checks or updates before the buffer is saved, use ‘before-save-hook’.

你用错 hook 了,write-file-functions 的 doc string 有如下。

This hook is not run if any of the functions in ‘write-contents-functions’ returns non-nil. Both hooks pertain to how to save a buffer to file, for instance, choosing a suitable coding system and setting mode bits. (See Info node ‘(elisp)Saving Buffers’.)

另外,标准的写法是第 2 种。写第一种的要被打,写第三种的要被打死。


#4

谢谢您的指导!不过并没有消除我的疑问:第二种写法为什么不行。


#5

估计你没控制变量,比如排除其他配置,或者是得出测试结论的方法有问题。在我这里第二种写法是起作用的。如果括号没配平是会提示

Unmatched bracket or quote

#6

谢谢!按照您的指示我自己查查。谢谢谢谢


#7

另外去找资料学习下如何控制变量


#8

那我推荐《控制论与科学方法论》,别看名字很专业其实是专门写的科普向的书


#9

谢谢推荐!您有心啦


#10

您说的“控制变量”,请问是不是指本地变量与全局变量的控制啊


#11

不,我其实指的是那个科学实验的方法。当然在这个特点场景其实是一回事。


#12

完了,经常写第一种⋯⋯


#13

https://www.emacswiki.org/emacs/DebuggingParentheses

(add-hook 'emacs-lisp-mode-hook

  (lambda ()

    (add-hook 'local-write-file-hooks  'check-parens)))

上面的我改写成如下两种,都没有效果,请教这是啥原因:

(add-hook 'local-write-file-hooks (lambda () (check-parens)))

(add-hook 'local-write-file-hooks 'check-parens)


#14

最终经仔细测试,原来第二种写法在我这里也是有效的。之前可能弄错了