emacs init中没有加载modify-syntax-entry?

时间:2017-01-16 16:47:26

标签: emacs

由于我不希望下划线char _打破一个单词,我把脚本放了:

(modify-syntax-entry ?_ "w")
在Emacs init文件中。目的是对于像test_test这样的单词,要双击该单词,将在_之前和之后选择整个单词。

但由于某种原因,脚本无法在初始化中工作。 如果我跑

M-x eval-buffer

然后它将开始有效。这是为什么?

顺便说一下,init中的所有其他设置都运行良好,只有modify-syntax-entry需要在首次启动后进行额外评估。

3 个答案:

答案 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

但是,无论模式如何,您似乎都希望对 所有 缓冲区进行此更改。是对的吗?这可能是一个错误。

你应该做的是:

  1. 决定以这种方式修改哪些模式
  2. 对于这些模式,将modify-syntax-entry的调用放入您添加到每种模式的模式挂钩的函数中(使用add-hook)。
  3. 例如,要修改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传统上定义为单词。优点是它保持了内部使用的单词的正常定义,因此理论上它应该比你的方法更少的代码。