2010年7月23日金曜日

vimshellの新機能 texeについて

以前のエントリ後、h1mesukeさんはConqueに乗り換えたようでした。

その後h1mesukeさんは、Conqueの設定記事を書いてくれたようです。
Conqueはまだまだマイナーなプラグインで、情報が少ないので大変に参考になります。

上記の記事のトラックバック代わりに、vimshellの新機能であるtexeについて解説をします。
texeとはConqueと同様に、Vimを端末エミュレータとして使うというコマンドです。
vimshellバッファ上で、

texe zsh

のようにして起動しますが、vimshellバッファが欲しくないときには:VimShellTerminal zshとしても起動することができます。

texeと似たvimshellのコマンドとして、iexeというものがあります。こちらは対話的にバッファを生成し通信するのですが、texeとは細かい動作が異なります。
iexeはneocomplcacheと連携して補完ができたり、ヒストリを参照して実行できたりと、Vimの機能をほぼフルに使うことができます。しかし、texeの場合はバッファに対するすべての入力が奪われてしまうので、neocomplcacheは使えません。補完は起動するソフトの機能に依存します。そのあたりはConqueも同じです。加えてtexeはエスケープシーケンスの処理が重いので、私はインタプリタを起動するときにはiexeを使うことをおすすめします。ただし、zshの右プロンプトはiexeでは動作しません。どうしても右プロンプトを使いたいなら、texeを使用する必要があります。
iexeの方が優れているというのに、わざわざtexeを作った理由は、フル機能の端末が必要なニーズは確実に存在するためです。例えば、gdbtuiというものがあります。これは端末上でグラフィカルにデバッグを行うことができるソフトです。こういうものはiexe上では実行ができません。VimではEmacsのようなGDBとの連携がしづらいのですが、gdbtuiのようなソフトを使えば模倣できると考えました。端末エミュレータの機能を実装すれば、muttやw3mといったメールやWebブラウズもVimだけで実行できるということもあります。端末エミュレータの実装はそれなりに大変ですが、端末機能を使うすべてのプログラムとVimが連携できることを考えれば、実装する価値はあります。

Conqueとの比較


texeの良いところ


・vimshellと連携できる
・Conqueの対応していないエスケープシーケンスに対応
・Windows対応
・+pythonが必要ない
・洗練されたハイライト
・プロセスの後始末
・キーマッピングを自由に設定が可能
Conqueの対応していないエスケープシーケンスとは、例えばタイトルやカーソル形状の変更のエスケープシーケンスや、Line Drawing Character setのエミュレーションです。Conqueのハイライト設定は、実はvimshellのものを流用しています。が、vimshellのハイライトはその後独自に進化したので、当然texeの方が優れています。Windowsに対応するには、Cygwinのインストールとfakecygptyが必要です。動作もかなり重く、zshの自動補完を使うにはかなり無理があります。zshを普通に使う分には問題がありません。

texeの悪いところ


・エスケープシーケンスの実装はまだ不完全
・Conqueより重い?

まだ開発したばかりなので、動作速度やエスケープシーケンスの対応については、なかなか厳しかったりします。ようやく一通りの機能を実装することはできたので、今後改善予定です。

設定について


texeはfiletypeをterm-コマンド名として設定するので、
autocmd term-*で設定します。例えばこのように:


autocmd MyAutoCmd FileType term-* call s:terminal_settings()
function! s:terminal_settings()
inoremap <buffer><expr> <Plug>(vimshell_term_send_semicolon) vimshell#term_mappings#send_key(';')
inoremap <buffer><expr> j<Space> vimshell#term_mappings#send_key('j')
"inoremap <silent><buffer><expr> <Up> vimshell#term_mappings#send_keys("\<ESC>[A")

" Sticky key.
imap <buffer><expr> ; <SID>texe_sticky_func()

" Escape key.
iunmap <buffer> <ESC><ESC>
imap <buffer> <ESC> <Plug>(vimshell_term_send_escape)
endfunction

vimshell#term_mappings#send_key()という関数は、起動しているプログラムに送るキーシーケンスを制御しています。複数のキーシーケンスを送る場合はvimshell#term_mappings#send_keys()を使います。
ヘルパ関数が用意されているので、キーマッピングも自由自在なのです。
設定さえしてやればスティッキーシフトに対応することもできます。この柔軟性は大きな魅力です。

おわりに


texeには、まだVT100レベルの端末機能しか実装されていませんが、いずれは$TERMがxterm-256colorになる予定です。今後に期待してください。

4 件のコメント:

  1. h1mesuke です。エントリ拝読しました。

    > 以前のエントリ後、h1mesukeさんはConqueに乗り換えたようでした。

    軸はいまだにぶれまくりですけどね。確かに Conque は自分が求めているものにより近かったわけですけど、「シェルを求めて~」でやっているように、端末バッファを管理する機能を自分で補ってようやく使えるようになったわけで、逆にいうとそこまでしないと使えない点には不満があるわけです。なので、横目でちらちらと vimshell の様子をうかがっていました(笑)

    vimshell と Conque は併用も可とのことですので、これを機会に texe の方も試してみようと思っています。自分的には

    ・Conqueの対応していないエスケープシーケンスに対応
    ・+pythonが必要ない

    この辺りに texe の優位性を感じます。

    後、最近になって iexe もいいなーとか思い始めたり。初めて vimshell を入れた当時はまだ neocomplcache を使ってなかったのでその恩恵がよくわかってませんでしたが、iexe で irb とかかなりいいですね。これは zsh上で動かすより便利です。

    そんなわけで、今後は二刀流でいってみようかなと。ぼちぼち設定を詰めていって、また1ヶ月後くらいに何か書くかも。(形態としてはシェルを Conque または texe で動かして常駐させつつ、irb などのインタプリタは iexe で、という感じになりそうです)

    返信削除
  2. このコメントは投稿者によって削除されました。

    返信削除
  3. このコメントは投稿者によって削除されました。

    返信削除
  4. コメントありがとうございます。

    >軸はいまだにぶれまくりですけどね。確かに Conque は自分が求めているものにより近かったわけですけど、「シェルを求めて~」でやっているように、端末バッファを管理する機能を自分で補ってようやく使えるようになったわけで、逆にいうとそこまでしないと使えない点には不満があるわけです。なので、横目でちらちらと vimshell の様子をうかがっていました(笑)
    確かにConqueは癖があります。Emacsの端末エミュレータであるansi-termも設定しないと使いづらいようです。

    > vimshell と Conque は併用も可とのことですので、これを機会に texe の方も試してみようと思っています。自分的には
    >・Conqueの対応していないエスケープシーケンスに対応
    >・+pythonが必要ない
    >この辺りに texe の優位性を感じます。
    気軽に試してみてください。ちなみに、私的には「Windows対応」も重要だったりします。

    > 後、最近になって iexe もいいなーとか思い始めたり。初めて vimshell を入れた当時はまだ neocomplcache を使ってなかったのでその恩恵がよくわかってませんでしたが、iexe で irb とかかなりいいですね。これは zsh上で動かすより便利です。
    最初からneocomplcacheとの連携を考えていたので、それは当然ですね。iexe+termtter+neocomplcacheでTwitterするとなかなかいい感じですよ。

    > そんなわけで、今後は二刀流でいってみようかなと。ぼちぼち設定を詰めていって、また1ヶ月後くらいに何か書くかも。(形態としてはシェルを Conque または texe で動かして常駐させつつ、irb などのインタプリタは iexe で、という感じになりそうです)
    はい。h1mesukeさんの記事に期待しています。

    返信削除