こんにちは!
気分爽快! と、調子に乗って7分丈のシャツにしたらすごい寒かったです。
さて、2014/5/25に第2回 Sapporo.vim に参加させてもらいました。
特に何かしたいことはなかったんですが、Vimの勉強会があるなんて都会っぽいなーと思いつつ参加しました。
とはいえ、せっかく参加したのでvimで何かできるようにしたいと思い考えたところ、前回のpython sapporoで中村さんがemacsを使って行っていた「バッファ(?)からipython側に関数をロードして実行する」ということをvimでできるようにすることにしました。
終始もくもくしながらipythonのドキュメントを見てました(vimは・・・)。
結果、ivanov/vim-ipython を使うだけで十分ということがわかりました!プラグインバンザイヽ(^o^)丿
では、ipython自体を使いこなせていないのでイマイチな説明ですが、vim-ipythonについて書いてみます。
準備
まずは、プラグインをインストールします。NeoBundleの使い方はぐぐってください・x・
[code]
NeoBundle ‘ivanov/vim-ipython’
[/code]
次にterminalを開いてipythonを起動します。このとき、ipython consoleで起動します。
[code]
ipython console
[/code]
そうすると、~/.ipython/profile_default/security 配下にkernel-****.jsonというファイルができるので、****のところを覚えます。
これはipython kernelでもOKです。ipython kernelを実行すると画面上にpidファイル名が表示されるのでより楽ですが、その場合、対話型インタフェースを使いたいときは、別途[code]ipython console –existing[/code] で接続します。
次にterminalからhoge.pyを開きます(ファイルはなくてもいいよ)。
[code]vim hoge.py[/code]
そこでIPythonコマンドを実行します。
[code]:IPython ****(さっき覚えてた数字)[/code]
これで準備完了!
バッファの内容をipythonに投げてみる
vim-ipythonのデフォルトのキーマップは次のようになっています。
map <buffer> <silent> <F5> <Plug>(IPython-RunFile)
map <buffer> <silent> <S-F5> <Plug>(IPython-RunLine)
map <buffer> <silent> <F9> <Plug>(IPython-RunLines)
map <buffer> <silent> <LocalLeader>d <Plug>(IPython-OpenPyDoc)
map <buffer> <silent> <LocalLeader>s <Plug>(IPython-UpdateShell)
map <buffer> <silent> <S-F9> <Plug>(IPython-ToggleReselect)
なんとなくRunFile、RunLine、RunLinesあたりがいい感じになりそうです。
vim hoge.py でvimを開いたら、
[code]
def func1():
return ‘func1’
[/code]
という関数を書いてみます。
書いたら行選択で2行選択して、<F9>を押します。
(私の環境ではF9がうまく行かなかっったりしたので、別のキーに割り当てました。)
こうすることで関数部分だけをipython側で実行させることができます。
うまくいくと実行結果が表示されます。ipython consoleで起動したipythonの方で、func1() を実行してみると実行できることがわかります。
これがやりたかったやつです。できてよかった。
しかし、vimで :IPython を実行するとき、~/.ipython/profile_default/security/のファイルを見てpidを覚えて入力するというのは面倒です。
もうちょっと楽にipythonに接続する
pidを指定しないで接続できれば記憶力の乏しい私でも使いやすいので、その方法を探してみたところ、IPythonのfind_connection_file関数に * を渡してやると一番新しく起動したipythonの設定ファイルのパスを返してくれるということがわかりました。
というわけで、vim-ipythonのソースをちょっと変更します。
[code]
diff –git a/ftplugin/python/ipy.vim b/ftplugin/python/ipy.vim
index 5c88db7..2f081a1 100644
— a/ftplugin/python/ipy.vim
+++ b/ftplugin/python/ipy.vim
@@ -116,6 +116,8 @@ def km_from_string(s=”):
such as ‘–shell=47378 –iopub=39859 –stdin=36778 –hb=52668’ for IPython 0.11
or just ‘kernel-12345.json’ for IPython 0.12
"""
+ if s.strip() == ”:
+ s = ‘*’
from os.path import join as pjoin
try:
import IPython
[/code]
これで、:IPython したときに何も引数がなければ、一番新しく起動したipythonに接続できるようになりました。かなり楽になりました。
しかし、実はこのプラグイン ftplugin となっていてpythonでしか動作しません。気軽に vim を生起動して、pythonコードを適当に書いて、ファイルに保存しないで実行! なんてことができないのです。
ファイル名を指定しないでvimを起動した時にも使えるようにする
:set filetype=pythonとすればいいのですが、ここはばっさりとプラグインのftpluginディレクトリをpluginに変えてみたり、.vimrcに set filetype=python とガツンと書いてもいいです。
これで気軽にvimを起動して、ipythonに渡せるようになりまし・・・
いや、まだipythonが別のterminalで動いている、というの気に食わないです。
ipythonもvimの中で
といっても、VimShellで動かすだけです。
nmap <silent><space>is <Esc>:sp<CR><Esc><C-w><C-w><Esc>:VimShell<CR><Esc><C-w><C-w>:VimShellSendString ipython console<CR>
というわけで、こうなりました。
正直なところ、VimShellでipythonするより、tmuxでsplitしてipythonを動かした方が使いやすい気がします。
しかし、すごくいい感じでもないですが、自分のケースとしては必要十分です。
hoge.py, a.py, b.py といった「とりあえず実行させたかっただけの謎ファイル」が量産されなくなりそうだし、
誰かにコードを書いて見せるときもかなりやりやすくなりそう!