修改缓冲区时如何运行Emacs钩子?

时间:2008-12-11 17:41:24

标签: emacs tabs elisp buffer

Getting Emacs to untabify when saving certain file types (and only those file types)上构建时,我想在开始修改缓冲区时运行一个钩子来解压缩我的C ++文件。我尝试添加钩子来加载缓冲区,但是当emacs启动时它会自动加载我自动加载的所有可写文件。

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

4 个答案:

答案 0 :(得分:4)

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

也许是这一行(警告:代码未经测试):

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

答案 1 :(得分: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)

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

一个不同的,相反的答案。

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

如果标签宽度为4,则此正则表达式将匹配一行超过132个字符的行。(我认为我的数学正确)

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

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