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オプションなんかもいいかもね。行番号振ったり。