3

我发现 kill-word 和 forward-word 将换行符视为空格并例如杀死直到下一行单词末尾的所有内容,这很烦人。我希望它停在行尾。

我尝试修改语法表以将换行符包含到单词定义中,如下所示:

(修改语法条目?\n“w”)

这会产生预期的效果,但需要为每个语法表单独指定。

有没有办法在全球范围内实现这种效果?

4

3 回答 3

3

好吧,首先,我强烈建议您习惯在大多数情况下将换行符视为空格的想法。Emacs 通常会始终如一地做到这一点,试图逆势而上可能是一场永无止境的战斗。

其次,我同意 Stefan 的回答,即弄乱语法表或重新定义forward-word自己,只会给您带来麻烦和悲伤。

如果您真的想要您所描述的行为M-dM-f那么最好定义一组具有这种所需行为的新函数,并且您可以将M-dandM-f键绑定到这些函数。

实际上,这将是更改任何 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)
于 2012-12-17T03:25:27.253 回答
1

改变?\n字符的语法会让你在各种模式下很快陷入困境。相反,您希望更改forward-word交互调用时的行为方式(请注意,更改函数的行为forward-word也会导致麻烦,因为它经常用于缩进代码之类的事情)。您可能想看看如何subword-mode工作,以了解如何做到这一点。

于 2012-12-16T23:07:37.933 回答
0

我曾经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))
于 2017-02-09T21:49:23.900 回答