キーボードを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
コマンドが見付からなかったとき,先頭から順に大文字をスペースと小文字に展開しつつ実行する関数を書いてみた.
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のダイアリー