我尝试过在谷歌上搜索和查看手册,但仍然找不到如何获取缓冲区对象的主模式。你能给我提供一个例子或参考吗?谢谢。
我能找到的唯一解决方案是在更改缓冲区后查询major-mode,然后再切换回原始缓冲区。有更好的方法吗?
我尝试过在谷歌上搜索和查看手册,但仍然找不到如何获取缓冲区对象的主模式。你能给我提供一个例子或参考吗?谢谢。
我能找到的唯一解决方案是在更改缓冲区后查询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
在返回时会还原您的缓冲区。
当前缓冲区:
(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))))
(buffer-mode) => 'lisp-interaction-mode
(buffer-mode "tasks.org") => 'org-mode
除了直接读取major-mode
变量之外,另一种方法是直接读取mode-name
变量。
嗯,describe-mode函数可以带一个可选的缓冲区参数,但是它会显示帮助信息...我不太确定它返回什么...
但这是我在简短搜索中找到的最好的答案了...抱歉...
只需评估这个:
(print major-mode)
(with-current-buffer buffer-or-string major-mode)
来代替save-excursion
来实现此操作。 - haxney(save-excursion (set-buffer ..) ...)
已经被弃用,现在应该使用(with-current-buffer ...)
。Emacs-24的字节编译器会对这种用法发出警告。 - Stefan