如何通过'//'告诉Emacs查找文件不要折叠路径

时间:2009-06-24 18:51:11

标签: emacs

在Emacs查找文件中,如果我给它一个像

这样的文件
/a/b//c/d

它抱怨它无法找到文件/ c / d

如何让emacs更像csh?即//应该被视为/而不是作为标记来处理新的/新路径。

2 个答案:

答案 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))))