我有一个多层嵌套的命名空间:
namespace first {namespace second {namespace third {
// emacs indents three times
// I want to intend here
} } }
Emacs默认缩进到第三个位置。但是我只想要一个单独的缩进。
有没有简单的方法可以实现这个效果?
我有一个多层嵌套的命名空间:
namespace first {namespace second {namespace third {
// emacs indents three times
// I want to intend here
} } }
Emacs默认缩进到第三个位置。但是我只想要一个单独的缩进。
有没有简单的方法可以实现这个效果?
在命名空间内使用绝对缩进列:
(defconst my-cc-style
'("gnu"
(c-offsets-alist . ((innamespace . [4])))))
(c-add-style "my-cc-style" my-cc-style)
然后使用c-set-style使用自己的样式。
请注意,这仅在c++-mode中有效,c-mode不知道'innamespace'。
在 Emacs 23 中的 c++-mode 下,我需要这样做:
(defun my-c-setup ()
(c-set-offset 'innamespace [4]))
(add-hook 'c++-mode-hook 'my-c-setup)
要完全禁用命名空间中的缩进,请将[4]更改为0。
innamespace [0]
),而被接受的答案却不行。 - AlwaysLearning好的,至少在Emacs 21和22中似乎都可以工作:
(defun followed-by (cases)
(cond ((null cases) nil)
((assq (car cases)
(cdr (memq c-syntactic-element c-syntactic-context))) t)
(t (followed-by (cdr cases)))))
(c-add-style "foo"
`(( other . personalizations )
(c-offsets-alist
( more . stuff )
(innamespace
. (lambda (x)
(if (followed-by
'(innamespace namespace-close)) 0 '+))))))
第一种解决方案不支持像
构造这样的东西namespace X { namespace Y {
class A;
namespace Z {
class B;
}
}}
)
这对我有用,继承自cc-mode并将命名空间缩进替换为0,即禁用它的缩进。
(defconst my-cc-style
'("cc-mode"
(c-offsets-alist . ((innamespace . [0])))))
(c-add-style "my-cc-mode" my-cc-style)
C-q TAB
应该可以起作用。很遗憾,我认为emacs没有单独为嵌套命名空间设置样式。如果您进入内部行并执行C-c、C-o,您可以更改最顶层的intro样式,如果您运行customize-variable c-offsets-alist
,您可以编辑emacs具有的所有不同缩进选项,但是不存在适用于您特定用例的选项。您需要在elisp中手动编写它。