【发布时间】:2012-12-15 21:32:17
【问题描述】:
我觉得 kill-word 和 forward-word 将换行符视为空格和例如杀死下一行单词末尾的所有内容。我希望它停在行尾。
我尝试修改语法表以将换行符包含在单词定义中,如下所示:
(修改语法条目?\n“w”)
这会产生预期的效果,但需要为每个语法表单独指定。
有没有办法全局实现这个效果?
【问题讨论】:
标签: emacs
我觉得 kill-word 和 forward-word 将换行符视为空格和例如杀死下一行单词末尾的所有内容。我希望它停在行尾。
我尝试修改语法表以将换行符包含在单词定义中,如下所示:
(修改语法条目?\n“w”)
这会产生预期的效果,但需要为每个语法表单独指定。
有没有办法全局实现这个效果?
【问题讨论】:
标签: emacs
嗯,首先,我强烈建议您习惯在大多数情况下将换行符视为空格的想法。 Emacs 通常会始终如一地做到这一点,试图逆势而上可能是一场永无止境的战斗。
其次,我同意 Stefan 给出的答案,即弄乱语法表或重新定义 forward-word 本身只会给您带来麻烦和悲伤。
如果您真的想要为 M-d 和 M-f 描述的行为,那么最好定义一组具有这种所需行为的新函数,并且您可以将 M-d 和 @ 绑定到它们987654325@键。
确实,这将是更改任何 emacs 中某些核心功能的默认行为的传统方式。
也许是这样的? (几乎没有测试过)
(defun forward-word-stop-eol (arg)
(interactive "p")
(let ((start (point)))
(save-restriction
(save-excursion
(move-end-of-line 1)
(narrow-to-region start (point)))
(forward-word arg))))
(defun kill-to-end-of-word-or-line (arg)
(interactive "p")
(kill-region (point) (progn (forward-word-stop-eol arg) (point))))
(global-set-key "\ef" forward-word-stop-eol)
(global-set-key "\ek" kill-to-end-of-word-or-line)
【讨论】:
更改?\n 字符的语法会让你在各种模式下很快陷入困境。相反,您希望更改 forward-word 这样的东西在交互调用时的行为方式(请注意,更改函数 forward-word 的行为也会导致麻烦,因为它经常用于缩进代码之类的东西)。您可能想看看 subword-mode 的工作原理,以了解如何做到这一点。
【讨论】:
我使用with-syntax-table 临时(和全局)修改语法表。
例如,我将它与syntax-subword 模式一起使用:
(defadvice syntax-subword-forward (around testing activate)
(with-syntax-table (copy-syntax-table (syntax-table))
(modify-syntax-entry ?\n ">")
ad-do-it))
【讨论】: