【发布时间】:2011-01-15 08:32:20
【问题描述】:
我已经尝试搜索谷歌并查看手册,但仍然找不到如何获取缓冲区对象的主要模式。你能帮我举个例子或参考吗?谢谢
我能找到的唯一解决方案是在更改缓冲区然后更改回原始缓冲区后查询主模式。有更好的方法吗?
【问题讨论】:
标签: emacs elisp major-mode
我已经尝试搜索谷歌并查看手册,但仍然找不到如何获取缓冲区对象的主要模式。你能帮我举个例子或参考吗?谢谢
我能找到的唯一解决方案是在更改缓冲区然后更改回原始缓冲区后查询主模式。有更好的方法吗?
【问题讨论】:
标签: emacs elisp major-mode
这有问题吗?
(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 将在返回时恢复您的缓冲区。
【讨论】:
(with-current-buffer buffer-or-string major-mode) 而不是 save-excursion。
(save-excursion (set-buffer ..) ...),而改用(with-current-buffer ...)。 Emacs-24 的字节编译器会警告此类用途。
对于当前缓冲区:
(message "%s" major-mode)
【讨论】:
一个简单的方法是使用buffer-local-value 函数,因为major-mode 是一个缓冲区局部变量:
(buffer-local-value 'major-mode (get-buffer "*scratch*"))
【讨论】:
只是从以前的答案扩展 - 不带参数调用以获取当前缓冲区的模式:
(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
【讨论】:
好吧,describe-mode 需要一个可选的缓冲区参数,但它会显示帮助...我不确定它返回什么...
但这是我在简短搜索中能找到的最好的……抱歉……
【讨论】:
简单评估一下:
(print major-mode)
【讨论】:
除了直接读取 major-mode 变量之外,另一种方法是直接读取 mode-name 变量。
【讨论】: