在文字即将添加到 buffer 之前进行过滤,剔除特定的内容(例如换行符)。
文字来源可以是:
- 键盘输入
- 粘贴
- 代码,比如
(insert "foo\nbar")
看过这几个拦截点,但都不行:
-
(command-execute CMD &optional RECORD-FLAG KEYS SPECIAL)
只提供将要执行的 CMD(函数名),并不知道即将添加的内容。假如我想过滤换行符,不可能把 newline
,newline-and-indent
,electric-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
效果是一样的,要等到内容添加之后,再过滤,这就是我不满意的地方。