Vim の設定と Vim / Notepad++ 間のタブ表示の不一致

一般

完全な Vim 設定は、次を実行するとインストールできます。

git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh

カスタム設定を追加したい場合は、次のファイルを編集します。

vim ~/.vim_runtime/my_configs.vim

インデントを一貫させるための基本的な Vim 設定は次のとおりです。

set shiftwidth=4             " used by >>, << and tab.
set tabstop=4                " number of space characters used when displaying TAB
set expandtab                " replace TAB by spaces
set softtabstop=4            " will erase 4 spaces at once when using BS in the beginning of lines only

これらのオプションの意味は次のとおりです。

  • shiftwidth=4: >><<、自動インデントなどのコマンドでインデントするときに 4 つのスペースを使います。
  • tabstop=4: 実際のタブ文字を幅 4 カラムとして表示します。
  • expandtab: Tab キーを押したとき、実際のタブ文字ではなくスペースを挿入します。
  • softtabstop=4: インデント 1 段分を 4 つのスペースとして編集しているように扱います。行頭のインデントを Backspace で削除するときも同様です。

既存のファイルで、現在の設定に従ってインデントを正規化したい場合は、Vim 内で次を実行します。

:%retab

expandtab が有効な場合、このコマンドはタブ文字をスペースに変換します。大きなファイルに使う前には、後で diff を確認するほうがよいです。インデント変更はバージョン管理上の差分が大きくなりやすいためです。

Python

Python では、4 つのスペースが標準のインデント幅です。同じ設定がうまく機能します。

set shiftwidth=4
set tabstop=4
set expandtab
set softtabstop=4

autocmd を追加して、Python ファイルだけに設定することもできます。

autocmd FileType python setlocal shiftwidth=4 tabstop=4 expandtab softtabstop=4

setlocal を使うと設定が現在のバッファに限定されるため、他のファイルタイプに予期せず影響することがありません。

C

C プロジェクトでは、タブ、スペース、またはプロジェクト固有の組み合わせが使われることがあります。インデントを変換する前に、そのプロジェクトで使われているスタイルを確認してください。

スペースを使う 4 スペース幅の C スタイルの場合は次のようにします。

autocmd FileType c setlocal shiftwidth=4 tabstop=4 expandtab softtabstop=4

1 つのタブを 8 カラム幅として表示する、タブベースの C スタイルの場合は次のようにします。

autocmd FileType c setlocal shiftwidth=8 tabstop=8 noexpandtab softtabstop=8

重要なのは、Vim のインデント設定をプロジェクトの既存のスタイルに合わせておくことです。

Vim と Notepad++ の不一致

Vim と Notepad++ の間でよく起きる不一致は、タブの扱い方が異なることに由来します。一方のエディタでは実際のタブを 4 カラムとして表示し、もう一方では 8 カラムとして表示することがあります。その結果、あるエディタでは揃って見えるファイルが、別のエディタでは崩れて見えることがあります。

Vim でファイルに実際のタブ文字が含まれているか確認するには、次を実行します。

:set list

マーカーを再び非表示にするには、次を実行します。

:set nolist

ファイルに 8 つのスペースのまとまりが含まれていて、それぞれを 4 つのスペースに置き換えたい場合は、次を使えます。

:%s/        /    /g

このコマンドは、ファイル全体で 8 つのリテラルスペースを 4 つのリテラルスペースに置き換えます。タブ文字は置き換えません。ファイルに実際のタブが含まれていて、現在の Vim のインデント設定に従って変換したい場合は、次を使います。

:%retab

実用的なワークフローは次のとおりです。

:set tabstop=4 shiftwidth=4 expandtab softtabstop=4
:%retab
:w

その後、Notepad++ でファイルを開き直し、タブ幅をプロジェクトのスタイルに合わせて設定します。特定の数値そのものよりも一貫性が重要なので、インデント規則を一度決め、そのファイルに使うすべてのエディタで同じ規則を適用してください。

Leave a Reply