;;; Try to handle the most common misuses of cygwin paths. ;;(defconst w32-cygdrive-name-regexp "\\`/cygdrive/\\(.\\)/") (defconst w32-cygdrive-name-regexp "^\\(?:/cygwin\\)?/\\(.\\)/") ;;(defconst w32-cygdrive-name-regexp "^/\\(.\\)/") (defun w32-cygdrive-run-real-handler (op args) (let ((inhibit-file-name-handlers (cons 'w32-cygdrive-name-handler (if (eq inhibit-file-name-operation op) inhibit-file-name-handlers))) (inhibit-file-name-operation op)) (apply op args))) (defun w32-cygdrive-name-handler (op &rest args) (message "handler %s %s" op args) (case op (expand-file-name (let ((file (car args)) (cdrargs (cdr args))) (cond ((= 0 (string-match w32-cygdrive-name-regexp file)) (w32-cygdrive-run-real-handler op (cons (replace-match "\\1:/" t nil file) cdrargs))) ((= 0 (string-match w32-cygdrive-name-regexp (car cdrargs))) (w32-cygdrive-run-real-handler op (list* file (replace-match "\\1:/" t nil (car cdrargs)) (cdr cdrargs)))) ;; This is actually an error (we should never get here), ;; but let's be defensive. (t (w32-cygdrive-run-real-handler op args))))) (t (w32-cygdrive-run-real-handler op args)))) (push (cons w32-cygdrive-name-regexp 'w32-cygdrive-name-handler) file-name-handler-alist) (find-file "/c/hello.txt/")