Hack #142: Vimでシェルを起動する
Posted at 2010/04/26ツイート
VimがEmacsと比較して劣っているのは、コマンドの非同期実行だけではなく、シェルとの連携も挙げられます。ここでは現状のシェル呼び出しの問題点とEmacsとの比較、その解決方法について議論を行います。
:shellの欠点
Vimに搭載されている:shell
コマンドは、一時的にシェルを実行できます。しかし当然使用するシェルの設定に左右される上、実行している間はVimが止まってしまいます。
この状態ではコマンドの出力もバッファにとれないですし、VimScriptとの連携もできません。
さらにLinux上のGVimではエスケープシーケンスを解釈しない上、WindowsのGVimでは邪魔なDOS窓が一瞬開くという問題もあります。
根本的な問題として、WindowsのシェルであるCMD.exeは貧弱なので、使う気になれません。
かといって、Windowsの場合は代わりとなるシェルも選択肢が少ないです。
screenの欠点
:shellの代わりに、GNU screenやそれをforkしたtscreen、GNU screenの後継であるtmuxを用いるという解決策もあります。 しかしこれらのソフトウェアは端末を要求するため、当然Windows環境やGVimでは動作しません。 さらにscreen上で起動しているプログラムではVimのキーバインドを使えない、Vimとのデータのやりとりが大変、などの問題点があります。
Vim-Shellパッチについて
Vim-Shellパッチとは、Vimに外部プロセスを実行させる機能を付け加える巨大パッチです。 エスケープシーケンスもきちんと解釈するので、優れたシェル環境なのですが、 パッチは本家に取り込まれることがなく、しかもVim 7.2には対応していません。 Windows上では使えず、GVimでも使えないなど、欠点も多いです。
そのほかのプラグインについて
そのほかにもシェルを模倣するプラグインはありますが、どれも提供される機能に難があったり、 Windows環境やGVimでは使えないものばかりです。
Emacsとの比較
対するEmacsはどうでしょう。Emacsでは、標準的に搭載されているshell-mode
を用いてシェルを実行できます。
起動が遅いですが、さらに高機能なeshell-mode
を用いて100% Emacs Lispなシェルを使うこともできます。
eshell-mode
は端末機能としては不完全なので、端末がほしいだけなら、ansi-term
を用いると良いでしょう。
この優れたシェル環境を得るためだけにEmacsへと移行した人々も多いのではないかと思います。
最近では、ansi-term
を改良したmulti-term
というものが人気らしいです。
vimshellについて
Emacsへの対抗馬になりうるのが、私が開発しているvimshellです。 完全な端末機能を目指すのではなく、純粋な対話シェルとしてeshellを目標にしています。 自動補完プラグインであるneocomplcacheと連携させることで、自動補完のできるシェル環境になります。 vimprocと連携させれば非同期実行も可能、対話プログラムを起動できる、と開発途中の現在でもかなりの機能を誇ります。 vimshellはzshの機能を一部取り込んでいて、コマンドラインスタックや優れた履歴検索機能もあります。
Conqueとの比較
その他のライブラリとして、vimprocやvimshellをもとにNico Raffatoさんが製作しているConqueというプラグインがあります。まだVer.1.0がリリースされたばかりですが、現在も精力的に開発されています。 これは内部でPythonインタフェースを用いて外部プロセスとの通信を行っているので、安定性に難があるのと、Pythonインタフェースが必須になっています。 Emacsのansi-termを目標にしているようで、端末としてはかなりの完成度を誇ります。 ただし日本語が使えなかったり、Windows環境で動作しないという問題があります。 キー入力をすべて奪いとってしまうので、他のプラグインとの連携もしづらいです。 Emacsも内部で動かせるなど、ネタとしてはかなり面白いのですが……。
Shougoもどる
blog comments powered by Disqus