【问题标题】:AStyle nested class formattingAStyle 嵌套类格式
【发布时间】:2012-09-02 13:01:56
【问题描述】:

我的项目中有以下代码:

class RangeConverter {
private:
    struct Converter {
                    double MinimumInput;
                    double MaximumInput;

                    double MinimumOutput;
                    double MaximumOutput;

                    template <typename RangeType>
                    RangeType Convert ( RangeType invalue ) const {
                        double v = static_cast<double> ( invalue );
                        if ( v < MinimumInput ) {
                            v = MinimumInput;
                        } else if ( v > MaximumInput ) {
                            v = MaximumInput;
                        }
                        double interpolationfactor = ( v - MinimumInput ) / ( MaximumInput - MinimumInput );
                        return static_cast<RangeType> ( ( interpolationfactor * ( MaximumOutput - MinimumOutput ) ) + MinimumOutput );
                    }
                };
.....

使用 AStyle 格式化该代码后,我得到以下信息:

class RangeConverter {
private:
    struct Converter {
        ngeConverter {
        private:
            struct Converter {
                double MinimumInput;
                double MaximumInput;

                double MinimumOutput;
                double MaximumOutput;

                template <typename RangeType>
                RangeType Convert ( RangeType invalue ) const {
                    double v = static_cast<double> ( invalue );
                    if ( v < MinimumInput ) {
                        v = MinimumInput;
                    } else if ( v > MaximumInput ) {
                        v = MaximumInput;
                    }
                    double interpolationfactor = ( v - MinimumInput ) / ( MaximumInput - MinimumInput );
                    return static_cast<RangeType> ( ( interpolationfactor * ( MaximumOutput - MinimumOutput ) ) + MinimumOutput );
                }
            };
.....

astyle 命令:

astyle
    \   --style=java
    \   --indent=force-tab=2
    \   --indent-classes
    \   --indent-switches
    \   --indent-labels
    \   --indent-preprocessor
    \   --indent-col1-comments
    \   --pad-oper
    \   --pad-paren
    \   --delete-empty-lines
    \   --add-brackets
    \   --align-pointer=type
    \   --align-reference=type

这是样式的错误,还是我忘记了任何选项? 如果这是一个错误,你有什么建议用 VIM 格式化 C++ 代码?

【问题讨论】:

    标签: c++ vim formatting astyle


    【解决方案1】:

    当然,这是一个错误。如今,AStyle 并没有得到很好的支持。有很多 bug 一直存在,从未得到解决。你不应该期望在最近的将来情况会有所改善。我强烈建议切换到Uncrustify。当然,它也有一些问题,但它们并没有那么讨厌,也不会像 AStyle 那样破坏你的代码。它有数百个配置选项 - 比 AStyle 灵活得多 - 所以请耐心等待,您将不得不花一些时间来调整它以适应您的口味和惯例。

    完成后,如果您想将其与 Vim 正确集成,请在此处输入您可以添加到 .vimrc 中的代码:

    " Restore cursor position, window position, and last search after running a
    " command.
    function! Preserve(command)
      " Save the last search.
      let search = @/
    
      " Save the current cursor position.
      let cursor_position = getpos('.')
    
      " Save the current window position.
      normal! H
      let window_position = getpos('.')
      call setpos('.', cursor_position)
    
      " Execute the command.
      execute a:command
    
      " Restore the last search.
      let @/ = search
    
      " Restore the previous window position.
      call setpos('.', window_position)
      normal! zt
    
      " Restore the previous cursor position.
      call setpos('.', cursor_position)
    endfunction
    
    " Specify path to your Uncrustify configuration file.
    let g:uncrustify_cfg_file_path =
        \ shellescape(fnamemodify('~/.uncrustify.cfg', ':p'))
    
    " Don't forget to add Uncrustify executable to $PATH (on Unix) or 
    " %PATH% (on Windows) for this command to work.
    function! Uncrustify(language)
      call Preserve(':silent %!uncrustify'
          \ . ' -q '
          \ . ' -l ' . a:language
          \ . ' -c ' . g:uncrustify_cfg_file_path)
    endfunction
    

    现在您可以将此函数 (Uncrustify) 映射到组合键,也可以使用我使用的方便技巧。创建一个文件 ~/.vim/after/ftplugin/cpp.vim,您可以在其中覆盖任何 Vim 设置,特别是针对 C++ 的设置,并在其中添加以下行:

    autocmd BufWritePre <buffer> :call Uncrustify('cpp')
    

    这基本上添加了一个预保存挂钩。现在,当您使用 C++ 代码保存文件时,Uncrustify 将使用您之前提供的配置文件自动对其进行格式化。

    注意:这里介绍的所有内容都经过了很好的测试,并且我每天都在使用。

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 1970-01-01
      • 2017-12-29
      • 2011-12-13
      • 1970-01-01
      • 2018-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多