如何将 Emacs 结构缩进从 4 个空格更改为 2 个空格

Dav*_*mes 2 c++ emacs struct

;; C++ Mode
(c-set-offset 'access-label '-2)
(c-set-offset 'inclass '4)
(setq c-default-style "k&r"
      c-basic-offset 2)
Run Code Online (Sandbox Code Playgroud)

那是我的 C++ 配置。我希望 Emacs 用 2 个空格缩进结构体,就像它缩进函数一样,if/while/for 块,但目前它是这样做的:

struct plane {
    //4 spaces'?
};
Run Code Online (Sandbox Code Playgroud)

但是,它这样做:

typedef car {
  //2 spaces!
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用c-modec++-mode。当我M-x c-set-offset在一个结构体(它当前用 4 个空格缩进)中执行操作时,它会将其检测为topmost-intro(0 个空格),即使在 C++ 模式下也是如此。

基本上,我希望内部结构缩进 2 个空格而不是现在的 4 个空格。(GNU Emacs 24.2.1)

Ola*_*che 5

您应该删除配置并从

(custom-set-variables
 '(c-basic-offset 2))
Run Code Online (Sandbox Code Playgroud)

这将所有缩进设置为 2 个空格。然后你可以从那里改进。

c-offsets-alist例如,您可以设置为各种元素自定义缩进。或者c-hanging-braces-alist在同一行或下一行配置大括号应该设置的位置。等等。

如果您已经安装了 CC 模式信息文件,您可以浏览它

Ctrl-h i mCC ModeRET

CC 模式不区分classstruct,因为两者的句法元素都是inclass。您只能使用自定义 Line-Up 函数基于 struct 使用不同的缩进

(defun my/c-lineup-inclass (langelem)
  (let ((inclass (assoc 'inclass c-syntactic-context)))
    (if (not inclass)
        0
      (save-excursion
        (goto-char (c-langelem-pos inclass))
        (if (looking-at "struct") 0 '+)))))
Run Code Online (Sandbox Code Playgroud)

这个函数看起来,如果你在 aclassstructor 外面,并相应地返回一个缩进级别。然后你可以在你的c-offsets-alist

(custom-set-variables
 '(c-offsets-alist (quote ((access-label . 0)
                           (topmost-intro . my/c-lineup-inclass)))))
Run Code Online (Sandbox Code Playgroud)