Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2010-06-16

シェルを求めて三千里〜悠久のvim編〜

タイトルに深い意味はありません。

さて、vim強化月間ということで、vim による開発作業の能率を上げるべく、色んなプラグインに手を出してあれこれ試しています。中でも、「vimシェルとのシームレスな連携」はひとつの大きな課題であって、自分が vim を使う上でイケてない部分でもあるので、なんとかここを改善しようとここ数日あれこれ模索していました。

vimshell

まず、シェルとのシームレスな連携というと、vimバッファの中でシェルが動いて欲しい、というのがあります。ウィンドウを分割して上半分が編集中のソース、下半分がシェル、というような感じ。これなら、双方ともに vimバッファなわけですから、コマンドライン編集に vim の機能が使えたり、シェルで実行したコマンドの出力も、通常の vimバッファコピペ(y と p)で持ってこれたりして便利なわけです。

vimshell は 100% Vim script によって実装されたシェルで、まさに上記の要求を満たしているのですが、前のエントリでも述べた通り、

といったことがあって、自分としてはできたら vimバッファ内で zsh が動いて欲しいわけです。

シェルの設定が二重化する問題については、一方の設定ファイルから他方のそれを生成すればいいじゃんと、自分でツッコミを入れてはみたものの、そこまでするよりは zsh を動かそうよ、という心の声には勝てないのでした。

vimshell から zsh を起動する方法もあると作者の Shougoさんに教えてもらいましたが、iexe を使って起動したコマンドは対話セッションが別バッファになってしまったりして、自分が求めているものとは違いました。

:shell

で、結局 :shellzsh を立ち上げて使うのが一番ラクだわ、という(半ば思考停止な)結論になってしまったのが前のエントリなのですが、これは元の木阿弥というか、「vimシェルとのシームレスな連携」の改善になっていません。

>実行している間はVimが止まってしまいます。

あまり格好良くはありませんが、別タブで(;^ω^)


>コマンドの出力もバッファにとれない

あまり格好良くはありませんが、xsel とかマウスによるコピペで。

この格好良くないところをどうにかしようというのがそもそもの問題意識であったはずなので、これで話が落ちてはいけないわけです。

Conque

で、vimバッファ内で zsh を動かすには vim上で動く端末エミュレータが必要なのだということになり、行き着いたのが Conque というプラグインです。


Vim-users.jp - Hack #142: Vimでシェルを起動する


vimprocやvimshellをもとにNico Raffatoさんが製作しているConqueというプラグインがあります。まだVer.1.0がリリースされたばかりですが、現在も精力的に開発されています。 これは内部でPythonインタフェースを用いて外部プロセスとの通信を行っているので、安定性に難があるのと、Pythonインタフェースが必須になっています。 Emacsのansi-termを目標にしているようで、端末としてはかなりの完成度を誇ります。 ただし日本語が使えなかったり、Windows環境で動作しないという問題があります。 キー入力をすべて奪いとってしまうので、他のプラグインとの連携もしづらいです。 Emacsも内部で動かせるなど、ネタとしてはかなり面白いのですが……。

これを使って zsh を起動するのが自分が求めているものに一番近いです。幸い、Ubuntu だと普通に Python もあるし、vim にも Pythonインタフェースがあるので、プラグインインストールするだけで普通に使えました↓

f:id:h1mesuke:20100616152119p:image

シェルを2つ立ち上げたところ、中段は zsh で、下段はそこからさらに irb

Pythonインタフェースが必須とのことで、環境を選ぶプラグインではありますが、端末エミュレータという土台を提供してくれるのでその応用範囲は広く、シェルだろうがページャだろうが、tail -f だろうが irb だろうが emacs だろうが動かせるというのは非常に強力です。

今回の vim上で動くシェル探訪の旅はひとまずここで終着かなと。

ShougoShougo 2010/06/17 11:27 vimshellの作者です。こんにちは。
> vimshell から zsh を起動する方法もあると作者の Shougoさんに教えてもらいましたが、iexe を使って起動したコマンドは対話セッションが別バッファになってしまったりして、自分が求めているものとは違いました。
これにもはっきりとした理由があるのですが……。私は別バッファになったほうが好きです。
コマンドごとにカスタマイズができるので。
vimshellバッファが欲しくないなら、:VimShellInteractive zshが使えます。こちらも試してみてください。

> 端末エミュレータという土台を提供してくれるのでその応用範囲は広く、シェルだろうがページャだろうが、tail -f だろうが irb だろうが emacs だろうが動かせるというのは非常に強力です。
ページャが動くのはいいですよね。vimshellもいつかはConqueのようなモードを搭載するかもしれません。Conqueはひどく動作が遅いのが欠点です。Vimにタイマー機能がない以上、仕方のないことですが。あと、EmacsやVimはネタとして動かすのにはいいですが、使い物にはなりません。
Conqueのアプローチではneocomplcacheが使えないのも、私にとっては致命的です。
理想的にはcursesを使う端末アプリケーションだけ、conqueのような完全端末モード、それ以外はiexeのようなライン端末モードで動かせるといいなと考えています。