4

私のプロジェクトには次のコードがあります。

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 ++コードをフォーマットするために何を提案できますか?

4

1 に答える 1

1

確かに、それはバグです。最近、AStyle は十分にサポートされていません。永遠にそこに留まり、解決されなかった多くのバグがあります。近い将来に状況が改善されると期待すべきではありません。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) をキーの組み合わせにマップするか、私が使用する便利なトリックを実行できます。特に C++ の Vim 設定をオーバーライドできるファイルを作成し、~/.vim/after/ftplugin/cpp.vimそこに次の行を追加します。

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

これは基本的に事前保存フックを追加します。ファイルを C++ コードで保存すると、以前に提供した構成ファイルを使用して Uncrustify によって自動的にフォーマットされます。

: ここに記載されているものはすべて十分にテストされており、私が毎日使用しています。

于 2013-03-17T07:01:31.990 に答える