2011年04月09日

tschのプログラマブル補完(1)

 tcshに限らず、unix系のシェルはたいてい入力中にTab(Ctrl-I)で入力補完が行える。これがとっても便利なわけだけど、ここで悩ましいのは、意外と思ったとおりの補完ができなかったりすることと、ファイル名やディレクトリ名しか補完してくれないことでしょうか。

 たとえばとあるディレクトリ内に「.emacs」というファイルと、「.emacs.d」というサブディレクトリがあるとする。ここで「.emacs.d」に移動したくて、

cd .em

あたりで補完をしようとすると、「cd .emacs」までしか補完してくれなかったりする。というわけで「ファイルにcdできるわけねぇだろ!それくらい分かってくれよ」と思いながら、「.d」の2文字を追加で(自分で!)打たなかければならなかったりする。

 同様に、「editme.lisp」というLispのソースを編集したくて

emacs ed

あたりで補完しようとしても、「editme.fasl」というバイトコンパイル済みファイルが同じディレクトリにあったりすると、やはり「emacs editme.」あたりまでしか補完してくれない。今度はなんと4文字も(またも自分で!)打たなくてはならないわけですよ。

 ファイル名以外は補完してくれないことも悩ましい点のひとつ。sshするときのホスト名やユーザ名を補完してくれないし、makeの後に「install」や「clean」と打ちたくても補完してくれない。いざという時に忘れがちなgitやscpのオプションももちろん補完してくれない。

 とはいえ、LispやCのソースなら何万文字でも喜んで打つが、コマンドラインでは1文字たりとも余計に打ちたくないと思うのが、正しいunixユーザーというもの。プログラマブル補完は、そんなunixユーザーの悩みを解決してくれる機能なわけです。

 そもそも、シェルの補完がなんとなく不十分なのは、unixにはユーザーの心を読み取る機能が実装されていないことが原因なわけで、プログラマブル補完というのは、そんなunixのために「こういうときは、こういう補完をしてね」とシェルに教えてあげる機能。詳しい記述方法の説明は後回しにして、とりあえずどんなことができるかという例から見ていこう。

たとえば、コマンドラインで、

complete cd 'p/1/d/'

と打ってから先ほどと同様に、

cd .em

あたりでTab(Ctrl-I)すると、今度はきちんと「cd emacs.d/」と補完してくれる。つまり、先程のcompleteコマンドは、「cdの時は、ディレクトリ名だけを補完の対象にしてね」とシェルに教えてあげたわけである。実際には、毎回completeと打つわけではなく、.tcshrcあたりに記述しておくと思うが。

 また、以下のように記述すると、拡張子が「fasl」のファイルと「~」のファイル(emacsの自動保存ファイル)を補完の対象から除外することができ、「emacs ed」でTab(Ctrl-I)すると、ただしく「emacs editme.lisp」と補完される。

complete emacs 'p/*/f:^{*~,*.fasl}/'

 unixユーザーにしては珍しくCも書くという人は、

complete emacs 'p/*/f:^{*~,*.fasl,*.[ao]}/'

 としておけば、ライブラリファイルやオブジェクトファイルも補完対象から除外してくれる。

 プログラマブル補完の良いところは、ファイル名以外にも補完をしてくれる点にある。ログイン中のユーザー名や環境変数名、コマンド名、ジョブ名、シグナル名など、人類以外は補完可能と思えるくらいストライクゾーンが広い。なかでも便利というか多用するのが、単語リストだろう。これは、指定した単語リストの中から補完を行ってくれるものだ。

 たとえばsshにおいて、「speedmaster.jp」と「navitimer.jp」というふたつのログイン先サーバがあり、それぞれのサーバで「omega」「breitling」というふたつのIDを使っているとする。この場合、以下のようにcompleteを記述する。

complete ssh 'p/*/(speedmaster.jp navitimer.jp)/' 'n/-l/(omega breitling)/'

すると、以下の感じで補完が行える。

ssh s
↓Tab(Ctrl-I)
ssh speedmaster ← サーバ名が補完される。

ssh speedmaster -l o
↓Tab(Ctrl-I)
ssh speedmaster -l omega ← IDが補完される。

 これは、()内に記述された単語リストの中から補完を行っているわけで、他のコマンド(portとかaptとかyumとかmakeとかgitとかfindとか)においてもオプションを書き並べておけば、入力文字数をかなり減らすことができる。

 というあたりで、文字数がすごいことになってきたので、completeの具体的な書き方は次回に。

ラベル:FreeBSD tcsh
posted by ベルクカッツェ at 02:22| FreeBSD | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。