search
LoginSignup
7

More than 5 years have passed since last update.

posted at

zshでファイル名を入力するとlessで開き、ディレクトリ名を入力するとls -laする(コマンドが見つからなかった時の処理をカスタマイズする)

概要

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を使ってると勝手に有効になるらしいです)

ちなみに、lesslsも引数を複数とれるのでこのcommand_not_found_handlerも複数の引数に対応しようと思えば出来ます。面倒なので書いてないです。

参考:http://mollifier.hatenablog.com/entry/20091207/p1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7