关于文件中和dir locals的local variables可控性问题

一直没开启这两个功能, 之前听人说这个安全性很高, 可以精确控制, 现在测试了一下, 好像可控性很低.

启用后, 好像没法控制哪些variable允许被设置, 哪些忽略. 默认是全部设置. enable-local-variables可以设置为:safe, 此时只有emacs内标记为safe的变量可以被设置(emacs内部有很多这样的变量).

好像没法实现我想要的功能: 比如只允许tab-width被自动设置, 其他变量全部忽略.

可通过 put 函数来标记自定义变量为安全类型:

同样也可以改变内置变量的安全属性:

(with-emacs
  (list
   :before
   (get 'tab-width 'safe-local-variable)
   :after
   (progn
     (put 'tab-width 'safe-local-variable nil)
     (get 'tab-width 'safe-local-variable))))
;; => (:before integerp :after nil)

实际使用上会不会产生问题有待验证。

emacs已经把很多内置变量设置了安全属性, 但是很多不是我想要的, 比如只想让tab-width为安全, 其他全部忽略, 这个功能好像很难实现.

  • 目前我只知道 put 函数可以修改安全属性,但是更改内置变量会不会有问题还未知。

  • 想通过 put 设置除 xxx 之外的所有内置变量恐怕不太现实,首先要把所有安全的内置变量找出来。

  • 你的需求有点奇怪。

本来是一直没开启这个功能, 主要是很不希望某个选项被别人自动改成一个出乎意料的值. 比如emacs的源码目录里的dir-local, 会把c-mode的风格改成GNU, 这种改动太大了.

大部分情况下都没什么影响, 唯一不方便的地方就是tab-width, 所以只想开启这个变量的自动配置.

另一个思路:

建立自己的安全白名单,然后魔改 local variable 的实现,或者看看 hack-local-variables-hook 能不能用上。

看了下, 可以在before-hack-local-variables-hook里修改变量file-local-variables-alist的值, 这个变量里面放了准备应用的local variables, 可以把不要的清理掉.

难道这个需求真的太小众了吗?

别人的仓库,用dir-loc保持一些设置,来维持代码风格是有必要的。你把别人的改了是怎么回事,你会改editorconfig么

1 个赞

你说的很有道理, 不过一般只浏览, 不修改. 最多是抄点代码. 一直没开启这功能, 以后慢慢体验.

默认就是吧,如何给 tab-width 设置一个整数值,那么这个设置就是安全的,Emacs 不会给提示便会自动设置。

可以动手试下,生成一个文件,然后 M-x add-file-local-variable tab-width 12,然后重开这个文件,检查 tab-width

本来的需求是只允许自动设置tab-width, 其他变量(包括emacs认为是安全的变量)全部忽略. 通过before-hack-local-variables-hook已经测试成功, 但现在感觉好像没必要这样限制了.