zshのcorrectallでドットファイルを無視

zshの機能に、コマンドやファイル名のスペルミスを修正してくれるCORRECTとかCORRECT_ALLという機能があります。

具体的には、correctを指定しておくとコマンドのスペルミスすると修正候補を提示してくれるので、n (修正せずそのまま実行)、y (修正して実行)、a (中止)、e (コマンドを再編集) のいずれかのキーを入力します。例えば、

% setopt correct
% sl
zsh: correct `sl' to `ls' [nyae]? y
... (lsの実行結果) ...

という感じ。


さらにcorrectallを使うと、

% ls /etc/paswd
zsh: correct to `/etc/paswd' to `/etc/passwd' [nyae]? y
/etc/passwd

といった具合に、引数のファイル名も修正してくれるようになります。


慣れると、neko.c を neok.c と打ち間違えた、などという時にyキー一発で正しく修正できるので、便利かもしれません。



しかし、correctallはコマンドの引数と似たファイル名があると、「もしかしてこのファイル?」と提案してきてしまうので、場合によっては鬱陶しいことになります。
特にドットファイル(隠しファイル)の場合、存在を意識していない分、突然修正候補が出てくると「??」となりやすいです。例えば.log というがあるディレクトリで、git logと打つと…

% git log
zsh: correct 'log' to '.log' [nyae]? n

という具合に、毎回 n を入力してあげなければなりません。


そういうときは、zsh-5.0.6から導入された CORRECT_IGNORE_FILE 環境変数に、修正候補として出してほしくないファイル名(ワイルドカード使用可能)を指定しておくと良いです。ちなみに以前からあるCORRECT_IGNOREはcorrectオプションの方に対応しており、コマンド名の修正候補から除外することができます。例えば、.zshrcに

CORRECT_IGNORE='_*'
CORRECT_IGNORE_FILE='.*'

と指定しておけば、コマンド名として_で始まる補完関数を修正候補として出ないようにしたり、ファイル名としてドットファイルを修正候補にしないようになります。


ちなみに、mvやcp, mkdirなど、存在しないファイルを指定するのが普通のコマンドに対しては.zshrcで

alias mv='nocorrect mv'
alias cp='nocorrect cp'
alias mkdir='nocorrect mkdir'

として最初からスペルチェックがかからないようにしておいた方が良いでしょう。