4

建立在让 Emacs 在保存某些文件类型(并且只有那些文件类型)时取消制表符的基础上,我想在我开始修改缓冲区时运行一个挂钩来取消我的 C++ 文件的制表符。我尝试添加钩子以在加载时取消缓冲,但随后它取消了我所有在 emacs 启动时自动加载的可写文件。

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

4

4 回答 4

4

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

也许沿着这条线(警告:代码未测试):

(add-hook 'before-change-functions 
          (lambda (&rest args) 
            (if (not (buffer-modified-p))
                (untabify (point-min) (point-max)))))
于 2008-12-11T18:41:43.200 回答
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)
于 2008-12-11T18:36:03.337 回答
0

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

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

于 2008-12-11T18:58:42.900 回答
0

还有一个不同的切线答案。

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

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

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

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

于 2008-12-11T19:12:22.700 回答