On 10/24/2012 8:20 PM, Stefan Monnier wrote: >> The trouble is that the core completion code makes unwarranted >> assumptions about the behavior of expand-in-file-name. Specifically, >> completion--tqw-all assumes that (equal (unquote (concat (qnew foo) >> (qnew bar)) (unquote (quote (concat foo bar))). Why should that be >> the case? > > Long story. For typical escaping/quoting this does hold. > Of course, for more general rewrites, it doesn't. > > Can you give me your file-name-handler code so I can play with it (I > don't have Cygwin at hand, but I should be able to make up the > difference). > I think the problem is in completion--sifn-requote, which is definitely > not prepared for the kind of rewrites you're doing. Here's what I threw together to try to get this working. I took a look at minibuffer.el and other pieces of code seem to make the same assumption. Maybe the requote operation needs a a file-name-handler? (defun cygwin-handler (operation &rest args) (when (eq operation 'substitute-in-file-name) ;; ;; Convert Windows paths to Cygwin paths. Take care to preserve ;; trailing "." and ".." suffixes so that completion doesn't ;; break. Punt to the regular substitute-in-file-name once we've ;; converted the path to a Cygwin one. ;; (let* ((path (car args)) (orig-path path) (suffix "")) (when (string-match (rx bos (group (* any) (or "/" "\\")) (group "." (? ".") "/") eos) path) (setf suffix (match-string 2 path)) (setf path (match-string 1 path))) (let ((posix-path (concat (cygwin-convert-path-from-windows path) suffix))) (message "CYG: %S -> %S" orig-path posix-path) (setf args (list posix-path))))) (let ((inhibit-file-name-handlers (cons 'cygwin-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) (apply operation args))) (add-to-list 'file-name-handler-alist '("\\\\" . cygwin-handler))