vim tips

filterおもすれー。
ってことでfilterのtips
というか外部コマンド呼び出し?


今回のターゲットはこれ→「!」
とりあえず

:!何かコマンド

でコマンドを実行できるスグレモノ。
ふとターミナルに戻りたい、でもファイル複数開いてるし、閉じて開き直すのめんどい、って時とかに

:!bash

とかやるとちょっぴり幸せ。
exitでbashを終了させればvimに戻ってこれるという。


これだけだとただの実行、つながりが無い。
そこでfilter


例えば

scale=1000; 4*a(1)

とか書いておいてその行で

!!bc -l[Enter]

とか打つと

3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610\
45432664821339360726024914127372458700660631558817488152092096282925\
40917153643678925903600113305305488204665213841469519415116094330572\
70365759591953092186117381932611793105118548074462379962749567351885\
75272489122793818301194912983367336244065664308602139494639522473719\
07021798609437027705392171762931767523846748184676694051320005681271\
45263560827785771342757789609173637178721468440901224953430146549585\
37105079227968925892354201995611212902196086403441815981362977477130\
99605187072113499999983729780499510597317328160963185950244594553469\
08302642522308253344685035261931188171010003137838752886587533208381\
42061717766914730359825349042875546873115956286388235378759375195778\
18577805321712268066130019278766111959092164201988

みたいな感じで円周率が出てきたり。

分かりづらい例ですいません...。

:{範囲}!{コマンド}

をやったときには{範囲}にある文字列を標準入力として{コマンド}になげてやって、その標準出力で{範囲}を上書きする。ということ。
つまり選択範囲を外部コマンドというフィルターに通してやる、と言う感じ。


もうちょっと有用な例を挙げるとメールとかをvimで読んでたら

--Boundary-00=_RClTHSt7Eq/zCXu
Content-Type: text/plain;
  charset="us-ascii";
  name="message.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
        filename="message.txt"

44GT44KM44Gv5re75LuY44OV44Kh44Kk44Or44Gn44GZ44CCCg==

--Boundary-00=_RClTHSt7Eq/zCXu--

みたいにファイル名からするとtextなのだが、base64になってる。
とかこういう場合には"44GT.."の行にカーソル移動させて

!!base64 -d

とかやってやると("!!" = ":.!")

--Boundary-00=_RClTHSt7Eq/zCXu
Content-Type: text/plain;
  charset="us-ascii";
  name="message.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
        filename="message.txt"

これは添付ファイルです。

--Boundary-00=_RClTHSt7Eq/zCXu--

とめでたくファイルの一部分だけbase64デコードができるようになると。
"u"で元に戻すなり、":q!"で変更を破棄することを忘れない用に。


あとよく例に挙げられるのがtac。
tacコマンドは標準入力を行毎に逆順にするコマンド。
なので

1
2
3
4
5

なんてファイルがあったときに("!!seq 1 5"で簡単に作れる)

:%!tac[Enter]

とやってやると("%"は全行を表す範囲

5
4
3
2
1

となるわけ。

まぁ、逆順にするんだったらglobal使って

:g/./m0

でもできるんだけどね...。tacとかないwindowsでも動くし。
globalもカナリ便利。

あとよく使うのはhead,tail,catなど。
マウス使ってコピペでもいいけど、そのままフィルタで持ってくるとなおクール。
catの-nオプションなんかもいいかもね。行番号振ったり。