[vim][python] vim を python で拡張し,anything-like なインターフイスで実行する。

Vim のコマンドは沢山あってたまにしか使わないものは覚えられない。
特定の時期に頻繁に使って、専用のキーバインドを設定しても、暫く使わないとそんなキーバインドを設定した事すら忘れてしまう。
というのに困ってる人は俺だけではないはずだ。

Emacs はそれぞれの機能が emacs-lisp の関数として実装されていて、わりと分かりやすい名前がついている。
anything という超強力なプラグインのおかげで、大量にある elisp の関数をあいまい検索して実行できるようになったから、これによって「うろ覚え」でも関数を呼べるようになった。
つまり、覚えなくてもよくなったって事。

こういうのが Vim にもあれば便利だ。
実際にいくつかプラグインがあり、fuzzyfinder, ku, unite がある。どれも日本人が作ってるってのがすごい!
unite はまさに Vim 版 anythong を志向しているようで、おそらく決定版になるだろうと思う。
俺も先週ぐらいから unite を使っていて、もうちょっとしたら fuzzyfinder は使わなくてすむようになると思う。


ああ、前置きが長くなってしまった。
本題。
python のお勉強をしている。
pythonVim を気軽に拡張したい。
つくった python の関数を anything like なインターフェイスで、ランチャのように起動したい。
と妄想して、それっぽいものを作った。
なんせ、python の初心者(先週の水曜ぐらいからか始めた)なのと、まだ module , class, 変数の scope とかもちゃんとわかってないレベル
で書いてるので、とりあえずでっち上げたというレベルですが。。バグバグですが、アイデア共有ってことで。

vimrc に

nnoremap <D-f><D-p> :python vim_py()<CR>
vnoremap <D-f><D-p> :python vim_py()<CR>
pyfile "~/.vim/plugin/pyvim_anything_like.py"

みたいに設定して、 で呼び出し、候補を絞り込んで実行。という流れ。
python の docstring がそのままランチャの help なる。
インターフェイスは CommandT をかなりパクって作ってます。

画面はこんな感じ


vim で if_python を使用し、Python,VimScript 間で変数を交換する。

VimScript は JavaScript に似ていると思ったが、それよりも Python に似ている気がする。
Vim は VimScript という専用言語を使用し、動作を拡張出来るが、VimScript の代わりに Ruby や、Python で拡張する事も出来る。

Vim の拡張言語としての Python のサポートは Ruby のものより強力だ。
大きくは下記の2点。

  1. range が取れる。※range object
  2. 辞書、リストをそのまま取り込める。

Vim拡張機能を VimScript ではなく、RubyPython のような汎用言語で書く事についての考察は下記が詳しい。

http://items.sjbach.com/97/writing-a-vim-plugin

最近 Python を勉強し始めたんですが、目的が必要なので、PythonVim を拡張する方法について調査しながら Python を勉強している。
下記は、Python、VimScript 間で変数を交換する方法のサンプル。
:help にあるように、Vim => Python 間では、数値は文字列になる点に注意が必要。

vimでコードの折りたたみ( fold )をイケてる感じにする。

長いコードは、適当に折り畳んで、全体の外観を把握したり、移動しやすくしたりしたい。
vim の折り畳みの表示は set foldtext=関数 とする事でカスタマイズできます。
github に良さそうなサンプルがあり、見た目とその他を自分の希望にあうように修正した。
下記にあります。

http://github.com/t9md/vim-foldtext

$HOME/.vim/plugin におけばOK。
俺の修正分は下記

http://github.com/t9md/vim-foldtext/commit/372949f490faa34e5fd480041c48fc92a68746df

こんな感じの見た目です。colorscheme は railscasts を使ってます。

iTerm の透明度をコマンドラインから設定する。

rb-appscript gem を使用してコマンドラインから iTerm を操作する。
今回は透明度の設定。

基本的な知識は id:keyesberry:20100315:p1 によく書かれている。すばらしい!

別に AppleScript 直接でも行けます。ただ、Ruby の方が書きやすいので、いろいろやるなら、Ruby 経由の方が良さそう。

引数は、0-10 まで。
chmod +x で実行権限つけて、$PATH の通ったとこに置く。
$transparency 10 で透明度最大。

vim でテキストを簡単に移動、コピーする。

vim でテキストを簡単に移動、コピーするTIPS。
下記を .vimrc に追加して再起動。
キーバインドは適当に変えてください。

移動

mode key action
visual C-j 下に移動
visual C-k 上に移動
visual C-h 左に移動
visual C-l 右に移動

コピー

mode key action
visual D-d 下にコピー
normal D-d 下にコピー

CopySelectedText() の第二引数に'1'を渡すと、コピー後に選択範囲が元の選択範囲に留まる。※ デフォルトは新しくコピーされたテキストに追随する。

典型的な使い方。visual 選択後, で選択範囲を下にコピー。そのまま、で位置を調整。
はMacVim で Command-d

terminal-table で ANSI Colorize された文字でテーブルのカラムがずれる。(gist paste test)

gist を貼付けるテスト。
terminal-table gem が ANSI Colorize された String の 文字を考慮しないので、Colorize された Cell の Column がずれてしまう。
ANSI Colorize されている、ということは String なので、これを モンキーパッチで to_s を再定義し、ANSI Escape Sequence を取り除く。
そうすると表示がずれない。