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さんより以上のご指摘を受けました。
ここを参照

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

コメント

このブログの人気の投稿

カーソルキーさん@つかわない インサートモード編

Android で MIME Type 判別

Elixir に入門したいので雑な 分散KVS を自作した