hitode909の日記

趣味はマリンスポーツですの日記です

zshでtypoしたときに大文字をスペースと小文字に展開して実行する

キーボードをSandSに設定しているので,急いでコマンドを打っていると,gitPullとか,gitPushとか打ってしまう.
setopt correctしていれば,ちょっと間違えたくらいならzshが訂正してくれるが,コマンドと引数の間にスペースがない場合,訂正してくれない.

% fit push origin master       # これは直してくれる
git is correct? [n,y,a,e]: y

% gitPush origin master        # これはだめ
zsh: command not found: gitPush


以下の記事によると,command_not_found_handlerという関数を定義すれば,コマンドが見付からなかったときにフックをかけられるらしい.
zsh で method_missing っぽいことをするには command_not_found_handler - ess sup
コマンドが見付からなかったとき,先頭から順に大文字をスペースと小文字に展開しつつ実行する関数を書いてみた.


Gist

function command_not_found_handler() {
    new=`echo $* | ruby -pe 'sub(/[A-Z]/){" "+$&.downcase}'`
    if [ "$*" != "$new" ]; then
echo "=> $new"
        eval $new
        return 0
    fi
return 127
}


この関数を定義した状態で上記のtypoをすると,気をつかって大文字を展開して実行してくれる.

% gitPull
=> git pull
Already up-to-date.

% lsPublic_html
=> ls public_html
...


1つ問題があって,関数がサブシェル内で実行されるので,cdなどを実行することができない.サブシェル内でcdして,戻ってきたら,移動してない,ということになる.
ディレクトリを移動しない限りは便利なので,使っていきたいと思う.

追記

Rubyのワンライナーで書いた部分が遅かったので,書き直した.
RubyのワンライナーをCで書き直すと10倍くらい速くなった - hitode909のダイアリー