【发布时间】: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)谓词函数确认)。