58

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

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

4

7 回答 7

43

有问题吗?

(defun buffer-mode (buffer-or-string)
  "Returns the major mode associated with a buffer."
  (with-current-buffer buffer-or-string
     major-mode))

with-current-buffer返回时将恢复您的缓冲区。

于 2010-02-10T16:45:01.633 回答
41

对于当前缓冲区:

(message "%s" major-mode)
于 2013-02-16T10:37:28.927 回答
34

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

(buffer-local-value 'major-mode (get-buffer "*scratch*"))
于 2012-07-15T00:49:10.283 回答
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))))

例如在 *scratch* 缓冲区中:

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

(buffer-mode "tasks.org") => 'org-mode
于 2014-03-17T16:52:43.393 回答
0

好吧,describe-mode 需要一个可选的缓冲区参数,但它会显示帮助......而且我不确定它返回什么......

但这是我在简短搜索中能找到的最好的……抱歉……

于 2010-02-10T16:42:10.547 回答
0

简单评价一下:

(print major-mode)
于 2018-09-09T20:05:25.623 回答
0

另一种方式,除了直接读取major-mode变量之外,还可以直接读取mode-name变量。

于 2019-11-28T16:02:41.213 回答