请教一个非常恼人的缩进问题

Spacemacs 用了快半年了,哪里都好,就是有这么一个缩进的问题一直困扰着我,始终找不到答案。这个问题和 web-mode 相关(应该是),具体是这样的:

期望:

{{example-component
  foo="bar"
  bar=(action "baz")
  baz=foo}}

结果:

{{example-component
    foo="bar"
    bar=(action "baz")
    baz=foo}}

这是一个 htmlbars(也就是增强版的 handlebars)模板,问题在于 web-mode 缩进的结果比我期望的要多两个空格。我已经设置了所有通用的缩进选项以及 web-mode 自己的一些缩进选项,但依然达不到我的期望。

比较头疼的是,曾经 spacemacs 在这里是正确的,然而我很难回溯到底是哪一次更新(包括 web-mode)出了问题,由于接触 emacs-lisp 时间不长,平时工作繁忙也不可能就为了这么一个细节去深挖代码实现,所以我想请教我该怎么定位这个细节出现的问题并且把它调整到我期望的结果?

以下是我自己已经做过的事情:

  1. C-h k TAB 找出在 htmlbars 中 TAB 的绑定函数,结果为:(indent-for-tab-command &optional ARG)
  2. M-x debug-on-entry 开启调试,定位于上面的函数,然后按下 TAB 触发,其结果是:
Debugger entered--entering a function:
* indent-for-tab-command(nil)
funcall-interactively(indent-for-tab-command nil)
call-interactively(indent-for-tab-command nil nil)
command-execute(indent-for-tab-command)

到这一步我就卡住了,能够查看的两个函数调用分别是 indent-for-tab-command(nil)command-execute(indent-for-tab-command),但这俩都是 emacs 自己的代码,太底层了也不可能看出啥问题。剩下两个函数也似乎和缩进没啥关系。再往下我就不知还能做什么了,请各位大神赐教帮我看看该怎么做,谢谢!

设置下 tab-width 选项?

之前使用 spacemacs 配置,在 lisp 文件里按 tab 出来 3 个空格…… 到现在我也没搞清过 emacs 的缩进,无法预料,玄学一样

(setq-default ;; js2-mode js2-basic-offset 4 ;; web-mode css-indent-offset 4 web-mode-markup-indent-offset 4 web-mode-css-indent-offset 4 web-mode-code-indent-offset 4 web-mode-attr-indent-offset 4) 有没有可能是上面的某一个配置?

统一回复 @ashfinal@Zay:我之前已经说过了,我已经设置了所有和缩进有关的选项,也包括你们二位提到的。

通常按 tab 不会出来 制表符,只会缩进当前行。这叫自动缩进。

你的意思是想说

tab-width 设定的是制表符的宽度,而不是缩进时的空格数

吗?

虽然不是这个意思,但是

是对的。

看下是不是jsbeautify的设置,~/.jsbeautifyrc

应该不会是的,首先我没有用 jsbeautify,所以也没有 rc 配置文件;其次我也没有安装过 jsbeautify,所以即使 web-mode 默认使用了它,也不会有任何效果。实际上我的确 M-x web-html-beautify 了一下,然而并没什么用。

我这没有问题, 应该是 spacemacs 的问题。

{{example-component
  foo="bar"
  bar=(action "baz")
  baz=foo}}

用jsbeautity是这样的: {{example-component foo=“bar” bar=(action “baz”) baz=foo}}

不清楚你的 Emacs 具体配置, 有时候 web-mode-content-type 也会影响到锁进。

最终,我把自己的 .spacemacs 文件备份了,然后重新开始配置全新的 spacemacs,一块一块把原来的配置挪过去,每完成一块都检查一下缩进是否 OK。全部完成之后(丢弃了一些不再使用的配置,没有增加)缩进依然是 OK 的……- -

这种没法解释的问题实在是气死人,无话可说。

web-mode 各种缩进问题比较难找,因为配置项比较多。 建议使用editorconfig来统一缩进,还可以根据不同项目进行单独配置

我有用 editorconfig,但是无法解决我这个问题,如果不是 web-mode 的问题(到现在也不知道根源在哪里),那就是有另外一处的配置,连 editorconfig 也覆盖了吧。

不是,我后来想了一下,我这个例子的地方可能 editorconfig 覆盖不到,因为这个并不属于 syntax indentation(没人规定 handlebars attrs 换行要空两格,editorconfig 应该也管不到),应该属于 continiuous indentation 的范畴。

我项目里web-mode没有配置任何缩进的配置,editorconfig就可以覆盖, 有没有试着将web-mode缩进配置全部删掉?

行了,我已经确认是 spacemacs develop 分支的锅了,切换回 master 重置 .spacemacs 配置,再还原我自己的配置,一切 OK;和 editorconfig 半毛钱关系都没有。