新答案
我遇到了您在问题中提到的确切要求。
我必须根据新项目的编码风格设置缩进。经过一番研究后,我使用以下方法实现了这一点自定义阵容功能.
修改你的my-cpp-mode
看起来像这样:
(defun my-c-lineup-inclass (langelem)
(let ((inclass (assoc 'inclass c-syntactic-context)))
(save-excursion
(goto-char (c-langelem-pos inclass))
(if (or (looking-at "struct")
(looking-at "typedef struct"))
'+
'++))))
(defun my-cpp-mode ()
"My C++ mode"
(c++-mode)
(c-set-style "K&R")
(setq c-basic-offset 4)
(c-set-offset 'access-label '-)
(c-set-offset 'inclass 'my-c-lineup-inclass)
;; ...
(setq mode-name "My C++")
)
如果这个答案可以接受,我将继续删除旧答案。
旧答案
根据您想要实现的目标,我可以建议采用不同的方法吗?您似乎希望访问标签处于与类和类成员不同的缩进级别。使用以下方法来实现这一目标。
(access-label . /)
来自 Emacs 文档:
如果 OFFSET 是符号之一+',
-', ++',
--', *', or
/'
然后将“c-basic-offset”的正倍数或负倍数添加到
基础压痕;分别为 1、-1、2、-2、0.5 和 -0.5。
这是我定义的自定义样式之一的片段。
(c-add-style
"xyz-style"
'((indent-tabs-mode . nil)
(fill-column . 75)
(c-basic-offset . 4)
(c-offsets-alist . (
(access-label . /)
(inextern-lang . 0)
(innamespace . 0)
(member-init-intro . ++)
))))
With c-basic-offset
设置为 4,(access-label . /)
向访问标签添加 2 个空格的负缩进。这是我在示例代码上的缩进模式的实际结果。
class A
{
// I ALWAYS use access labels in classes
public: // access-label
int member; // inclass
};
struct B
{
// I NEVER use access labels in structs
int member; // inclass
};
我推荐这种模式,因为成员变量/结构成员的缩进级别是一致的。 FWIW,谷歌C风格遵循相同的方法。
据我所知,人们无法区分类成员或结构成员(inclass
语法元素)。您可以使用M-x c-syntactic-information-on-region
对一个区域进行句法分析。对您的示例进行的一项此类分析得出以下结果。从输出来看,如果您位于类中或结构中,则没有什么可区分的。
class A // ((topmost-intro 1))
{ // ((class-open 1))
// ((inclass 64) (topmost-intro 64) (comment-intro))I ALWAYS use access labels in classes
// ((inclass 64) (topmost-intro 64))
public: // ((inclass 64) (access-label 64))access-label
int member; // ((inclass 64) (topmost-intro 64))inclass
}; // ((class-close 1))
// ((topmost-intro 503))
struct B // ((topmost-intro 503))
{ // ((class-open 629))
// ((inclass 694) (topmost-intro 694) (comment-intro))I NEVER use access labels in structs
// ((inclass 694) (topmost-intro 694))
int member; // ((inclass 694) (topmost-intro 694))inclass
}; // ((class-close 629))