2009-06-24 11 views
2

「//」でパスを崩壊しないように伝えることができ、私はそれをはどのように私はEmacsが見つけ、ファイルを見つけるファイルをEmacsでは

/a/b//c/d 

のようなファイルを与えれば、それは/それがファイルを見つけることができないだと文句を言いc/d

どのようにしてemacsをcshのように動作させることができますか?つまり、新鮮な/新しいパスを開始するには、//マーカーの代わりに/と同じように扱わなければなりません。 Emacsの23.1に対して

答えて

4

は、この解決策は、(デフォルトの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を打つ):これは、取得する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を押すことなく効果を得るには、このコードを使用します:

追加するように編集

(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

大きなヒントを。二重スラッシュを意味するファイルシステムルートはまれにしか起こりませんが、それが襲ったときには嫌です。これは便利です。 – Cheeso

0

Emacsはファイル内のいくつかの置換を行うために代替-でファイル名を使用しています名前。 1つは(関数ドキュメント文字列から):

//' 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)))) 
関連する問題