【问题标题】:How do I run an Emacs hook when a buffer is modified?修改缓冲区时如何运行 Emacs 挂钩?
【发布时间】:2010-09-26 11:46:31
【问题描述】:

Getting Emacs to untabify when saving certain file types (and only those file types) 的基础上,我想在开始修改缓冲区时运行一个挂钩来取消我的 C++ 文件的标签。我尝试添加钩子以在加载时取消缓冲,但随后它取消了我所有在 emacs 启动时自动加载的可写文件。

(对于那些想知道我为什么这样做的人,这是因为我工作的地方强制在文件中使用制表符,我很乐意遵守。问题是我标记了我的文件以告诉我什么时候行太长,但正则表达式匹配行中的字符数,而不是行占用的空间。一行中的 4 个制表符可以将它推到我的 132 个字符限制之外,但该行不会被正确标记. 因此,我需要一种自动制表和取消制表的方法。)

【问题讨论】:

  • 似乎更好的正则表达式可以解决您的问题。

标签: emacs tabs elisp buffer


【解决方案1】:

这是我添加到我的 emacs 文件以在加载时取消制表符的内容:

(defun untabify-buffer ()
  "Untabify current buffer"
  (interactive)
  (untabify (point-min) (point-max)))

(defun untabify-hook ()
  (untabify-buffer))

; Add the untabify hook to any modes you want untabified on load
(add-hook 'nxml-mode-hook 'untabify-hook)

【讨论】:

  • 就像我在问题中所说的那样,我不想要这样的东西,因为我经常在 emacs 启动时加载几十个文件,即使我不需要它也会通过并取消它们他们是。当我关闭 emacs 时,所有缓冲区都是脏的,我需要保存它们。不过,谢谢。
【解决方案2】:

看看变量“before-change-functions”。

也许是这样的(警告:代码未测试):

(add-hook 'before-change-functions 
          (lambda (&rest args) 
            (if (not (buffer-modified-p))
                (untabify (point-min) (point-max)))))

【讨论】:

    【解决方案3】:

    这个答案是切题的,但可能有用。

    wide-column.el link text 包会在光标经过给定列时更改光标颜色 - 实际上光标颜色可能因设置而异。与您的正则表达式代码相比,这听起来像一个侵入性较小的解决方案,但它可能不适合您的需求。

    【讨论】:

    • 谢谢,这是一个有趣的解决方案。我想我更喜欢标记文件的面,这样我就可以看到行何时很长,而不必定位我的光标。不过,这还是很整洁的。我可以用它来做其他事情。 :)
    【解决方案4】:

    还有一个不同的、切题的答案。

    您提到您的正则表达式不足以判断何时达到 132 个字符的限制。也许是一个更好的正则表达式...

    假设标签宽度为 4,此正则表达式将匹配超过 132 个字符的行。(我想我的数学是正确的)

    "^\\(?: \\|[^   \n]\\{4\\}\\)\\{33\\}\\(.+\\)$"
    

    最后一个带括号的表达式是超出限制的字符集。第一个带括号的表达式是shy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多