外部スクリプトを使用しないpythonによるフィルタリング処理
pythonを利用したフィルタリングをしたい。
でも、使い捨ての処理に外部ファイルをいちいち用意するのは面倒。
そんな人向け。
今は他の作業を抱えて時間無いから、あまりまとまった内容じゃないですよ。
まず、vim + pythonによる処理の基本
これを実行すると、
:python import sys :python from vim import *
これができるようになる。
" カレント行を出力 :python print current.line " カレントバッファの5行目を出力 :python print current.buffer[4] " 選択範囲の3行目を出力 :'<,'>python print current.range[2]
current.lineは読み書き可能なので、こうやってカレント行を変更できる
:python current.line = "test"
current.buffer、current.rangeの書き換え
current.buffer、current.rangeはヘルプによると、読み込み専用だが、
それはオブジェクトのことで、その持っているデータ自体は読み書きできる。
つまり、次のようにして、データを変更できる。
" 3行目置き換え :python current.buffer[2] = "test" " 選択範囲の5行目置き換え :'<,'>python current.range[4] = "test"
pythonで選択範囲にフィルタ的な処理をするには、こうすると良い
リスト内包表記使うべし。
これなら1行で書ける。実用に耐える。
:'<,'>python current.range[:] = ["test" + i for i in current.range]
pythonをわかる人なら、↑のコードを見ただけで、いろいろな応用方法が思いつくはず。
例えば、CSVの5番目の要素抜き出し
:'<,'>python current.range[:] = [i.split(",")[4] for i in current.range]
行を増やす、減らす
元の行は残したまま、その後ろにデータを追加する。
ヘルプはappendで行を追加できると書いてあるが、↓は長くて書くのが面倒。
:'<,'>python current.range.append(["test" + i for i in current.range])
なので、こっちの方が書くのが楽でいいんじゃないだろか?
置き換え→やっぱり追加と考えが変わったときの修正量も少ないし。
:'<,'>python current.range[:] += ["test" + i for i in current.range]
むろん増やすだけじゃなくて、選択時の範囲より、置き換えデータの長さを減らすこともできる。
:'<,'>python current.range[:] = current.range[2:]
この方法の弱点
最初に
:python import sys :python from vim import *
ってやらないと使えないから面倒だ。
でも、イベントとか定義されてないから、処理直前に割り込むのは難しい。
面倒だと、そのうち使わなくなってしまう。
賛否両論あるかもしれないが、
pythonによるフィルタリングを多用するなら、
思い切ってvimrc設定ファイルで、
:python import sys :python from vim import *
と書いてしまうのもありかな、と思う。