if语句缩进不起作用emacs

时间:2018-07-06 16:04:15

标签: emacs indentation

我是emacs的新手。我一直在为emacs使用此配置:

(setq column-number-mode t) 
(setq c-default-style "linux"
          c-basic-offset 4)
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(custom-enabled-themes (quote (wheatgrass))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

通常,缩进由emacs自动正确处理。但是,对于if语句,即使我可以在emacs中看到正确的缩进,也不会在其他编辑器中显示该选项卡。

我一直在编辑* .c文件,模式是“在cc-mode.el中定义的C / l模式。用于编辑C代码的主要模式”。

这里是一个例子: 如果我使用以下代码在emacs中创建一个c文件:

int main() {
    int x = 1;

    if (x > 0)
        x++;
    else
        x--;

    printf("Value of x: %d\n", x);

    return 0;
}

如果在不同的编辑器中可视化此代码,或者将其从emacs复制到另一个编辑器,则输出如下:

int main() {
    int x = 1;

    if (x > 0)
    x++;
    else
    x--;

    printf("Value of x: %d\n", x);

    return 0;
}

基本上,即使看起来好像正确地缩进了if语句,它似乎也没有在if语句中添加任何制表符。

出什么问题了?我该如何解决?

2 个答案:

答案 0 :(得分:3)

Emacs混合使用制表符和空格进行缩进,而您的其他编辑器使用的制表符宽度不同。

查看您的示例,可以确定在Emacs中tab-width是8,c-basic-offset是4,indent-tabs-mode是t。

如果我们为该配置添加所需的空格(和)和/或制表符(t)的数量:

0 |int main() {
4s|    int x = 1;
  |
4s|    if (x > 0)
1t|        x++;
4s|    else
1t|        x--;
  |
4s|    printf("Value of x: %d\n", x);
  |
4s|    return 0;
0 |}

在其他编辑器中,制表符宽度显然仅等于4个空格,因此“ 4s”和“ 1t”显示为相同宽度。

如果您在Emacs中M-x set-variable RET tab-width RET 4 RET,将看到相同的内容。

n.b。 M-x whitespace-mode可以为您显示缩进字符。

为了获得最佳的跨编辑器兼容性,请仅使用缩进空格-indent-tabs-mode设置为nil-或者,如果您希望使用制表符,则应确保tab-width和{{ 1}}是相同的值,这意味着每个缩进级别都是一个制表符(至少在缩进具有特定数量的语言中,而不是与任意其他代码对齐的语言中)。

似乎您确实需要标签页,因此请尝试以下配置:

c-basic-offset

如果仅使用空格,则只需禁用(add-hook 'c-mode-hook 'my-c-mode-hook) (defun my-c-mode-hook () "Custom `c-mode' behaviours." (setq c-basic-offset 4) (setq tab-width c-basic-offset) (setq indent-tabs-mode t))

indent-tabs-mode

或者您可以默认禁用 ,而不是针对特定的主要模式。 (add-hook 'c-mode-hook 'my-c-mode-hook) (defun my-c-mode-hook () "Custom `c-mode' behaviours." (setq indent-tabs-mode nil)) 始终是局部于缓冲区的值,但是如果更改其默认值,则将影响所有未明确设置其默认值的未来缓冲区:

indent-tabs-mode

答案 1 :(得分:2)

请注意,这是正确的方向,但是您可以检查选项卡是否是问题的根源。命令:

C-u M-x untabify

将所有制表符转换为空格。

我建议尝试:

  1. 将此取消制表命令应用于代码缓冲区
  2. 保存,
  3. 使用其他文本编辑器打开文件,

如果您现在获得正确的缩进,那么我们已经确定了问题的根源:制表符。

一个可能的解决方法是系统地使用空格代替制表符。您可以看一下:How to force spaces instead of tabs regardless of major mode?