2013/02/18

Vim から zsh を呼ぶ プラギン 紹介

Advent Carender ぶっちぎってしまいましたねすいません(´・ω:;.:...

この記事はVim Advent Calendar 2012 : ATND 80日目の記事になります。
79日目は @rbtnnさんの「Vimの正規表現`\%`は結構便利だよ」という話



ProVimmerの方々はVimShellをお使いのことと思いますが
既存のshellと同様に使うには最初に幾分かの設定が必要だったりします。
shellスクリプトも異なっているようですし。

自分も一時期使っていましたが、なかなか慣れずに
Console Vim派でもあるので<C-Z>か:shell、普通に一旦閉じるに戻ってしまいました。

しかし、先日
なかなか良さげなプラギンを見つけたので紹介します。

Conqueというターミナルのインターフェースのような感じのものです。
shell以外にもターミナル上のもの(例えばemacsなど呼び出せます)
zshもzshrc, zshenvの設定のままで使えます。


((((;゚Д゚))))


とりあえず設定を以下に


NeoBundleLazy 'http://conque.googlecode.com/svn/trunk/', { 'autoload' : { 'commands'  : ['ConqueTerm', 'ConqueTermSplit', 'ConqueTermTab', 'ConqueTermVSplit'] } }

" Conque
let g:ConqueTerm_ReadUnfocused = 1
let g:ConqueTerm_CloseOnEnd = 1
let g:ConqueTerm_StartMessages = 0
let g:ConqueTerm_CWInsert = 1
noremap <silent> <Leader>sh :ConqueTermVSplit zsh<CR>

" Conque
function! s:delete_ConqueTerm(buffer_name)
    let term_obj = conque_term#get_instance(a:buffer_name)
    call term_obj.close()
endfunction
autocmd BufWinLeave zsh\s-\s? call <SID>delete_ConqueTerm(expand('%'))

NeoBundleLazyは別にNeobundleでも構わないですが、起動高速化のためにLazyにしてあります。


:ConqueTermVSplit hogehoge

で、ターミナル上で動作するプログラムをVim上で操作出来るようになります。
※ただし、インサートモードのみ


さて、このプラギンの欠点は、例えば、zshを起動し、そのバッファを閉じた場合
zshプロセスが残ってしまうということです。

そこでもう一度、zshを起動すると別プロセスで立ち上がります。
Vimを終了するまでは消えないようです。
iTerm2などから確認出来ます。

まあ、終了すればいいのですが、やっぱりVimに引きこもりたいです。

そこで、対策としてでしょうかConque自体がいくつかのAPIを提供していますので
上記のように、autocmdを使って、zshバッファのとき、バッファ名からConqueの生成したプロセスを終了できます。

これで、プロセスが何重にもなることを防げます。


こうして、どんどんVimに魔改造が施されていくわけですね

2013/02/20追記
https://twitter.com/tyru/status/304203604795994112
tryuさんより以上のご指摘を受けました。
ここを参照

うーん、でも動いてる感じが…
修正できたらまた追記します

2013/02/03

VimのイカしたPowerLineが新しくなってた

はい、なってましたね
VimだけじゃなくてShellまでかっこよく出来るようになるとかなんとか

しかし、思ったより手間だったのでメモ


以下はMacです
加えてFontへのパッチはうまく出来ませんでした
fontforgeのためにhomebrewに変えるのがめんどうで…

環境は以下
Mac OS X Lion
Python27(Mac標準のAppleのやつ)
iTerm2
MacPorts

基本的にここに書いてあるとおりにすれば問題は無いはずです。

Python版のVimについては
MacPortsもしくはHomeBrew、自分でビルドのどれかで入れます。
いつもどおりビルドしました。


以下の手順はドキュメントのコピペです。

portで使うpythonをappleのものに変更
もしかすると上の3つも変更後にやったほうがいいかもです

Pythonを使うのでpipなるパッケージマネージャを入れて、PowerLineのインストール
上の3つはオプションでらしいですが入れておきます。

sudo port select python python27-apple
pip install --user pygit2
pip install --user mercurial
pip install --user psutil

pip install --user git+git://github.com/Lokaltog/powerline

ここでも、よくわからないのですがMacPortsでインストールしたgcc48とかだと
pipのinstall時にコンパイラオプションかなんかのエラーでできませんので
Mac標準のgcc42の方でやるとインストール出来ます。

pygit2はヘッダファイルあたりの関係でインストールできなかったのでしてません
一応動いたし多分大丈夫…

次に以下を.vimrcへ書き込みます

" NeoBundle 'git://github.com/Lokaltog/powerline.git'
python from powerline.bindings.vim import source_plugin; source_plugin()
source ~/.vim/bundle/powerline/powerline/bindings/vim/plugin/source_plugin.vim

初めは下の2行をコメントアウトして、
NeoBundleでgitからPowerLineを持ってきます。

持ってきたらNeoBundleで読み込まれると困るのでコメントアウト
下の2行をコメントアウト解除

ここでiTerm2を使っている場合は注意が要ります。
バージョンが低いとbugのせいで表示できません
こちらの中で新しいのを入れておけば問題ないはずです。

さて、Fontの準備ができていればこれでもう動くはずです。

できていない場合はドキュメントの通りにパッチを当てて下さい
私はできなかったので公式のfontをダウンロードしてきて
iTerm2の設定でRictyと組み合わせて使ってます。