Dired fixes for newlines in directory names.
* lisp/dired.el (dired-insert-directory): Handle newlines in directory name. (dired-build-subdir-alist): Unescape newlines in directory name.
This commit is contained in:
parent
8c82b1b4dc
commit
1db03b1618
2 changed files with 44 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-01-17 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* dired.el (dired-insert-directory): Handle newlines in directory name.
|
||||
(dired-build-subdir-alist): Unescape newlines in directory name.
|
||||
|
||||
2012-01-17 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
* net/tramp.el (tramp-local-end-of-line): New defcustom.
|
||||
|
|
|
@ -1172,7 +1172,22 @@ see `dired-use-ls-dired' for more details.")
|
|||
"\\015"
|
||||
(text-properties-at (match-beginning 0)))
|
||||
nil t))
|
||||
(set-marker end nil)))
|
||||
(set-marker end nil))
|
||||
;; Replace any newlines in DIR with literal "\n"s, for the sake
|
||||
;; of the header line. To disambiguate a literal "\n" in the
|
||||
;; actual dirname, we also replace "\" with "\\".
|
||||
;; Personally, I think this should always be done, irrespective
|
||||
;; of the value of dired-actual-switches, because:
|
||||
;; i) Dired simply does not work with an unescaped newline in
|
||||
;; the directory name used in the header (bug=10469#28), and
|
||||
;; ii) "\" is always replaced with "\\" in the listing, so doing
|
||||
;; it in the header as well makes things consistent.
|
||||
;; But at present it is only done if "-b" is in ls-switches,
|
||||
;; because newlines in dirnames are uncommon, and people may
|
||||
;; have gotten used to seeing unescaped "\" in the headers.
|
||||
;; Note: adjust dired-build-subdir-alist if you change this.
|
||||
(setq dir (replace-regexp-in-string "\\\\" "\\\\" dir nil t)
|
||||
dir (replace-regexp-in-string "\n" "\\n" dir nil t)))
|
||||
(dired-insert-set-properties opoint (point))
|
||||
;; If we used --dired and it worked, the lines are already indented.
|
||||
;; Otherwise, indent them.
|
||||
|
@ -2541,12 +2556,30 @@ instead of `dired-actual-switches'."
|
|||
(delete-region (point) (match-end 1))
|
||||
(insert new-dir-name))
|
||||
(setq count (1+ count))
|
||||
;; Undo any escaping of newlines and \ by dired-insert-directory.
|
||||
;; Convert "n" preceded by odd number of \ to newline, and \\ to \.
|
||||
(when (dired-switches-escape-p switches)
|
||||
(let (temp res)
|
||||
(mapc (lambda (char)
|
||||
(cond ((equal char ?\\)
|
||||
(if temp
|
||||
(setq res (concat res "\\")
|
||||
temp nil)
|
||||
(setq temp "\\")))
|
||||
((and temp (equal char ?n))
|
||||
(setq res (concat res "\n")
|
||||
temp nil))
|
||||
(t
|
||||
(setq res (concat res temp (char-to-string char))
|
||||
temp nil))))
|
||||
new-dir-name)
|
||||
(setq new-dir-name res)))
|
||||
(dired-alist-add-1 new-dir-name
|
||||
;; Place a sub directory boundary between lines.
|
||||
(save-excursion
|
||||
(goto-char (match-beginning 0))
|
||||
(beginning-of-line)
|
||||
(point-marker)))))
|
||||
;; Place a sub directory boundary between lines.
|
||||
(save-excursion
|
||||
(goto-char (match-beginning 0))
|
||||
(beginning-of-line)
|
||||
(point-marker)))))
|
||||
(if (and (> count 1) (called-interactively-p 'interactive))
|
||||
(message "Buffer includes %d directories" count)))
|
||||
;; We don't need to sort it because it is in buffer order per
|
||||
|
|
Loading…
Add table
Reference in a new issue