Emacs 使用.dir-locals.el为特定文件设置模式

Emacs 使用.dir-locals.el为特定文件设置模式,emacs,Emacs,我为导航GHC概要文件创建了一个小型模式,我希望它在haskell项目中的.prof文件中自动生效。我很高兴使用.dir locals.el,我记得不久前找到了相关功能,但现在似乎找不到了。有很多不同的方法可以实现这一点。以下是三点: 文件局部变量 目录局部变量 标准模式处理 它们中的每一个都有其优缺点,所以你可以决定哪一个最适合你的需要 文件局部变量 Emacs提供了一种机制,允许您使用特殊语法直接在文件中指定某些变量的值。访问这样的文件时,Emacs将解析第一行并将指定的变量设置为给定值 现

我为导航GHC概要文件创建了一个小型模式,我希望它在haskell项目中的
.prof
文件中自动生效。我很高兴使用
.dir locals.el
,我记得不久前找到了相关功能,但现在似乎找不到了。

有很多不同的方法可以实现这一点。以下是三点:

  • 文件局部变量
  • 目录局部变量
  • 标准模式处理
  • 它们中的每一个都有其优缺点,所以你可以决定哪一个最适合你的需要

    文件局部变量 Emacs提供了一种机制,允许您使用特殊语法直接在文件中指定某些变量的值。访问这样的文件时,Emacs将解析第一行并将指定的变量设置为给定值

    现在,次要模式当然不是一个变量。但是文件本地机制提供了一种通过使用
    eval
    作为“变量”名称来执行任意代码的方法。实际上,它看起来是这样的。有两种方法可以指定文件局部变量,即配置次要模式的加载

    第一专线 您可以将以下行作为
    .prof
    文件的第一行:

    -*- eval: (my-prof-minor-mode) -*-
    
    在这里,您可以看到reserved
    eval
    关键字的使用,它允许执行任意代码-在我们的代码中,该代码只是对次要模式的调用(当然,示例中使用了占位符,您必须输入实际次要模式函数的名称)

    局部变量表 如果您不想弄乱文件的开头,也可以在文件末尾(或接近结尾处)包含
    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$”(或(缓冲区文件名)(缓冲区名称))时)