Vimで行を並べ替える(:sort)と重複行を消す方法
設定ファイルの環境変数一覧やCSSのプロパティを並べ替えたいだけなのに、外部ツールにコピペしていました。:sortだけでかなりのことができます。
| 指定 | これだけ覚える |
|---|---|
u | 重複行を消しながら並べ替える(フラグ) |
n | 数値として並べ替える(フラグ) |
i | 大文字小文字を区別しない(フラグ) |
:sort! | 降順にする |
基本の並べ替え
:sort " 昇順(行頭文字から)
:sort! " 降順
範囲を指定しなければファイル全体が対象になります。ビジュアルモードで行を選択してから実行すれば、その範囲だけを並べ替えられます。
重複行を消しながら並べ替える
:sort u " 昇順+重複排除
:sort! u " 降順+重複排除
uフラグを付けると、並べ替えと同時に重複した行をまとめて1行にしてくれます。設定ファイルから重複したインポート文を消す、リストアップした値の一覧からユニークなものだけを残す、といった用途に便利です。
banana apple banana cherry apple
:sort uapple banana cherry
数値として並べ替える
:sort n
デフォルトの並べ替えは行頭からの文字列比較になるため、2と10を比べると文字列としては10が先に来てしまいます。数値として正しい順序で並べたい場合はnフラグを付けます。
大文字小文字を区別せずに並べ替える
:sort i
デフォルトでは大文字が小文字より前に来る辞書順で並ぶため、Appleとbananaが期待と違う順序に見えることがあります。iフラグを付けると大文字小文字を無視して並べ替えられるので、人が読みやすい順序にしたいときに使えます。
特定のパターンを基準に並べ替える
:sort /パターン/
行頭からではなく、指定した正規表現パターンにマッチした部分より後ろを基準にソートしたい場合は、パターンを/で挟んで指定します。たとえばkey=value形式の行をvalue部分で並べ替えたいときなどに使えます。
:sortで昇順、重複を消したいならu、数値として並べたいならnを追加します。範囲を絞りたいときはビジュアル選択してから実行します。
重複したimport文が溜まっていくファイルで、以前は目視で1行ずつ確認して消していました。:sort uを知ってからは、範囲を選択して1コマンドで整理できるようになり、地道な作業がほぼ一瞬で終わるようになりました。数値ソートのnフラグを知らずに文字列順で並べて混乱したこともあり、覚えておいてよかったと思っています。
正規表現との組み合わせ
:sort /^\s*/
パターンを指定すると、そのパターンにマッチした部分を無視して、それより後ろの文字列を基準に並べ替えます。行頭の空白(インデント)を無視して中身のテキストだけで並べたい、といった場面で役立ちます。インデントの深さがバラバラなコードの断片を整理したいときにも使える発想で、覚えておくと応用範囲が広がります。パターンさえ工夫すれば、行頭以外のどんな基準でも並べ替えの軸にできる柔軟さが標準コマンドの強みです。外部ツールを持ち出す前に、まずこの範囲で足りないか確認する癖をつけておいて損はありません。
まとめ
:sortは昇順・降順・重複排除・数値ソートまで標準機能だけでこなせます。外部ツールに頼らず、Vimの中で完結させたい人は覚えておく価値があります。並べ替えの対象を絞り込みたいときは、:globalでマッチする行だけを集めてから:sortを当てると狙った範囲だけを整理できます。並べ替えではなく中身を書き換えたいなら:substituteが同じように範囲を取れます。