【发布时间】:2026-01-01 08:40:01
【问题描述】:
是否有一个 emacs 命令可以打开描述当前主要模式的文件?动态编辑语法高亮和缩进会很有用。
【问题讨论】:
-
C-h m,但这并不完全符合您的要求。 -
您应该为个人定制创建自己的主要模式挂钩。不建议编辑 emacs 自带的 elisp 文件,因为升级 emacs 时所做的更改会丢失。
标签: emacs
是否有一个 emacs 命令可以打开描述当前主要模式的文件?动态编辑语法高亮和缩进会很有用。
【问题讨论】:
C-h m,但这并不完全符合您的要求。
标签: emacs
(find-library (file-name-sans-extension (symbol-file major-mode)))
将打开定义当前主模式的文件。这从字面上回答了你的问题。
但是,您不应“即时”编辑此文件。 Emacs 中的自定义不是通过直接编辑库源来进行的。而是在主要模式挂钩或eval-after-load 块中执行代码。
【讨论】:
M-: 是上面表达式 eval 的键绑定
lang-,否则整个事情都会被忽略。 :(
其他人可能会提供一些预定义的功能,这些功能完全符合您的要求,但我不知道有一个。您可以构建自己的,而不会太多麻烦。
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.")))))
【讨论】: