从可变参数类型继承会弄乱 Emacs 中的模板成员函数缩进

问题描述 投票:0回答:1

在继承中解包

Ts
会为模板成员函数
void bar()
添加额外的缩进。我怎样才能摆脱多余的缩进?

template <typename ...Ts>
struct Foo: public Ts...
{
    Foo()
    {
    }

    template <typename U>
        void bar()
    {
    }
};

非解包继承效果很好:

template <typename T, typename U>
struct Foo: public T, public U
{
    Foo()
    {
    }

    template <typename S>
    void bar()
    {
    }
};

我的

.emacs

; Replace highlighted text
(delete-selection-mode 1)


(defun bb-cpp-style()
  (c-set-style "linux")
  (setq indent-tabs-mode nil)
  (setq tab-width 4)
  (setq c-basic-offset 4)

  (c-set-offset 'case-label '+)
  (c-set-offset 'statement-case-intro '+)
  (c-set-offset 'statement-case-open '0)

  (c-set-offset 'inlambda 'c-lineup-inexpr-block) ;
  (c-set-offset 'inline-open '0) ;

)

(add-hook 'c++-mode-hook 'bb-cpp-style)

; treat .h as c++
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))

预计:

template <typename ...Ts>
struct Foo: public Ts...
{
    Foo()
    {
    }

    template <typename U>
    void bar()
    {
    }
};
c++ linux emacs
1个回答
0
投票

与违规行相关的 cc 模式语法元素是

statement-cont
。您可以使用函数
c-show-syntactic-information
c-syntactic-information-on-region
查看语法信息。也许这些元素的解析方式存在一些问题,因为在您的两个版本的代码中该行被赋予了不同的语法名称 - 我不知道。

您可以尝试为

statement-cont
添加自定义缩进规则,即当它不是作业时,不要向
statement-cont
添加任何缩进。这很简单:

(defun my-lineup-statement (langelem)
  (or (c-lineup-assignments langelem) 0))

并在缓冲区中调用

(c-set-offset 'statement-cont #'my-lineup-statement)
进行测试(或将其添加到模式挂钩中)。这应该可以修复您所显示的情况下的缩进。

我在几个文件上进行了简短的测试,我注意到这一更改的唯一副作用是它删除了裸露的

=
后面的连续语句的缩进,如

int x =
1;  // before adding 'my-lineup-assignments this usually indented (depending on chosen c style)

在其他情况下,您可能希望

statement-cont
元素缩进。

© www.soinside.com 2019 - 2024. All rights reserved.