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

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

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


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

  • シェルを出したり隠したり
  • 複数のシェルを管理する

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


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

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

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

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

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

常時 Insert mode*1

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

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

Vim からシェルを使う流れ

大体こんな感じです。

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

などなど。

余談

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

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

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