【问题标题】:Emacs: how do I set a major-mode stored in a variable?Emacs:如何设置存储在变量中的主要模式?
【发布时间】:2012-03-29 11:13:35
【问题描述】:

假设我有一个带有某种模式名称的变量 newName,例如"python-mode"。如何制作newName指定模式的当前缓冲区?

(progn
  (let (newName)
    (setq newName "python-mode")
    (newName) ;; doesn't work! It doesn't set current buffer's mode to be a python mode.
  )
)

这也行不通:

(set-variable 'major-mode "python-mode")

这个问题很基础——因为它等于“真的可以将数据视为 lisp 中的代码吗?”

编辑

@phils

您的解决方案对我不起作用。我复制了一个缓冲区 - 我希望新缓冲区与旧缓冲区具有相同的模式。所以我将原始缓冲区的模式存储在变量中。然后尝试应用您的解决方案。它给出了错误(这是本质 - 我在这里省略了缓冲区复制的东西):

(let (sameMode)
  (setq sameMode major-mode)
  (funcall (intern sameMode))
)

sameMode 以“python-mode”的形式在此处存储模式(python-mode 的示例)。

【问题讨论】:

  • phils 为您提供了答案,但顺便说一句,您认为可以使用字符串作为函数的任何东西,尤其是没有funcall 的情况下?我真的建议阅读有关此类内容的文档,因为它包含在 emacs 中,并且很容易回答这个问题。猜测一门语言的工作原理而不首先尝试理解它不太可能给你带来很大的成功!
  • Adobe:在 Lisp 中,变量有一个字符串值或一个原子值的区别。函数intern 将字符串转换为原子。在 Emacs 中,major-mode 的值是一个原子,因此您不应该使用 intern。顺便提一句。这与@phils 在他的回答中的第二个示例中指定的完全相同。
  • @Lindydancer:你确实把事情说清楚了!
  • 我刚开始检查原子的 elisp 定义(因为我自己会称它为符号),我认为这是不正确的术语。 intern 返回一个符号。原子是任何不是 cons 单元的对象,因此字符串 is 是原子(您可以使用 (atom) 谓词函数确认)。

标签: emacs elisp


【解决方案1】:
(let ((mode "python-mode"))
  (funcall (intern mode)))

(let ((mode 'python-mode))
  (funcall mode))

【讨论】:

  • 第二个对我不利——因为我不知道变量中的模式是什么——所以我的模式是"python-mode"(这只是一个例子——可能是取而代之的是其他模式)。您的第一个答案解决了问题 - 非常感谢您。所以总而言之,这是真的 - lisp 可以将数据视为代码!
  • 我已更新问题 - 您的解决方案对我不起作用。你能改进一下吗?
  • 没关系 - Lindydancer 为我解释了它。你是 100% 正确的,并且给出了一个理想的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2017-09-13
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多