我正在使用c ++模式运行emacs 23并且存在一些缩进问题。 假设我有这段代码:
void foo()
{
if (cond)
{ <---
int i;
...
} <---
}
这似乎是自动缩进的默认行为。 但是我想改变它,所以它会是这样的:
void foo()
{
if (cond)
{
int i;
...
}
}
有没有办法通过配置c ++模式或我的.emacs文件来轻松完成?
答案 0 :(得分:41)
我的.emacs文件中有以下内容:
(defun my-c++-mode-hook ()
(setq c-basic-offset 4)
(c-set-offset 'substatement-open 0))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
您可以通过在任意行上按[ctrl-c ctrl-s]来确定要编辑的偏移量。在if
后面带括号的第一行,它会说substatement-open
。
答案 1 :(得分:21)
这是我的...这符合visual studio的默认设置。
(defun my-c-mode-common-hook ()
;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode
(c-set-offset 'substatement-open 0)
;; other customizations can go here
(setq c++-tab-always-indent t)
(setq c-basic-offset 4) ;; Default is 2
(setq c-indent-level 4) ;; Default is 2
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
(setq tab-width 4)
(setq indent-tabs-mode t) ; use spaces only if nil
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
答案 2 :(得分:9)
简短回答:将此行放入.emacs文件中:
(c-set-offset 'substatement-open 0)
答案很长:......
对于我们这些刚接触emacs-lisp的人来说,http://www.cs.cmu.edu/有一个非常简单的方法:
转到要缩进的行
输入C-C C-O(字母“O”,而非零)
按 Enter 接受默认建议
输入“0”(即零),无需额外缩进,按 Enter
输入标签以重新加入该行。
在这种情况下,未来“{”将具有正确的标签设置,直到您重新启动emacs。
这个方法的好处是,您实际上可以查看要更改的lisp代码。您可以输入.emacs文件:
(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)
此外,您可能需要查看程序AStyle以自动格式化emacs之外的C ++源代码。
答案 3 :(得分:3)
接受的答案实际上是错误的。 Emacswiki没有帮助。
将以下代码插入〜/ .emacs:
(defun fix-c-indent-offset-according-to-syntax-context (key val)
;; remove the old element
(setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist))
;; new value
(add-to-list 'c-offsets-alist '(key . val)))
(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
;; indent
(fix-c-indent-offset-according-to-syntax-context 'substatement-open 0))
))
有关技术详情,请参阅http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html。
关键问题是c-set-offset 不可靠以便再次检测语法上下文(Emacs24.3.1)。所以唯一可靠的方法是分析原始的emacs代码。我的文章中列出了破解代码的详细步骤,基本上您需要阅读/usr/share/emacs/24.3/lisp/progmodes/cc-中定义的函数 c-indent-line 。 cmds.el
有些人抱怨我的设置不起作用。实际上它适用于所有稳定版本的Emacs(23.4,24.3,24.4),如果你不改变默认设置(缩进有不同的配置文件,我的设置基于默认配置文件)。 / p>
我的关键点是,在这个特定问题上,您需要阅读代码。
答案 4 :(得分:0)
在调整单个偏移之前,请配置首选样式。我使用stroustrup,你尝试其他人,请参阅http://www.emacswiki.org/emacs/IndentingC#toc1了解名称,http://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup了解示例
M-x customize-variable c-default-style (并为C ++ _
设置首选项