emacs lisp,如何获得缓冲区主模式?

Any*_*orn 54 emacs elisp major-mode

我试图搜索谷歌并查看手册,但仍然无法找到如何获得缓冲对象的主要模式.你能帮我一个例子或参考吗?谢谢

我能找到的唯一解决方案是在更改缓冲区然后更改回原始缓冲区后查询主模式.有没有更好的方法呢?

Aid*_*lly 40

这有问题吗?

(defun buffer-mode (buffer-or-string)
  "Returns the major mode associated with a buffer."
  (with-current-buffer buffer-or-string
     major-mode))
Run Code Online (Sandbox Code Playgroud)

with-current-buffer 将在返回时恢复缓冲区.

  • 您也可以使用`(with-current-buffer buffer-or-string major-mode)`而不是`save-excursion`来执行此操作. (12认同)
  • @haxney:使用`(save-excursion(set-buffer ..)...)确实不赞成`(with-current-buffer ...)`.Emacs-24的字节编译器警告这种用法. (2认同)

Ado*_*obe 40

对于当前缓冲区:

(message "%s" major-mode)
Run Code Online (Sandbox Code Playgroud)

  • 感谢Adobe,现在请将PS移植到Linux :) (2认同)

Jer*_*ier 30

一个简单的方法是使用该buffer-local-value函数,因为它major-mode是一个缓冲局部变量:

(buffer-local-value 'major-mode (get-buffer "*scratch*"))
Run Code Online (Sandbox Code Playgroud)


Bri*_*rns 7

只是从以前的答案扩展 - 调用没有参数来获取当前缓冲区的模式:

(defun buffer-mode (&optional buffer-or-name)
  "Returns the major mode associated with a buffer.
If buffer-or-name is nil return current buffer's mode."
  (buffer-local-value 'major-mode
   (if buffer-or-name (get-buffer buffer-or-name) (current-buffer))))
Run Code Online (Sandbox Code Playgroud)

例如*scratch*buffer:

(buffer-mode) => 'lisp-interaction-mode

(buffer-mode "tasks.org") => 'org-mode
Run Code Online (Sandbox Code Playgroud)