概要
Twitterを眺めてたら
「ディレクトリを指定したらls -la、ファイルを指定したらless」ってできないのかな
https://twitter.com/kyo_ago/status/411365469552005120
っていうのを見かけて、zshなら出来そうだなーと思って調べたら出来そうだったので書きました。
Code
以下を.zshrcに記述する。
unsetopt auto_cd
function command_not_found_handler() {
if [ $# != 1 ]; then
return 127
elif [ -d $0 ]; then
ls -la $0
return 0
elif [ -f $0 ]; then
less $0
return 0
else
return 127
fi
}
解説
zshにはcommand_not_found_handler
という関数があり、コマンドが見つからなかった時の処理をカスタマイズ出来ます。引数はその時見つからなかったコマンドです。
また、127をreturnするとコマンドが見つからなかった時の通常処理が発動し、0を返すとそれが発動しません。
で、上記のコードでは、「引数が1つじゃなかったら通常の処理、ディレクトリならls -la
、ファイルならless
で開き、それ以外は通常の処理」となっています。
また、zshにはauto_cd
というオプションがあり有効にすると、ディレクトリ名を入力した場合そのディレクトリにcd
します。この時command_not_found_handler
が発動しないので、このオプションをcommand_not_found_handler
の定義の前で無効にしてます(oh-my-zshを使ってると勝手に有効になるらしいです)
ちなみに、less
もls
も引数を複数とれるのでこのcommand_not_found_handler
も複数の引数に対応しようと思えば出来ます。面倒なので書いてないです。