Emacs Lisp,如何获取缓冲区主要模式?

60

我尝试过在谷歌上搜索和查看手册,但仍然找不到如何获取缓冲区对象的主模式。你能给我提供一个例子或参考吗?谢谢。

我能找到的唯一解决方案是在更改缓冲区后查询major-mode,然后再切换回原始缓冲区。有更好的方法吗?

7个回答

45

有问题吗?

(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 在返回时会还原您的缓冲区。


12
你也可以使用(with-current-buffer buffer-or-string major-mode)来代替save-excursion来实现此操作。 - haxney
2
@haxney:使用(save-excursion (set-buffer ..) ...)已经被弃用,现在应该使用(with-current-buffer ...)。Emacs-24的字节编译器会对这种用法发出警告。 - Stefan
@stefan:一个 Emacs 新手在哪里可以看到这些废弃警告? - Realraptor
正如所述,字节编译器会发出警告:只需对您的文件进行字节编译,它就会给出有用的建议。 - Stefan
它能用,但我想知道emacs是否可以直接处理这个问题?为什么我们需要很快地将目标缓冲区更改为当前缓冲区,应用函数,然后再将其更改回去?为什么没有一个函数可以直接获取缓冲区并返回其主要模式?这是出于某些历史传统吗?还是emacs中有更深层次的事实阻止我们这样做? - Student

41

当前缓冲区:

(message "%s" major-mode)

36

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

(buffer-local-value 'major-mode (get-buffer "*scratch*"))

这实际上回答了原始提问者的问题,即如何在不切换缓冲区的情况下完成此操作。 - intel_chris

8

延续之前的回答 - 不带参数的调用以获取当前缓冲区模式:

(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

感谢您提供全面的解决方案! - Yu Shen

0

除了直接读取major-mode变量之外,另一种方法是直接读取mode-name变量。


0

嗯,describe-mode函数可以带一个可选的缓冲区参数,但是它会显示帮助信息...我不太确定它返回什么...

但这是我在简短搜索中找到的最好的答案了...抱歉...


0

只需评估这个:

(print major-mode)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接