外部スクリプトを使用しない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 *

と書いてしまうのもありかな、と思う。


最後に

本当に全然関係ないけど、訳あって、
vimスクリプト関連情報を扱っているサイトの情報を収集しています。
何か知ってたら教えてほしい。


特に海外のサイト!!