修改语法条目未加载到emacs init中?

修改语法条目未加载到emacs init中?,emacs,Emacs,由于我不希望下划线char\uuu打断一个单词,因此我将脚本放在: (modify-syntax-entry ?_ "w") 在Emacs init文件中。其目的是,对于像test\u test这样的单词,双击该单词将选择\u前后的整个单词 但由于某些原因,脚本在初始化时无法工作。 如果我跑 然后它就会开始生效。为什么呢 顺便说一句,init中的所有其他设置都运行良好,只有修改语法条目在初始启动后需要额外评估。每个缓冲区都有自己的语法表,这通常取决于缓冲区的主要模式。在Emacs init文件

由于我不希望下划线char
\uuu
打断一个单词,因此我将脚本放在:

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

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

然后它就会开始生效。为什么呢


顺便说一句,init中的所有其他设置都运行良好,只有
修改语法条目
在初始启动后需要额外评估。

每个缓冲区都有自己的语法表,这通常取决于缓冲区的主要模式。在Emacs init文件中运行代码时,它只是修改加载文件时使用的临时缓冲区的语法表,而不是常规缓冲区

大多数语法表继承自标准语法表,因此您可以通过为
modify syntax entry
提供另一个参数来更改该表:

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

每个缓冲区都有自己的语法表,这通常取决于缓冲区的主要模式。在Emacs init文件中运行代码时,它只是修改加载文件时使用的临时缓冲区的语法表,而不是常规缓冲区

大多数语法表继承自标准语法表,因此您可以通过为
modify syntax entry
提供另一个参数来更改该表:

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

请参阅Elisp手册,节点。在这里,您将看到:

通常,每个主要模式都有自己的语法表,其中 它安装在所有使用该模式的缓冲区中。例如 变量
emacs lisp mode syntax table
保存 Emacs Lisp模式和
c-mode-syntax-table
保存使用的语法表 通过C模式。更改主模式的语法表会更改中的语法 所有该模式的缓冲区,以及随后放入的任何缓冲区 在那种模式下

您需要更改当前缓冲区的语法表(将 通常在相同模式下对所有缓冲区进行更改)

当前语法表,即当前缓冲区的语法表,由函数
语法表
返回。这就是您传递给
修改语法的内容:

;;修改当前语法表(不是“标准语法表”)。
(修改语法条目?u“w”(语法表))
函数
语法表
在Elisp手册节点中进行了说明

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

您可能应该做的是:

  • 确定要以这种方式修改的模式
  • 对于这些模式,将对
    modifysyntax entry
    的调用放入一个函数中,该函数添加到每个模式的模式挂钩中(使用
    addhook
  • 例如,要修改,例如,
    foo模式的语法

     (defun my-syntax () (modify-syntax-entry ?_ "w" (syntax-table)))
     (add-hook 'foo-mode-hook 'my-syntax)
    

    请参阅Elisp手册,节点。在这里,您将看到:

    通常,每个主要模式都有自己的语法表,其中 它安装在所有使用该模式的缓冲区中。例如 变量
    emacs lisp mode syntax table
    保存 Emacs Lisp模式和
    c-mode-syntax-table
    保存使用的语法表 通过C模式。更改主模式的语法表会更改中的语法 所有该模式的缓冲区,以及随后放入的任何缓冲区 在那种模式下

    您需要更改当前缓冲区的语法表(将 通常在相同模式下对所有缓冲区进行更改)

    当前语法表,即当前缓冲区的语法表,由函数
    语法表
    返回。这就是您传递给
    修改语法的内容:

    ;;修改当前语法表(不是“标准语法表”)。
    (修改语法条目?u“w”(语法表))
    
    函数
    语法表
    在Elisp手册节点中进行了说明

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

    您可能应该做的是:

  • 确定要以这种方式修改的模式
  • 对于这些模式,将对
    modifysyntax entry
    的调用放入一个函数中,该函数添加到每个模式的模式挂钩中(使用
    addhook
  • 例如,要修改,例如,
    foo模式的语法

     (defun my-syntax () (modify-syntax-entry ?_ "w" (syntax-table)))
     (add-hook 'foo-mode-hook 'my-syntax)
    

    一个横向解决方案:将有问题的代码行替换为

    (global-superword-mode 1)
    

    这将告诉Emacs,您喜欢您的“单词移动”实际操作标识符,而不是Emacs传统上定义的单词。优点是它保持了单词的正常定义供内部使用,因此理论上它应该比你的方法更少地破译代码。

    一个横向解决方案:用

    (global-superword-mode 1)
    

    这将告诉Emacs,您喜欢您的“单词移动”实际操作标识符,而不是Emacs传统上定义的单词。优点是它保持了单词的正常定义供内部使用,因此理论上它应该比您的方法更少地分解代码。

    每个缓冲区都有自己的语法表。emacs init文件以临时缓冲区作为当前缓冲区运行。Read Hi@Barmar,我已经阅读了emacswiki,但我仍然不知道如何破解它。你介意再解释一下吗?谢谢。emacs.stackexchange.com可能是获得帮助的更好地方。每个缓冲区都有自己的语法表。emacs init文件以临时缓冲区作为当前缓冲区运行。Read Hi@Barmar,我已经阅读了emacswiki,但我仍然不知道如何破解它。