gpt4 book ai didi

c++ - emacs:类和结构的不同缩进

转载 作者:可可西里 更新时间:2023-11-01 16:02:28 29 4
gpt4 key购买 nike

我正在尝试在 emacs 中实现以下缩进:

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
};

但是使用下面的配置文件...

(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 '++)
;; ...
(setq mode-name "My C++")
)
(add-to-list 'auto-mode-alist '("\\.[ch]p?p?\\'" . my-cpp-mode))

...我只实现了:

class A
{
public: // access-label
int member; // inclass
};

struct B
{
// this indentation is too long
int member; // inclass
};

当然是因为:

  • 对于缩进,“class”和“struct”显然没有区别(都是“inclass”),
  • “inclass”内容的缩进不依赖于访问标签的存在与否。

知道如何使类内内容的缩进依赖于类/结构或访问标签的存在吗?

最佳答案

新答案

我遇到了您在问题中提到的确切要求。我必须根据新项目的编码风格设置缩进。经过一些研究,我使用 Custom Line-up Functions 实现了这一点.

修改你的 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++")
)

如果这个答案可以接受,我会继续并删除旧答案。

旧答案

根据您要实现的目标,我可以建议一种不同的方法吗?您似乎希望访问标签的缩进级别与类(class)和类(class)成员不同。使用以下内容来实现这一点。

(access-label . /)

来自 Emacs 文档:

If OFFSET is one of the symbols +',-', ++',--', *', or/' then a positive or negative multiple of `c-basic-offset' is added to the base indentation; 1, -1, 2, -2, 0.5, and -0.5, respectively.

这是我定义的自定义样式之一的片段。

(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 . ++)
))))

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,Google C Style遵循相同的方法。

据我所知,无法区分类成员或结构成员(inclass sytax 元素)。您可以使用 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))

关于c++ - emacs:类和结构的不同缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715689/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com