Emacs 使用.dir-locals.el为特定文件设置模式
我为导航GHC概要文件创建了一个小型模式,我希望它在haskell项目中的Emacs 使用.dir-locals.el为特定文件设置模式,emacs,Emacs,我为导航GHC概要文件创建了一个小型模式,我希望它在haskell项目中的.prof文件中自动生效。我很高兴使用.dir locals.el,我记得不久前找到了相关功能,但现在似乎找不到了。有很多不同的方法可以实现这一点。以下是三点: 文件局部变量 目录局部变量 标准模式处理 它们中的每一个都有其优缺点,所以你可以决定哪一个最适合你的需要 文件局部变量 Emacs提供了一种机制,允许您使用特殊语法直接在文件中指定某些变量的值。访问这样的文件时,Emacs将解析第一行并将指定的变量设置为给定值 现
.prof
文件中自动生效。我很高兴使用.dir locals.el
,我记得不久前找到了相关功能,但现在似乎找不到了。有很多不同的方法可以实现这一点。以下是三点:
eval
作为“变量”名称来执行任意代码的方法。实际上,它看起来是这样的。有两种方法可以指定文件局部变量,即配置次要模式的加载
第一专线
您可以将以下行作为.prof
文件的第一行:
-*- eval: (my-prof-minor-mode) -*-
在这里,您可以看到reservedeval
关键字的使用,它允许执行任意代码-在我们的代码中,该代码只是对次要模式的调用(当然,示例中使用了占位符,您必须输入实际次要模式函数的名称)
局部变量表
如果您不想弄乱文件的开头,也可以在文件末尾(或接近结尾处)包含eval
声明,但语法略有不同:
## Local Variables:
## eval: (my-prof-minor-mode)
您注意到这里使用了##
:这可能因文件而异,因为它应该只是该类型文件中常用的标准注释语法。不幸的是,我无法确定.prof
文件使用的注释语法(如果有的话)
然而,文件局部变量方法的主要缺点是:实际上不鼓励用户将其用于次要模式。基本原理是,次要模式通常是编辑时特定用户个人偏好的表达。在共享环境中,这些首选项可能因用户而异,因此在文件本身中修复它们会有问题
此外,由于其他原因,弄乱文件内容可能会有问题,例如,如果不弄乱文件的预期语法就很难做到这一点。例如,如果在添加了上述两个选项中的一个后,Haskell profiler无法正确读取.prof
文件,那么整个练习就没有意义了
有关文件局部变量的详细信息,请参见和
目录局部变量
目录局部变量不是直接处理有问题的文件,而是让您可以选择在访问某个目录中的文件时设置某些变量值。而且,与之前一样,此机制支持使用特殊的eval
变量来执行任意代码,包括调用次要模式
为了使用此方法,您需要在.prof
文件所在的目录中创建一个名为.dir locals.el
的文件。该文件的内容如下:
(fundamental-mode . ((eval . (my-prof-minor-mode)))))
该条目以主模式说明符开始:下面的所有内容仅应用于缓冲区主模式为“基本模式”的文件。如果您已将Emacs配置为对.prof
文件应用不同的主模式,则必须相应地更改该规范
然而,一个更大的问题是,上面的规范会为该目录中与给定主模式匹配的所有文件打开主模式。但是,通过添加文件名测试,不难修复.dir locals.el
文件以执行正确的操作:
((基本模式)((eval.(当(字符串匹配“\.prof$”(缓冲区文件名))时)
(我的副教授模式(()())))
有关目录局部变量的更多信息,请参阅和
标准模式处理
让我们一步一步地看一遍
打开某些文件类型的主要模式的标准方法是:
(setq自动模式列表(附加“(“\\.prof$”.my prof-major模式))
自动模式
为某些主要模式打开次要模式的标准方法是通过以下方式进行注册:
(添加hook“文本模式hook”my prof minor模式)
现在的问题是:您是否编辑不在Haskell项目中且不希望打开次要模式的.prof
文件?否则,上述机制可能已经足够了。让我们暂时假设情况就是这样
编辑.prof
文件时使用哪种主要模式?如果是<代码>基本模式< /代码>,您可以考虑将您的次要模式转换为主要模式,并使用<代码>自动模式> >代码>打开所有代码> > PROF> <代码>文件,如上面的第一个代码示例所示。
如果是其他模式,比如文本模式
(或其他任何模式),则可以使用第二个代码示例来激活次要模式。但是,只有当主模式专门用于.prof
文件时,这才真正有用。对于文本模式
,情况肯定不是这样。但是按照上面的方法,通过主模式钩子激活副模式将为所有文本文件打开它,而不仅仅是.prof
文件。我们可以通过一个小的辅助函数来解决这个问题:
(添加钩子的文本模式钩子(lambda()
(当(字符串匹配“\\.prof$”(或(缓冲区文件名)(缓冲区名称))时)