代码之家  ›  专栏  ›  技术社区  ›  Cheeso

emacs:save hook之前是一个局部变量吗?

  •  10
  • Cheeso  · 技术社区  · 14 年前

    我该怎么想?

    我补充说 delete-trailing-whitespace before-save-hook 在我的 c-mode-common-hook ,但看起来 删除尾随空白 为每个文件调用,而不仅仅是使用c模式和派生的缓冲区。

    我能做这个吗 保存挂钩前 本地缓冲区?

    5 回复  |  直到 14 年前
        1
  •  20
  •   Stefan    9 年前

    将其添加到 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不会。

    这在Emacs24.2.1中对我来说是正确的(即,它从C文件中删除所有尾随空白,但在所有其他文件类型中保留尾随空白)。

        2
  •  16
  •   algal    11 年前

    不,变量 before-save-hook 不是自然的本地缓冲区。变量的文档并没有说它是缓冲区本地的,也没有说它在设置时会自动变成缓冲区本地的。

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

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

    add hook文档说明:

    可选的第四个参数local(如果不是nil)表示要修改 钩子的缓冲区局部值而不是全局值。 这使得钩子缓冲区成为本地的,并且它使t成为 缓冲区本地值。作为一个旗子来运行钩子 全局值和局部值的函数。

    要将其添加到的选定答案 local-write-file-hooks 我相信是错的。如果您查看emacs 24.3上该函数的文档,就会发现该变量从22.1开始就过时了,您应该使用 write-file-functions . 如果你查阅 写入文件函数 ,它描述了更复杂的行为,最后说“要在保存缓冲区之前执行各种检查或更新,请使用‘before save hook’”。

        3
  •  3
  •   rgiar    14 年前

    以前从未想过要这么做,但这应该管用:

    (set (make-local-variable 'before-save-hook) '((lambda() (rg-msg "foobie")))) 
    

    一般情况下,c-h v会提示输入变量名并显示一个说明,告诉您变量是否为缓冲区本地变量。

    在save hook是定义的变量之前 在“files.el”中。它的价值是零

    这个变量有潜在的风险 当用作文件局部变量时。

    文档:运行的普通钩子 在缓冲区保存到其文件之前。

    您可以自定义此变量。

    VS

    下一个错误函数是变量 在“simple.el”中定义。它的价值在于 零

    自动成为本地缓冲区 以任何方式设置时。这个 当 用作文件局部变量。

    文档:用于查找的函数 当前缓冲区中的下一个错误。 函数用2调用 参数:

    […]

        4
  •  0
  •   Joe Casadonte    14 年前

    使用 write-contents-function 而是:

    write-contents-functions is a variable defined in `files.el'.
    Its value is nil
    
      Automatically becomes buffer-local when set in any fashion.
    
    Documentation:
    List of functions to be called before writing out a buffer to a file.
    If one of them returns non-nil, the file is considered already written
    and the rest are not called and neither are the functions in
    `write-file-functions'.
    
    This variable is meant to be used for hooks that pertain to the
    buffer's contents, not to the particular visited file; thus,
    `set-visited-file-name' does not clear this variable; but changing the
    major mode does clear it.
    
    For hooks that _do_ pertain to the particular visited file, use
    `write-file-functions'.  Both this variable and
    `write-file-functions' relate to how a buffer is saved to file.
    To perform various checks or updates before the buffer is saved,
    use `before-save-hook'.
    

    您应该创建一个包装器来调用 delete-trailing-whitespace 因为你想确保你回来 nil 从包装器,以便进行进一步的处理(并最终保存)。

        5
  •  0
  •   cjohansson    6 年前

    是的,创建一个 .dir-locals.el 项目根目录中包含以下内容的文件:

    ((c-mode . ((before-save-hook . (lambda() (delete-trailing-whitespace)) )) ))
    

    这只会将此钩子添加到 c-mode 此目录下的缓冲区。

    但是,如果您只需要一个特定的文件而不是整个目录,那么应该可以使用文件局部变量将其添加到文件顶部:

    -*- eval: (setq before-save-hook (lambda() (delete-trailing-whitespace))); -*-
    

    或者像这样的文件底部:

    ;;; Local Variables: ***
    ;;; eval: (setq before-save-hook (lambda() (delete-trailing-whitespace))) ***
    ;;; End: ***