如何对即将添加到 buffer 的内容进行过滤?

在文字即将添加到 buffer 之前进行过滤,剔除特定的内容(例如换行符)。

文字来源可以是:

  • 键盘输入
  • 粘贴
  • 代码,比如 (insert "foo\nbar")

看过这几个拦截点,但都不行:

  • (command-execute CMD &optional RECORD-FLAG KEYS SPECIAL) 只提供将要执行的 CMD(函数名),并不知道即将添加的内容。假如我想过滤换行符,不可能把 newlinenewline-and-indentelectric-newline-and-maybe-indent…各种函数都考虑到吧

  • before-change-functions 只提供更改之前的 beg 和 end 位置,也不知道即将添加的内容

上边的说法不完全正确。

before-change-functions 在粘贴的时侯可以通过 (buffer-substring BEG END) 获取到添加的内容。

但是 open-line 或类似操作的时侯,beg 等于 end,仍然不知道 buffer 将要发生什么变化。

粘贴和elisp应该都能比较clean的解决 在函数外套个filter应该就行了

键盘输入比较麻烦 考虑advice/hook self-insert-command?

想找到一个统一的入口,避免去 advice/hook 各种操作,并且不知道未来会有哪些操作。

可以试试先把内容添加进来,而后再用一个命令分门别类地处理各种各样的内容。

以后如果找到了能直接拦截的方法,这个命令也是能继续发挥作用的。

post-command-hook编辑已经添加进来的内容?:

after-change-functions 效果是一样的,要等到内容添加之后,再过滤,这就是我不满意的地方。