13

我试图让下划线被视为此处此处forward/backward-word描述的函数的单词的一部分。我特别想让它在模式下工作,但真的希望它在所有模式下都能像这样工作。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)

我错过了什么?

4

4 回答 4

20

你试过nxhtml-mode-hook直接修改吗?像这样:

(add-hook 'nxhtml-mode-hook
          (lambda () (modify-syntax-entry ?_ "w")))
于 2012-05-19T14:52:13.007 回答
6

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

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

于 2012-05-19T15:05:51.577 回答
4

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

于 2012-05-20T02:18:08.550 回答
3

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

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

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

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

于 2016-04-29T18:39:53.130 回答