Emacs中可变参数类型继承致模板成员函数缩进异常的解决方法
Emacs C++可变参数模板继承时成员函数缩进异常的解决方法
问题描述
当结构体继承可变参数模板类型(public Ts...)时,类内的模板成员函数会出现多余缩进;采用非可变参数的多继承(public T, public U)时,缩进表现正常。
现有配置
; 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() { } };
正常代码示例(非可变参数继承)
template <typename T, typename U> struct Foo: public T, public U { Foo() { } template <typename S> void bar() { } };
期望缩进效果
template <typename ...Ts> struct Foo: public Ts... { Foo() { } template <typename U> void bar() { } };
解决方法
在你的bb-cpp-style函数中添加一行配置,强制继承列表的延续行缩进为0,避免Emacs将后续的模板成员函数误识别为继承列表的一部分:
(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) ; 新增:修正可变参数模板继承后的缩进问题 (c-set-offset 'inher-cont '0) )
修改后重新加载Emacs配置(M-x eval-buffer),再重新缩进代码(C-M-\),即可得到期望的缩进效果。
内容的提问来源于stack exchange,提问作者bbalazs
相关产品推荐
相关产品推荐

