【问题标题】:kill-word / forward-word should stop at newlinekill-word / forward-word 应该在换行处停止
【发布时间】:2012-12-15 21:32:17
【问题描述】:

我觉得 kill-word 和 forward-word 将换行符视为空格和例如杀死下一行单词末尾的所有内容。我希望它停在行尾。

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

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

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

有没有办法全局实现这个效果?

【问题讨论】:

    标签: emacs


    【解决方案1】:

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

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

    如果您真的想要为 M-dM-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)
    

    【讨论】:

    • 谢谢!这样可行。我还没有弄清楚对我来说最有效的代码/文本导航方式是什么,但这无疑提供了一个很好的起点。
    • 这很好,我适应了一个 bacwkard-will-word-stop-eol。如果我再次点击它,我只想删除换行符。基本上是反向杀词的行为,但在换行符上“一站式”
    【解决方案2】:

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

    【讨论】:

    • 我检查了 subword-mode 代码,它也是一个很好的信息来源。如果我决定使用更“复杂”的导航功能,我肯定会使用 subword 作为示例。
    【解决方案3】:

    我使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多