【问题标题】:Underscore as part of word for forward-word not working下划线作为词的一部分,表示前向词不起作用
【发布时间】:2012-05-26 19:51:56
【问题描述】:

我试图将下划线视为forward/backward-word 函数的一部分,如herehere 所述。我特别想让它在nxhtml 模式下工作,但我真的希望它在所有模式下都能像这样工作。

我已通过多种不同方式修改了我的site-start.el 文件,但均无济于事。但是如果我在缓冲区中手动执行命令M-x modify-syntax-table,它就可以正常工作。我只是无法将其作为默认行为。

这是我尝试放入 site-start.el 文件的内容:

;; 1
;; thought  this would apply it to all modes - no error, but did not work
(modify-syntax-entry ?_ "w") 

;; 2
;; thought this would automatically set it on a mode change - no error, but did not work
(defun change-major-mode-hook ()
(modify-syntax-entry ?_ "w"))


;; 3
;; thought  this would apply it to all modes - no error, but did not work
(modify-syntax-entry ?_ "w")

;; 4
;; this produced a symbol's value as variable is void error
(modify-syntax-entry ?_ "w" nxhtml-mode-syntax-table)

我错过了什么?

【问题讨论】:

  • modify-syntax-entry 的文档字符串说“仅针对表 SYNTAX-TABLE 更改了语法,默认为当前缓冲区的语法表”。没有什么建议您可以通过省略该参数来全局更改所有语法表。

标签: emacs emacs23 nxhtml


【解决方案1】:

您可以修改标准语法表,而不是像 Trey Jackson 建议的那样为每个主要模式添加挂钩。不同的模式继承自标准语法表,因此您的修改有望适用于所有模式:

(modify-syntax-entry ?_ "w" (standard-syntax-table))

这将影响常规文本、XML、Python 等。

有些模式比较顽固,修改标准语法表不会影响它们,因为它们在初始化期间会覆盖一些符号。一个例子是cc-mode。您仍然需要明确修改他们的表。

【讨论】:

    【解决方案2】:

    作为 event_jr,我建议您学习使用基于 sexp 的命令,例如 C-M-fC-M-b。但是,如果您真的只想跳过标识符(并忽略括号之类的内容),那么与其尝试更改所有主要模式下的所有语法表(这可能最终会产生无法预料的后果),我建议您只需使用新的基于符号的运动命令。 例如。 (global-set-key [remap forward-word] 'forward-symbol)。对于某些命令(如kill-word),您需要自己编写kill-symbol,但这应该很容易做到。

    【讨论】:

      【解决方案3】:

      Trey 回答了您非常具体的问题。

      但是 Emacs 已经有一个级别的字符组织可以满足您的要求:sexp。如果你学会了 sexp 命令而不是 break word 命令,那么你可以根据情况通过“word”或“symbol”删除。

      【讨论】:

      • 当使用带下划线的变量名时,我真的很想把下划线当作单词的一部分。基于符号的动作与我习惯的完全不同。
      • 我发现将下划线视为一个单独的词非常不方便。我什至不记得我什么时候真正需要移动到半个单词foo_bar(顺便说一句,目前我真的有很多这样的单词)。但反过来说:每次我在移动,或者试图对 Emacs's Evil 中的文本对象做某事时,我都会说这样的话——这件事只会干扰我的编辑并减慢我的速度。
      【解决方案4】:

      您是否尝试过直接修改nxhtml-mode-hook?像这样:

      (add-hook 'nxhtml-mode-hook
                (lambda () (modify-syntax-entry ?_ "w")))
      

      【讨论】:

      • 谢谢 - 这正是我想要的。我补充说:(add-hook 'php-mode-hook (lambda () (modify-syntax-entry ?_ "w")))
      • 我想请人澄清一下:这适用于所有 Emacs 模式,还是仅适用于 nxhtml-mode? (我猜是后者,但请澄清)
      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2017-01-10
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2019-02-01
      相关资源
      最近更新 更多