我正在尝试将下划线视为forward/backward-word
函数的一部分,如here和here所述。我特意试图让这个适用于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)
我错过了什么?
答案 0 :(得分:19)
您是否尝试过直接修改nxhtml-mode-hook
?像这样:
(add-hook 'nxhtml-mode-hook
(lambda () (modify-syntax-entry ?_ "w")))
答案 1 :(得分:6)
Trey回答了你非常具体的问题。
但是Emacs已经拥有了一个符合你要求的角色组织:sexp。如果您学习了sexp命令而不是打破单词命令,那么您可以根据情况适合删除“word”或“symbol”。
答案 2 :(得分:4)
作为event_jr,我建议您学习使用基于sexp的命令,例如C-M-f
和C-M-b
。但是如果你真的只想跳过标识符(并忽略括号之类的东西),那么不要试图改变所有主要模式中的所有语法表(最终可能会产生无法预料的后果),我建议你只使用新的基于符号的方法。运动命令。
例如。 (global-set-key [remap forward-word] 'forward-symbol)
。对于某些命令(如kill-word
),您需要自己编写kill-symbol
,但这应该很容易。
答案 3 :(得分:3)
如Trey Jackson所建议的那样,您可以修改标准语法表,而不是为每个主要模式添加挂钩。不同的模式继承自标准语法表,因此您的修改有望适用于所有模式:
(modify-syntax-entry ?_ "w" (standard-syntax-table))
这将影响常规文本,XML,Python等。
某些模式更顽固,修改标准语法表不会影响它们,因为它们会在初始化期间覆盖某些符号。一个例子是cc-mode
。你仍然必须明确地修改他们的表。