Для Emacs 23.1 это решение работает (с настройками Emacs по умолчанию):
(defadvice minibuffer-complete-and-exit (before minibuffer-complete-and-exit activate)
"translate all occurrences of multiple / into single /"
(let ((unread-command-events t))
(save-excursion (replace-regexp "/+" "/" nil (point-min) (point-max)))
(message nil)))
У меня нет доступа к Emacs 22. *, поэтому вам придется попробовать оба варианта, но я подозреваю, что приведенное ниже решение работает.
Для Emacs 21.3 более ранний ответ работает:
Это, кажется, делает трюк (нажмите TAB
, чтобы увидеть это в действии):
(defadvice read-file-name-internal (before read-file-name-internal-reduce-slash activate)
"translate all occurrences of multiple / into single /"
(ad-set-arg 0 (replace-regexp-in-string "/+" "/" (ad-get-arg 0))))
Для этого необходимо набрать TAB
, чтобы перевод произошел.
отредактировано, чтобы добавить:
Чтобы получить эффект, не нажимая TAB
, используйте этот код:
(define-key minibuffer-local-map (kbd "RET") 'exit-minibuffer-reduce-slash-if-in-find-file)
(defun exit-minibuffer-reduce-slash-if-in-find-file ()
"when finding a file translate all occurrences of multiple / into single /"
(interactive)
(when (or nil minibuffer-completing-file-name)
(goto-char (point-min))
(while (re-search-forward "//+" nil t)
(replace-match "/")))
(call-interactively 'exit-minibuffer))