Gitを使っていて zsh: no matches found: HEAD^ などと言われない方法

投稿者: | 2012年1月23日

Gitを使っていると、今のcommitなし!git reset --soft HEAD^したり、abc1234以降のコミットをパッチ化したい!git format-patch abc1234^したくなることがよくあるわけだが、この^はzshの拡張グロブ有効化時(setopt extended_glob)はメタ文字として働くため、そのまま入力すると標記のエラーで怒られてしまう。
いちいちエスケープするのは面倒だと思うのだが、ぐぐってみても正面から対処している人があまりいないようなので紹介しておくと、拙作のgit-escape-magicを使えば良い。リンク先のドキュメントの通り、ふつうに入力するだけで、いい感じに文脈を見て自動エスケープしてくれる。
このように、zle(zshラインエディタ)をいじると結構おもしろいことができる。
たとえば、3つ上のディレクトリを参照するために../../..などと打つのは指がつりそうな所作だが、カレントディレクトリが.で親ディレクトリが..であるならばn個上のディレクトリは(n-1)個の.の並びで表現できてもよさそうなものである。と、思ったなら、manydots-magicのような実装に至ることができる。
もちろん正規表現、Gitのコミットの範囲指定、あるいはワンライナープログラム内で...という並びを使うこともあるので、引数の頭か/の直後でのみ動くようにしているほか、直後に../..の後には似つかわしくない文字が打たれたときは...に戻す工夫を加えた。また、指が滑って打ち過ぎたときに最後の/..をBSを3度も押して削るなどは面倒だから、.連打の後のBSは3文字分を削り直前の状態に戻るようにしてある。
先ほどのgit-escape-magicともども、参考にしたurl-quote-magicでは考慮外だったネストに対応しているので、いくつも併用できる。何かおもしろいものができたら、ぜひ公開してみてくれ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です