Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2010-07-20

シェルを求めて三千里〜ほら貝調律編〜

タイトルだけ見ても何のことやらわからないと思いますが…… ほら貝というのは Conque のことです。(余談参照)

シェルを求めて三千里〜悠久のvim編〜」の続編です。導入以来ぼちぼちと固めてきた Conque の設定を晒してみます。


端末エミュレータとして Conque はよくできたプラグインなのですが、作成した端末バッファを管理する機能などはないため、

といった機能を自分で補っています。

端末バッファは再利用する

Conque の端末バッファ:ConqueTerm などで作成したバッファでは、作成時に起動したプロセスは一度起動したら最後、終了後もゾンビプロセスとして残り続けます。これは Vim を終了するまで回収されません。よって、ゾンビを大量生産しないために、端末バッファは基本、一度作成したら Vim を終了するまで削除せず、可能な限り使い回します。上記設定では端末バッファと結び付けるプロセスシェルに固定し、ページャや tail -f などが必要なら、シェルから起動するようにしています。シェルを介してプロセスを起動すれば終了ステータスの回収はシェルがやってくれるため、プロセスの起動と終了を繰り返すうちにゾンビが増えていくといったことは起こりません。(一方、一度起動したシェルとは一蓮托生を決意します)*1

Hシェル1を呼び出します。シェル2〜9については <Space>shシェルを作成し、<Space>2〜9 で呼び出します。

端末バッファは謙虚さが大事

端末バッファは番号を指定して呼び出せるので、バッファリストからは外してあります。:bnext などでバッファをローテーションするときにシェルが表示されて挿入モードに入る(次節参照)のがうっとうしいのでこのようにしています。*2

常時 Insert mode*3

端末バッファシェルに結び付けられているので基本挿入モードしか使いません。なので、BufEnterstartinsert! しています。バッファの切り替え、バッファを隠す、といったことも挿入モードから抜けずにできるように、変数 g:ConqueTerm_CWInsert1 に設定し、一連のキーマップを conque_term の filetype plugin にて設定しています。

<C-w><C-d>シェルを隠します。

Vim からシェルを使う流れ

大体こんな感じです。

H でシェル1を呼び出す、または <Space>shシェルを作る
 ↓
使い終わったら <C-w><C-d> で隠す
 ↓
必要になったら H または <Space>1〜9 でシェルを呼び出す
 ↓
使い終わったら <C-w><C-d> で隠す
 :
今後の課題
  • 特定のシェルで任意のコマンドを実行する関数とかコマンドとか
  • それを使って特定プロセスの起動までをキーマップにする

などなど。


余談

当初 Conque の意味を conquer(征服する)と勘違いして、「すごい挑戦的な名前だなー、vimshell に喧嘩売ってるぞ」と思っていましたが、ググってみるとほら貝の写真がヒットして氷解。Conque というのはフランス語でほら貝のことでした。どうやら、shell とかけた命名になっているようです。

( ・∀・)つ〃∩ ヘェーヘェーヘェー

*1:誤って <C-d>シェルを終了してしまうと事実上そのバッファは以後使用不能となるので、EOF でシェルが終了しないよう起動時のオプションIGNORE_EOF (-7) を指定しています。

*2:Conque はデフォルトでこれをやってくれないので、:bnext を多用する人はこれをやらないと端末バッファが邪魔で仕方ないはず。

*3:常時挿入モード、と書いてなんだか恥ずかしくなって一部を英語にしてみたがやっぱり恥ずかしい(;^ω^) 汚れた大人になってしまったお……

ShougoShougo 2010/07/20 13:20 vimshell作者のShougoです。Conqueの設定例はなかなかないので、参考になりますね。
> Conque の端末バッファ(:ConqueTerm などで作成したバッファ)では、作成時に起動したプロセスは一度起動したら最後、終了後もゾンビプロセスとして残り続けます。
ちょっとこれはひどいですね。vimshellではきちんと後始末しています。フリーズしたプロセスを強制終了するのも簡単です。

> :bnext などでバッファをローテーションするときにシェルが表示されて挿入モードに入る(次節参照)のがうっとうしいのでこのようにしています
私も昔はbnextを駆使していて、buftabs.vimやbufstatus.vimを愛用していましたが、最近ではku.vimを改造したneoui.vimを使っています。buffer以外にも使える、統一したインタフェースなのがよいです。

> 上記設定では端末バッファと結び付けるプロセスをシェルに固定し、ページャや tail -f などが必要なら、シェルから起動するようにしています
texeのエミュレーションは不完全なので、まだページャは動かないんですよね。困った。
ちょっと今はマルチバイト周りにてこずっているので、エミュレーションの改善はまだできそうにない感じです。


>特定のシェルで任意のコマンドを実行する関数とかコマンドとか
>それを使って特定プロセスの起動までをキーマップにする
これ面倒くさくないですか?
バッファを使い回している以上、仕方のないことかもしれませんが。
まぁこういう使い方もある程度vimshellではサポートしたいところですが。

トラックバック代わりに、今度ブログでtexeの紹介でもしましょうか。
まだいろいろと不完全ですが、今度はtexeも試していただけるとうれしいです。

Connection: close