indent-tabs-mode 仍在使用空格

indent-tabs-mode is still using spaces

下面是我的 init.el 脚本。它正在加载,因为列指示器是可见的。但是编辑任何 C 文件时,当我只需要制表符 (\t) 时,制表键 仍然 会产生 4 个空格。我从未使用过 lisp,我是 emacs 的新手,怎么了?

(setq-default indent-tabs-mode t)
(require 'fill-column-indicator)


(defun my-c-mode-hook ()
  (setq-default c-default-style "bsd"
                c-basic-offset 4
                tab-width 4
                indent-tabs-mode t)

  (c-set-offset 'substatement-open 0)
  (fci-mode))

(add-hook 'c-mode-hook 'my-c-mode-hook)

试试这个:

(setq c-default-style "bsd")

(defun my-c-mode-hook ()
  (setq c-basic-offset 4
        tab-width 4
        indent-tabs-mode t)

  (c-set-offset 'substatement-open 0)
  (fci-mode))

(add-hook 'c-mode-hook 'my-c-mode-hook)

变量有一个 global 值,并且可能有一个 buffer-local 值。

此外,当您设置某些变量时,它们将自动使用缓冲区本地值。这些变量包括 c-basic-offsettab-widthindent-tabs-mode(如果您通过 C-hv 描述它们,您可以自己看到)

setq-default 设置变量的 global 值,但是在 c-mode-hook 运行时缓冲区局部值已经建立,所以在那一点上设置默认值并不是您真正想要的,因为它不会影响现有的本地值(尽管取决于模式的工作方式,这样做可能会导致 future 缓冲区以获得所需的值)。

setq 在存在时设置缓冲区本地值(否则为全局值),因此这就是您想要用于大多数变量的内容。

相反,

c-default-style 不是自动缓冲区本地的,因此用 c-mode-hook 设置它应该没有任何目的。我们可以只设置它的(全局)值一次。