Hack #143: 見た目を変えずにタブ文字とスペースを相互に変換する
Posted at 2010/04/30ツイート
プログラムのインデントには昔からスペース派とタブ派があり、どちらを使うかは個々人の好みによりますが、自分の流派と違うファイルを編集することになったとき、場合によっては自分の好みのインデント方式に変えたいこともあるでしょう。
行頭のインデントは置換で済んでしまうことも多いですが、それ以外の場所はタブの幅がまちまちで単純な置換は難しいこともあります。
:retab
:retab
コマンドを使うことで、見た目を変えずにタブ文字の幅を変えたりタブ文字とスペースを相互に変換することができます。
タブ幅を変える
:retab
コマンドを、新しい ‘tabstop’ の値を引数に指定して実行することで、タブ文字を含む連続した空白を新しいタブ幅で置き換えます。この時、’tabstop’ の値は指定した値に設定されます。新しいタブ幅でタブ文字で表現しきれない部分はスペースが使われます。
例: tabstop=8 (タブ文字を >——- で、インデント中のスペースを _ で表示しています)
int main(int argc, char const* argv[]) {
>--------int>---count>--= 0;
>--------char>--ch>-----= '0';
}
この状態で
:retab 3
を実行すると、
int main(int argc, char const* argv[]) {
>-->--__int>>--_count>--= 0;
>-->--__char>--_ch>-->--= '0';
}
となります。
このコマンドには範囲を与えることができますが、その場合でも 'tabstop'
の値は変更されるので範囲外の見た目が変わることになります。
タブ文字をスペースに変換する
'expandtab'
がオンの時にこのコマンドを使うと、結果はスペースで置き換えられます。この場合引数を与えることもできますが、'tabstop'
の値を変更する以上の意味はありません。
スペースをタブ文字に変換する
:retab
コマンドは「タブ文字を含む」連続した空白を置き換えるので通常スペースのみの部分は置き換えられません。しかし、! を付けた :retab!
を使えばスペースのみの部分もタブ文字に置き換えてくれます。
ただし、この場合意図しない箇所、例えば文字列リテラル中の空白も置き換えられてしまうので注意が必要です。その場合は :substitute
による行頭部分の置換の方が良いかもしれません。
%s@^\v(%( {4})+)@\=repeat("\t", len(submatch(1))/4)@
thinca
もどる
blog comments powered by Disqus