在Emacs查找文件中,如果我给它一个像
这样的文件/a/b//c/d
它抱怨它无法找到文件/ c / d
如何让emacs更像csh?即//应该被视为/而不是作为标记来处理新的/新路径。
答案 0 :(得分:4)
对于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))
答案 1 :(得分:0)
Emacs使用 substitute-in-file-name 在文件名中进行多次替换。一个是(来自函数doc string):
如果//' appears, everything up to and including the first of
those
/'被弃置。
遗憾的是,此功能无法自定义。但是您可以在实际执行 substitute-in-file-name 之前创建一条删除多个斜杠的建议:
(defadvice substitute-in-file-name (before fixup-double-slashes activate)
(ad-set-arg 0 (replace-regexp-in-string "//+" "/" (ad-get-arg 0))))