我在Emacs 23的C++模式下运行,遇到了一些缩进的问题,假设我有这样的代码,这似乎是自动缩进的默认行为。
void foo()
{
if (cond)
{ <---
int i;
...
} <---
}
这似乎是自动缩进的默认行为,但是我想改变它,使它变成这样。
void foo()
{
if (cond)
{
int i;
...
}
}
有没有办法通过配置c++模式或我的.emacs文件来实现这个目标?
我的.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
.
这是我的......这符合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)
简短的回答。把这行写进你的 .emacs
文件。
(c-set-offset 'substatement-open 0)
长答案:...
对于我们这些刚接触 emacs-lisp 的人来说,有一个非常简单的方法,在 http:/www.cs.cmu.edu:
转到你想缩进的那一行
C-C C-O型(那是字母 "O",不是0)。
媒体 进入 接受默认建议
输入 "0"(就是零),不需要额外的缩进,按 进入
种类 标签 来重新缩进该行。
在这种情况下,未来的"{"将有正确的标签设置,直到你重新启动emacs。
这个方法的好处是,你可以真正的做到 看到 你想修改的lisp代码。你可以放在你的.emacs文件中。
(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)
另外,你可能会想看看这个程序。风格 来在emacs之外自动格式化C++源代码。
实际上,公认的答案是错误的。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 (cons 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.orgpostsccjava-code-indentation-in-emacs.html。 的技术细节。
关键的问题是c-set-offset是指 不可靠 来检测语法上下文了(Emacs24.3.1)。所以唯一可靠的方法就是分析emacs的原始代码。黑客代码的详细步骤在我的文章中列出,基本上你需要阅读函数 c-indent-line 其中定义在usrshareemacs24.3lispprogmodescc-cmds.el中。
有些人抱怨说我的设置不工作。事实上,它在所有的 稳定的 版本的Emacs(23.4,24.3,24.4),如果你不改变默认设置(缩进有不同的配置文件,我的设置是基于默认配置文件)。
我的关键点是,关于这个具体问题,你需要阅读代码。
在调整单个偏移量之前,先配置好喜欢的风格。我用的是stroustrup,你我的尝试一些其他的,见 http:/www.emacswiki.orgemacsIndentingC#toc1 姓名和 http:/en.wikipedia.orgwikiIndent_style#Variant:_Stroustrup。 为例
M-x customize-variable c-default-style(并为C++_设置你喜欢的风格)。