Emacs .dir-locals.el - 设置按键绑定

6
我不确定这是否可行,但我想通过使用.dir-locals.el设置一些特定于项目的键绑定。
当然,.dir-locals.el必须包含一个特殊的设置列表,所以我不能这样做:
(global-set-key [24 down] 'move-text-down)

我可以注入一个lambda表达式来运行任意代码,或者通过其他方式在.dir-locals.el中设置按键绑定吗?


你的问题过于笼统。请问编程语言、项目数量以及每个项目中不同行为的数量是多少?给一些例子。 - abo-abo
2
@abo-abo...抱歉,但您并没有理解这个问题,它并不是一般性的。 - ocodo
1个回答

10
eval伪变量允许您指定要使用本地变量进行评估的任意Elisp代码。
例如请参考:https://dev59.com/gFvUa4cB1Zd3GeqPpgkb#7340962 有关更多详细信息,请参见EmacsWiki
请注意,这不是一种特别有用的机制来设置快捷键绑定,因为将影响使用该键映射的每个缓冲区。 您可能最好使用dir-local配置来启用一个特定项目的特定键映射的次要模式(minor mode)。 或者,您可以调整此文件局部绑定方法(但使用一个次要模式会更好)。
话虽如此...
相当简单的形式是((nil . ((eval . (progn BODY))))),其中BODY是要评估的表达式。 当然,如果BODY只是单个表达式,则不需要progn
因此,以下内容将在您访问目录下的任何文件时显示消息:
((nil . ((eval . (message "hello")))))
每个dir-locals表单中的每个列表的car通常是一个主要模式符号,或者是nil(如上例所示),这种情况下设置将适用于任何主要模式。
car也可以指定一个子目录字符串,在这种情况下,cdr是另一个dir-locals形式,其设置适用于该子目录。

所以,本质上是一个包含 ((eval . (progn BODY))).dir-locals.el 文件吗?(我会尝试一下) - ocodo
1
最少的格式应该是 ((nil . ((eval . (progn BODY))))) -- 表单中每个列表的 car 都是一个(major mode)符号,或者是 nil(如此例所示),表示适用于任何 major mode 的设置。(car 还可以指定一个(sub-directory)字符串,然后是适用于该子目录的设置)。 - phils
谢谢 @phils,Emacs 显示了将 .dir-locals.el 标记为安全的请求,但是 progn 主体内部的代码似乎没有执行。我添加了 (message "hello") 以在 Messages 中检查,但没有显示。尝试使用 lambda,也没有执行。还有其他想法吗? - ocodo
((nil . ((eval . (progn (message "hello")))))) 对我来说完全没问题(global-set-key 也是如此)。 - phils
现在运行正常了,我把坏的删除了,所以不确定我搞砸了什么,但肯定是键盘输入错误。我会将您的可用示例粘贴到您的答案中供将来参考。 - ocodo

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