请问如何在spacemacs中根据项目来定义tab的行为

Project A: tab = 4space Project B: tab = 8space Project C; tab 不是空格

添加文件本地变量,或者文件夹本地变量(在 .dir-locals 文件内),指定变量 tab-width 的值

感觉楼主可能更需要的是 .dir-local,放在项目根目录即可

tab 的行为:indent-tabs-mode 和 tab-width, 都是 buffer-local 的; 根据项目:这个你要看具体什么项目,有什么特征什么的。至少我知道的,判断项目至少可以通过 projectile / default-directory / magit-toplevel 等等

两种方案:

  • .dir-locals.el

    仅 emacs,使用简单,在项目根目录 M-x add-dir-locals 根据提示操作就行了

  • editorconfig

    类似 ini 配置文件,几乎所有的编辑器都支持了(当然需安装扩展/插件)

已经在git project的顶层 通过 SPC f v d 添加了

((“cc-mode” (tab-width . 8) (indent-tabs-mode . t)))

但是tab-width 没有效果.

SPC h d v, 发现tab-width的值还是2, 被覆盖了.

请问如何以dir-locals为最终的设定值?

你重新打开 buffer 试试,正常情况下会问你是否应用本地变量的。

本地变量是每次打开或者 revert 的时候才会应用的。如果不想让它提示需要将它设为安全变量。

根据检查应该都没有生效.

发现项目A中的.c文件时候移动一下是2个空格

有的项目B中的.c文件时候移动一下是1个空格.

请问这个是什么情况? 以及如何让dir-locals 生效.

把你的 dir-local 文件的内容贴出来,好让大家帮你试试

((“cc-mode”
    (tab-width . 8)
    (indent-tabs-mode . t)))

我这边可以的

图片

而且 tab-width 本身就是安全的,所以不会有提示。

如果直接在buffer local 下面直接set-variable 会生效 所以是不是我的dir-locals 根本就没有执行? 如何让他执行?

你关闭文件再打开呢?注意你的 dir-local 指定了只对 cc-mode 有效

重启emacs 都不行

如果major-mode 不是 cc-mode 是不会有效的,是不是这个原因?

你可以不指定mode,这样它对所有的 mode 都有效

tab-width is a variable defined in ‘C source code’.

Its value is 2

Original value was 8

默认都是2,我只有在dir-local里面设置了8 所以应该是先生效了 然后被改了.

我使用的helloword.c来试验的

看来这是一个 emacs / spacemacs 的 issue,需要用 set-default 来解决

你的两个项目都是 c 语言吗?如果是就麻烦了

在帮忙确定一下 比如文件名有没什么问题?

41 AM

应该是没有问题

我刚才也是这么试的,就只有 c 的不行, elisp 的设了就管用