Emacs缩进支持C ++ 11语法?

时间:2013-11-18 23:27:03

标签: c++11 emacs

现在C ++ 11已经出来了,我想知道当越来越多的代码从C ++ 98迁移到C ++ 11时,是否有任何关于改进Emacs缩进支持的技巧。

示例:

以下是我发现自己在努力解决的一些可疑问题:

struct m {
    int a;
    char b;
};

std::vector<m> foo { {1, 'a'},
        {2, 'b'},
            { 3, 'c'},
                { 4, 'd' }};

我更喜欢

std::vector<m> foo { {1, 'a'},
                     {2, 'b'},
                     { 3, 'c'},
                     { 4, 'd' }};

甚至

std::vector<m> foo { {1, 'a'},
        {2, 'b'},
        { 3, 'c'},
        { 4, 'd' }};

例如。

下一个:

cout << 5
     << [](int a) {
    return 2 * a;
} (5);

我更喜欢

cout << 5
     << [](int a) {
            return 2 * a;
        } (5);

以便块相对于lambda缩进。

我发现自己花了更多时间在缩进上,这很烦人。

是否有任何包或自定义有助于缩进现代C ++ 11代码?

(旁注:我为Emacs设置了clang-format,但是我不能100%兼容现有代码,而且它还不能很好地理解C ++ 11语法。有时它仍然很有用并且听起来很有用对新项目来说是一个好主意。)

3 个答案:

答案 0 :(得分:3)

我只是手动安装了最新的CC Mode 5.33 from SourceForge,它应该涵盖您要查找的大部分内容:

  

现在应该完全支持C ++ 11,以及C ++ 14的一些功能:

     
      
  • 统一初始化
  •   
  • Lambda函数
  •   
  • 参数包
  •   
  • 原始字符串
  •   
  • 整数文字中的分隔符
  •   
  • &#34;&GT;&GT;&#34;作为双模板ender
  •   
  •   

以下是我为您的示例所获得的缩进:

struct m {
  int a;
  char b;
};

std::vector<m> foo { {1, 'a'},
                     {2, 'b'},
                     { 3, 'c'},
                     { 4, 'd' }};

cout << 5
     << [](int a) {
          return 2 * a;
        } (5);

我还建议按MELPA中的建议安装modern-c++-font-lock(例如通过this SO answer)。

答案 1 :(得分:1)

查看ClangFormat

  

ClangFormat描述了一组构建于其上的工具   LibFormat。它可以通过多种方式支持您的工作流程,包括   一个独立的工具和编辑器集成。

它集成在emacs中:

(load "<path-to-clang>/tools/clang-format/clang-format.el")
(global-set-key [C-M-tab] 'clang-format-region)

您有many options来定义C ++ 11及更高版本的缩进样式。

  

Clang-Format样式选项描述可配置的格式样式   LibFormat和ClangFormat支持的选项。

几个例子:

  • AlignTrailingComments
  • AlwaysBreakTemplateDeclarations

答案 2 :(得分:-3)

当我使用emacs时,以下设置足以让我缩进代码:

; auto indent   
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)

(define-key global-map (kbd "RET") 'newline-and-indent)
(defun indent-buffer ()
  (interactive)
  (save-excursion
    (indent-region (point-min) (point-max) nil)))
(global-set-key [f12] 'indent-buffer)

希望它有所帮助。