Windows 10 + PuTTY(plink) + Emacs 26.1な環境でLinuxターゲットのSSH TRAMPがいい感じに使えてたんだけど、PuTTYをmsys2のものに置き換えたら、rgrepが「find: paths must precede expression: ^^!^」なるエラーを吐いて使えなくなってしまった。これじゃ仕事にならん!ってなもんで前のPuTTYに戻したものの状況は変わらず…オワタ\(^o^)/
とりあえずemacs/share/emacs/26.1/lisp/progmodes/grep.el.gz
の1153行目付近、-prune -o
と(shell-quote-argument “!”)
から文字列を結合してるあたりを削り、M-x byte-compile-file grep.el.gz
して、超無理やり解決した。
同様の問題が起きた時の参考として、解決に至るまでの顛末をメモ。
根本原因はshell-quote-argument
の挙動が変わった(?)ことっぽいけど、なぜ変わったのかは不明のまま。PuTTYを差し替えたこと以外、何もいじってないはずなんだけどな…。
同様にshell-quote-argument
の実装を見てみても、OSによって処理を分岐させてるだけで変なところはない。……ん?待てよ、TRAMPの場合はOSはどういう扱いになるのこれ?ちゃんとリモート側のシステムにあわせてsystem-typeの中身が変わるのこれ…?
サーカムフレックスはコマンドプロンプトでのエスケープシーケンスらしいので、TRAMPしてるにもかかわらずshell-quote-argument
がWindows用の挙動を示すのが根本原因のようだ。
先の回避策では除外ディレクトリの指定が効かなくなってしまうので、grep.el.gzの1153行目あたりを以下のように変更した。
(and grep-find-ignored-files (concat (shell-quote-argument "!") " -type d "
↓
(and grep-find-ignored-files (concat " '!' -type d "