【新手求助】怎么统一使用 TAB 缩进啊,快被折磨疯了

为什么一会儿 TAB 一会儿空格啊,怎么设置都不行,快被折磨疯了,救救孩子吧 :sob:

Tell Emacs never to insert Tabs - Stack Overflow

试过这个,可以达到统一使用空格缩进的效果,但是反过来就不是(跟截图一样) 很奇怪

草,看茬了,全部用 tab 似乎没有什么太好的办法

一通乱试,总算有点效果了,但不知道为啥会这样,

比如说: 前两个效果 indent-tabs-mode 加不加效果都一样

又或者:设置了 c-default-style 如果不设置 tab-width 效果很奇怪 但是 设置 c-default-style 为 gnu,却没事。

可能现阶段我是理解不了其中的原因了,如果有大佬解释一下就好了 :flushed:


设置:

(setq-default tab-width 4)
;;(setq-default indent-tabs-mode nil)
(setq c-default-style "linux")
(setq c-basic-offset 4)

效果:


设置:

(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq c-default-style "linux")
(setq c-basic-offset 4)

效果:


设置:

;;(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq c-default-style "linux")
(setq c-basic-offset 4)

效果:


设置:

;;(setq-default tab-width 4)
;;(setq-default indent-tabs-mode nil)
(setq c-default-style "linux")
(setq c-basic-offset 4)

效果:


设置:

(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
;;(setq c-default-style "stroustrup")
(setq c-basic-offset 4)

效果:


设置:

(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq c-default-style "gnu") 
(setq c-basic-offset 4)

效果:

c-basic-offset 决定了一级缩进用多少个空格; tab-width 决定了一个tab等价于多少个空格,即 indent-tabs-mode 生效时多少个空格会被转换成一个tab。

所以如果要全部使用tab的话,应当开启 indent-tabs-mode 并保证 c-basic-offsettab-width 相等。你可以把相关的配置写到一个新的style里(参考函数 c-add-style和变量 c-style-alist),并修改 c-default-style以便自动在特定mode下启用你自己定义的style,且不会影响其它mode。

这三个设置项与 c-default-style 有什么关系吗,我发现 gnu 和 其他值在 TAB空格 缩进上的效果有所区别。

很多语法和C类似的语言的mode都会继承自 cc mode,而 cc mode 会查询 c-default-style 来选择要使用的 style。c-default-style 里只存了style的名字,具体定义在 c-style-alist 里,你可以去看一下各种style的具体定义,其中包括了你提到的 gnu 和 linux。c-style-alist 里的各个 style 实际上就是设置一下变量的值,比如通常会修改 c-basic-offset的值,当然你也可以在这里修改tab-widthc-basic-offset 是 cc mode 下通用的记录缩进大小的变量。tab-width 是整个Emacs通用的,不仅仅影响 cc mode。

说得有点混乱,举个例子吧

默认 c-style-alist 里关于gnu的设置大概是这样的:

( ;; ...
 ("gnu"
   (c-basic-offset . 2)
   ;; ...
   ))

而默认 c-default-style长这样:

((java-mode . "java")
 (awk-mode . "awk")
 (other . "gnu")

那么c-mode启动时,

  1. 查询 c-default-style,找到other情况下应使用叫做gnu的style
  2. 查找 c-style-alist,找到gnu对应的配置
  3. 看到 (c-basic-offset . 2),则将 c-basic-offset 设置成 2

至于你发现gnu与其它的style缩进效果不同,那应该就是不同style中的 c-default-style 不同导致的。

4 个赞

非常感谢您耐心的解答。