我是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语句中添加任何制表符。
出什么问题了?我该如何解决?
答案 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
将所有制表符转换为空格。
我建议尝试:
如果您现在获得正确的缩进,那么我们已经确定了问题的根源:制表符。
一个可能的解决方法是系统地使用空格代替制表符。您可以看一下:How to force spaces instead of tabs regardless of major mode?