Как я могу сказать Emacs find-file не свернуть пути с помощью «//» - PullRequest
2 голосов
/ 24 июня 2009

В Emacs find-file, если я дам ему файл типа

/a/b//c/d

жалуется, что не может найти файл / c / d

Как мне заставить emacs вести себя больше как csh? Т.е. // + должен рассматриваться так же, как / вместо маркера, чтобы начать новый / новый путь.

Ответы [ 2 ]

4 голосов
/ 24 июня 2009

Для 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))
0 голосов
/ 22 апреля 2010

Emacs использует substitute-in-file-name , чтобы выполнить несколько подстановок в именах файлов. Один из них (из строки документа функции):

Если //' appears, everything up to and including the first of those / 'отбрасывается.

К сожалению, эта функция не настраивается. Но вы можете создать совет по удалению нескольких слешей перед фактическим выполнением имя-замены-файла :

(defadvice substitute-in-file-name (before fixup-double-slashes activate)
  (ad-set-arg 0 (replace-regexp-in-string "//+" "/" (ad-get-arg 0))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...