当前位置:  开发笔记 > 开发工具 > 正文

emacs:是pre-save-hook一个局部变量?

如何解决《emacs:是pre-save-hook一个局部变量?》经验,为你挑选了2个好方法。

我怎么知道这个?

我添加delete-trailing-whitespace到了before-save-hook我的内容中c-mode-common-hook,但看起来delete-trailing-whitespace每个文件都被调用,而不仅仅是使用c-mode和衍生文件的缓冲区.

我可以将before-save-hook缓冲区设为本地吗?



1> Emerick Rogu..:

write-contents-functions改为添加:

(add-hook 'c-mode-common-hook
  (lambda()
    (add-hook 'write-contents-functions
      (lambda()
        (save-excursion
          (delete-trailing-whitespace)))
      nil t)))

正如Emacs Lisp参考手册所述:

这与写文件函数一样,但它适用于与缓冲区内容有关的钩子,而不是特定的访问文件或其位置.这种钩子通常由主要模式设置,作为此变量的缓冲区本地绑定.无论何时设置,该变量都会自动变为缓冲区本地; 切换到新的主模式始终会重置此变量,但调用set-visited-file-name则不会.

这在Emacs 24.2.1中适用于我(即,它从C文件中删除所有尾随空格,但保留所有其他文件类型中的尾随空格).



2> algal..:

不,变量before-save-hook本身不是缓冲区.变量的文档并没有说它是本地的缓冲区,或者说它在设置时会自动变为缓冲区本地.

如果要为其添加缓冲区本地挂钩,正确的方法是使用标准add-hook函数的可选LOCAL参数:

(add-hook 'before-save-hook 'foo nil t)

add-hook文档说:

可选的第四个参数LOCAL,如果是非nil,则表示修改hook的缓冲区本地值而不是其全局值.这使得hook buffer-local,并使它成为缓冲区本地值的ta成员.它充当一个标志来运行全局值的钩子函数以及本地值.

local-write-file-hooks我相信,选择添加它的答案是错误的.如果你查看该函数的文档,在emacs 24.3上,它说该变量从22.1开始已经过时了,你应该使用write-file-functions.如果您查找文档write-file-functions,它会描述更复杂的行为,并在最后说"要在保存缓冲区之前执行各种检查或更新,请使用`before-save-hook'".

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有