【问题标题】:Edit current emacs major mode编辑当前 emacs 主模式
【发布时间】:2026-01-01 08:40:01
【问题描述】:

是否有一个 emacs 命令可以打开描述当前主要模式的文件?动态编辑语法高亮和缩进会很有用。

【问题讨论】:

  • C-h m,但这并不完全符合您的要求。
  • 您应该为个人定制创建自己的主要模式挂钩。不建议编辑 emacs 自带的 elisp 文件,因为升级 emacs 时所做的更改会丢失。

标签: emacs


【解决方案1】:
(find-library (file-name-sans-extension (symbol-file major-mode)))

将打开定义当前主模式的文件。这从字面上回答了你的问题。

但是,您不应“即时”编辑此文件。 Emacs 中的自定义不是通过直接编辑库源来进行的。而是在主要模式挂钩或eval-after-load 块中执行代码。

【讨论】:

  • M-: 是上面表达式 eval 的键绑定
  • @N.N.我完全同意,它们非常值得——只要确保也包含看起来毫无意义的lang-,否则整个事情都会被忽略。 :(
【解决方案2】:

其他人可能会提供一些预定义的功能,这些功能完全符合您的要求,但我不知道有一个。您可以构建自己的,而不会太多麻烦。

  • major-mode 绑定到定义当前主要模式的符号
  • (symbol-file major-mode) 然后将返回定义该符号的文件的路径

但是,它比这要复杂一些。很可能,您的大多数主要模式都是从字节编译的 elisp 文件加载的,因此您返回的路径将是您不想打开的 .elc 文件。您可以检测到这一点并删除最后一个字符,但您还需要处理 gzip 压缩文件。幸运的是,Emacs 可以透明地打开一个 gzip 文件,所以像下面这样的东西基本上应该可以工作。我输入它并在一两种模式下检查它,但基本上认为它未经测试。

(defun load-major-mode-file ()
  (interactive)
  (let* ((loaded-file (symbol-file major-mode))
         (root-el-file (if (string-match "\\.elc$" loaded-file) (substring loaded-file 0 -1) loaded-file)))
    (if (file-exists-p root-el-file) 
      (find-file root-el-file)
      (if (file-exists-p (concat root-el-file ".gz")) 
        (find-file (concat root-el-file ".gz"))
        (message "couldn't open major-mode file.")))))

【讨论】: