【问题标题】:how to save .dir-local variables in a seperate directory如何将 .for-local 变量保存在单独的目录中
【发布时间】:2016-12-15 03:28:44
【问题描述】:

现在我正在尝试将 .dir-locals.el 用于我自己的项目。 但是,每当我选择永久保存它时,它都会保存在 init.el 的末尾。 我想将其更改为另一个单独的文件 - 例如 ~/mydirlocals.el。

请告诉我有什么办法可以解决这个问题。

PS:我已经尝试将自定义文件更改为单独的文件。但不幸的是,它用其他自定义变量保存了我的 dir-local 变量。 我想避免这种情况,并将我的 dir-locals 变量保存在一个完全独立的文件中。

【问题讨论】:

    标签: variables emacs local


    【解决方案1】:

    您不能使用自定义界面更新.dir-locals.el 文件。自定义是针对您自己的配置。如果要编辑/更新目录局部变量文件,则需要直接编辑该文件,或使用 M-x add-dir-local-variable

    后一个命令将提示您提供详细信息。请注意,在提示时没有为变量的 value 提供默认值,但您可以键入 M-n 来获取当前缓冲区中的变量值。

    还要注意,该命令询问变量是本地的目录——它将在当前缓冲区的默认目录中创建/更新.dir-locals.el 文件。从预期目录的 dired 缓冲区发出命令自然是一种安全的方法,但您可能希望从您希望为其添加变量的模式的缓冲区中执行此操作 - 这是该模式的默认建议,并且有问题的变量的当前值对您更有用。

    (如果目录中没有合适类型的文件,你总是可以C-xC-f一个合适文件名的新的/未保存的缓冲区,使用add-dir-local-variable根据需要多次,然后当您完成后,只需终止您创建的任何新缓冲区而不保存它们。)

    话虽如此,我仍然不能 100% 确定您的要求是什么,因为您的问题有点困惑;但您可能还想知道,您可以在根本没有.dir-locals.el 文件的情况下使用目录局部变量,因为您也可以在初始化文件中完全配置它们。

    有关详细信息和示例,请参阅https://www.emacswiki.org/emacs/DirectoryVariables

    【讨论】:

    • 对不起,如果我让你感到困惑。再说一遍,我的问题是如何将我的 dir-local 变量永久保存在单独的文件中。每当访问文件时,Emacs 都会询问我是否要申请,并永久申请。如果通过按 ! 选择最后一个(永久应用),则这些变量将附加在 init 文件的末尾。此时,我想将它们保存在另一个我自己的特定文件中,而不是 init 文件中。有办法吗?
    • 啊,我想我明白你现在在问什么了。 Emacs 只是将您已批准某些值作为 acceptable 的事实存储为某些局部变量。该数据没有指定要设置的值; Emacs 只是检查该数据以查看在设置局部变量时是否需要征得您的许可,而未经您的批准可能无法安全设置。
    • 除了custom-file 之外,您无法告诉 Emacs 自动将该数据存储在任何位置,但如果您真的想要这样做,没有什么能阻止您手动移动该数据放入一个单独的 elisp 文件 -- (setq safe-local-variable-values ...) -- 您将在 init 文件中使用 load,然后使用自定义界面擦除 custom-file 中的数据。但是,每次添加新的安全值时都必须重复维护,所以 IMO 这样做会很烦人。
    【解决方案2】:

    免责声明:我没有使用 dir-local vars,但我使用了 file-local vars。我猜 dir-locals 也一样。

    局部变量不会在init.elcustom.el 的末尾保存,安全值 是。就像在默认情况下,Emacs 不信任它们,除非它们匹配某种表明它们正常的谓词。这是一个很好的策略,因为文件和目录本地可以导致 Emacs 仅通过打开文件来运行任意代码。当您永久申请时,您是在告诉 Emacs 该值是安全的;它基本上只是创建一个与确切值匹配的谓词并将其存储在自定义中。

    如果您想阻止提示(从而阻止保存),您需要使用自己的谓词将变量标记为安全。

    比如我设置了

    (put 'adaptive-wrap-extra-indent 'safe-local-variable 'integerp)
    

    这意味着adaptive-wrap-extra-indent 只要是整数就可以。我知道这没关系,因为我将该变量添加到 adaptive-wrap 包中(尽管当时我不知道安全本地人;我提交了一个错误来修复它,但似乎被忽略了)。显然,您可以使用任何谓词,包括 (lambda (x) t),尽管我不建议这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多