ksh でも便利に生活できるか
ここでは、(もちろん vi モードで) ksh で生活しようと試みる場合の小技を紹介する。vi モードの使用
zsh には及ばないものの、vi モードはある。vi モードにしておけば、 vi チックなコマンドライン編集ができる。vi モードにするには、
% set -o vi
これだけでよい。 あとは ESC を打って k なり j なりすれば、なんとなく使い方がわかるだろう。
zsh の vi モードはカーソルが行末に出るが、 ksh では行頭に出るので違和感がある。これは慣れるしかない。
history の使用
デフォルトで history 機能が有効になっている。
% history 直近の 16 個を表示する % history -n 直近の n 個を表示する % r 直前のコマンドを再実行する % r n ヒストリの中の n 番を再実行する % r ls ヒストリの中の直近の ls で始まるコマンドを再実行する
知ってると知らないでは大違いである。
ちなみに history コマンドは 実は fc -l の alias である。 ちなみにちなみに r コマンドは 実は fc -e - の alias である。
コマンド行編集の使用
ksh では fc というコマンドで、直前のコマンドの編集ができる。 長い長いコマンドでも、エディタで編集できるので便利である。
% FCEDIT=/usr/bin/vi エディタの指定(デフォルトは ed) % export FCEDIT % fc 直前コマンドの編集と実行 % fc n ヒストリの中の n 番の編集と実行
エディタに vi を使用する場合、 :q! などで中断したつもりでも バッファに書かれた内容は実行されてしまう。 これは直感的でないので、注意が必要だ。 全行を消して :wq! するとか、行頭に : を入れるとか、 回避方法を指に覚えさせておくとよい。
また、「fc」自体はヒストリに登録されない。 「fc -l」のように引数を与えると、ヒストリに登録される。
補完の使用
zsh や tcsh では TAB キーで補完ができるが、ksh の補完は若干ややこしい。 まず、コマンド名の補完はできない。ファイル名の補完しかできない。 ファイル名の補完については、以下のように動作する。
% ls /usr/local/b[ESC][\] ↓ % ls /usr/local/bin/
こんな感じで、ESC と バックスラ を叩く必要がある。 2打必要なので、あまり便利とは感じない。 cd 先が log だったか logs だったか記憶に定かでない…といったケースでは有用か。 ちなみに emacs モードの場合は、ESC を2回たたく。
ファイル名の補完ができる…と言っても、候補が特定できない場合は、そこまでしか 補完されない。
% ls /usr/ja[ESC][\] ↓ % ls /usr/java
ここで、ESC と = を叩くと、リストが出る。
% ls /usr/java[ESC][=] 1) java5/ 2) java5_64/ 3) java6/ % ls /usr/java
こんな感じだ。ESC-\ と ESC-= を組み合わせで覚えておけば、 かなり便利になるはずだ。
ちなみに HHK では = と \ は隣同士。 マニュアルを読まない我輩が ESC-= のキーバインドを発見したのは、偶然である。
エイリアス
alias の登録は直感的である。
% alias alias の一覧 % alias ls='ls -AF' alias の登録 % ls alias を実行 % \ls alias をバイパスして実行 % unalias ls alias の解除
zsh 同様、function も登録することができる。 こちらは スクリプトに書いておいて . で読み込ませるのが現実的だろう。
% cat /tmp/a loggingecho() { echo "[`date '+%Y-%m-%d %H:%M:%S'`] $*" } % . /tmp/a % typeset -f function loggingecho { echo "[`date '+%Y-%m-%d %H:%M:%S'`] $*" } % loggingecho hogehoge [2009-04-30 17:42:31] hogehoge % alias echo=loggingecho % echo hogehoge [2009-04-30 17:42:47] hogehoge
こんな具合である。
プロンプト
sh 系ということで、PS1 に設定してあげればプロンプトを変更できる。
% PS1=`hostname`' % ' garnet % % PS1=`hostname`':$PWD [!]: ' garnet:/usr/local/bin [768]:
色々なことができそうだが、あまり凝ったことはしない方がよいだろう。