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

Posted

技术标签:

【中文标题】emacs lisp,如何获得缓冲区主要模式?【英文标题】:emacs lisp, how to get buffer major mode? 【发布时间】:2011-01-15 08:32:20 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这有问题吗?

(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 @haxney:确实不推荐使用(save-excursion (set-buffer ..) ...),而改用(with-current-buffer ...)。 Emacs-24 的字节编译器会警告此类用途。 @stefan:emacs 菜鸟可能会在哪里看到这样的弃用? 如前所述,字节编译器会发出警告:只需对您的文件进行字节编译,它就会为您提供有用的建议。 它有效,但我很好奇 emacs 是否可以直接处理这个问题?为什么我们要立即将目标缓冲区更改为当前,应用函数并将其改回?为什么没有一个函数可以直接获取缓冲区并返回其主模式?是为了一些历史惯例吗?还是 emacs 中有更深层次的事实阻止我们这样做?【参考方案2】:

对于当前缓冲区:

(message "%s" major-mode)

【讨论】:

【参考方案3】:

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

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

【讨论】:

这实际上回答了原始提问者的问题。这是如何在不切换缓冲区的情况下做到这一点的。【参考方案4】:

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

(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

【讨论】:

感谢您提供全面的解决方案!【参考方案5】:

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

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

【讨论】:

【参考方案6】:

简单评估一下:

(print major-mode)

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于emacs lisp,如何获得缓冲区主要模式?的主要内容,如果未能解决你的问题,请参考以下文章

Emacs 26.1 发布了,文字终端支持 24 位颜色

在 Emacs 中,如何根据缓冲区名称自动启用次要模式?

如何在emacs中自动关闭自动加密模式缓冲区?

如何阻止 emacs dired 模式打开这么多缓冲区?

将 shell 命令的输出插入 emacs 缓冲区

分析行为不端的 Emacs Lisp 的提示?