Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Vimでbashコマンドを併用するとできること7選

Vimはexコマンド(:q:w)だけでなく、シェルコマンドを実行することができます。今回はシェルコマンドをつかってもっと便利に編集をしようという記事です。

基本: コマンドを実行したい行を指定

Vimのコマンドは、実行したい範囲を決めることができます。

  • :%!sort バッファ全体をソートする
  • :'<,'>!sed -e 'y/123/ABC/' 選択範囲でsedを実行する
  • :.!tr -d ' ' 現在の行の空白を削除する

一番前にある記号(%.'<,'>)がコマンドの実行範囲を表します。たとえば%ならバッファ全体、'<,'>なら選択範囲といった具合です。そのほかに行数を使った範囲指定などもありますが、主に使うのは上の3つだと思います。

基本: 外部のコマンドを実行する

外部のコマンドの実行結果を今のカーソル位置に挿入するには、!!と入力してからコマンドを指定するとできます。たとえば!!lsならカレントディレクトリのファイルを表示します。

範囲を指定する場合は、:(範囲)!(外部コマンド)とします。

1. 連番の作成

コマンド実行結果
!!seq 100 | tr '\n' ' '1 2 3 ... 99 100
!!seq 1001
2
...
100
!!echo {1..100}1 2 3 ... 99 100

ぼくは!!seq 100を実行してJで連結しています。

2. アルファベット26文字を列挙

コマンド実行結果
!!echo {a..z} | tr -d ' 'abcdefghijklmnopqrstuvwxyz
!!for i in {a..z}; do echo -n $i; done(同上)
!!echo {a..z}a b c d e f g h i j k l m n o p q r s t u v w x y z

僕はよく!!echo {a..z}を実行したあとに:s/ //gで空白を削除しています。

3. Awk

Awkが使えると選択範囲の総和といった操作がカンタンにできるようになります。

コマンド実行結果
:'<,'>!awk '{sum+=$0}END{print sum}'選択範囲の総和

4. 乱数列

shufコマンドは受け取った入力をランダムに並べ替えるコマンドです。さきほどの連番と合わせると結構なことができます。

コマンド実行結果
:.!seq 100 | shuf(1から100をランダムに入れ替えたもの)
:.!ruby -e 'p rand(1000)'(1から1000の範囲で乱数を生成)
:.!ruby -e '10.times do p rand(1000) end'(1から1000の範囲で乱数を10回生成)

5. sortコマンド

sortします。以上です。

sortはuniqコマンドやwcコマンドと組み合わせて使うことが多いです。

コマンド実行結果
:%!sort | uniq(バッファ全体をソートして重複を削除)
:%!sort | uniq -c(バッファ全体をソートして重複をカウント)
:%!awk '!a[$0]++'(ソートをせず重複を削除)

6. sedコマンド

選択範囲に対してsedを行うことができます。これは何気なく便利です。

7. インタプリタモードを使う

Ruby やNodeをインタプリタとして使うと、たとえば円周率を取得できたり、カンタンな計算ができたりします。

コマンド実行結果
:.!ruby -e 'p Math::PI'3.141592653589793
:.!node -e 'console.log(Math.E)'2.718281828459045
:.!ruby -e 'p rand(1..6)'(1から6の範囲で乱数を生成)