由于我不希望下划线char _
打破一个单词,我把脚本放了:
(modify-syntax-entry ?_ "w")
在Emacs init文件中。目的是对于像test_test
这样的单词,要双击该单词,将在_
之前和之后选择整个单词。
但由于某种原因,脚本无法在初始化中工作。 如果我跑
M-x eval-buffer
然后它将开始有效。这是为什么?
顺便说一下,init中的所有其他设置都运行良好,只有modify-syntax-entry
需要在首次启动后进行额外评估。
答案 0 :(得分:2)
请参阅Elisp手册,节点Syntax Basics。你会看到这个:
通常,每个主要模式都有自己的语法表,其中 它安装在使用该模式的所有缓冲区中。例如, 变量
emacs-lisp-mode-syntax-table
包含使用的语法表 Emacs Lisp模式,c-mode-syntax-table
保存使用的语法表 按C模式。更改主模式的语法表会改变语法 所有模式的缓冲区,以及随后放入的任何缓冲区 在那种模式下。
您需要更改当前缓冲区的语法表(这将是 通常以相同模式对所有缓冲区进行更改。)
当前语法表,即当前缓冲区的语法表,由函数 syntax-table
返回。这就是你传递给modify-syntax
:
;; Modify the CURRENT syntax table (not `standard-syntax-table').
(modify-syntax-entry ?_ "w" (syntax-table))
功能syntax-table
在Elisp手册中描述,节点Syntax Table Functions。
但是,无论模式如何,您似乎都希望对 所有 缓冲区进行此更改。是对的吗?这可能是一个错误。
你应该做的是:
modify-syntax-entry
的调用放入您添加到每种模式的模式挂钩的函数中(使用add-hook
)。例如,要修改foo-mode
:
(defun my-syntax () (modify-syntax-entry ?_ "w" (syntax-table)))
(add-hook 'foo-mode-hook 'my-syntax)
答案 1 :(得分:1)
每个缓冲区都有自己的语法表,通常取决于缓冲区的主要模式。当您在Emacs init文件中运行代码时,它只是修改加载文件时使用的临时缓冲区的语法表,而不是常规缓冲区。
大多数语法表都继承自标准语法表,因此您可以通过向modify-syntax-entry
提供另一个参数来对该表进行更改:
(modify-syntax-entry ?_ "w" (standard-syntax-table))
答案 2 :(得分:1)
横向解决方案:用
替换有问题的代码行(global-superword-mode 1)
这将告诉Emacs你喜欢你的“单词移动”来实际操作标识符而不是Emacs传统上定义为单词。优点是它保持了内部使用的单词的正常定义,因此理论上它应该比你的方法更少的代码。