X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/429242317e3abaa40dad9f3d2a9eb537cd0fd9b3..eebc475df54de7ad5c04ef7cddc083c865235540:/lisp/dired.el diff --git a/lisp/dired.el b/lisp/dired.el index c5174561fa..c4374503a6 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -249,9 +249,19 @@ Local to each dired buffer. May be a list, in which case the car is the directory name and the cdr is the list of files to mention. The directory name must be absolute, but need not be fully expanded.") +;; Beware of "-l;reboot" etc. See bug#3230. +(defun dired-safe-switches-p (switches) + "Return non-nil if string SWITCHES does not look risky for dired." + (or (not switches) + (and (stringp switches) + (< (length switches) 100) ; arbitrary + (string-match "\\` *-[- [:alnum:]]+\\'" switches)))) + (defvar dired-actual-switches nil "The value of `dired-listing-switches' used to make this buffer's text.") +(put 'dired-actual-switches 'safe-local-variable 'dired-safe-switches-p) + (defvar dired-re-inode-size "[0-9 \t]*" "Regexp for optional initial inode and file size as made by `ls -i -s'.") @@ -601,9 +611,12 @@ Don't use that together with FILTER." (if current-prefix-arg (read-string "Dired listing switches: " dired-listing-switches)) - ;; If a dialog is about to be used, call read-directory-name so - ;; the dialog code knows we want directories. Some dialogs can - ;; only select directories or files when popped up, not both. + ;; If a dialog is used, call `read-directory-name' so the + ;; dialog code knows we want directories. Some dialogs + ;; can only select directories or files when popped up, + ;; not both. If no dialog is used, call `read-file-name' + ;; because the user may want completion of file names for + ;; use in a wildcard pattern. (if (next-read-file-uses-dialog-p) (read-directory-name (format "Dired %s(directory): " str) nil default-directory nil) @@ -847,28 +860,47 @@ periodically reverts at specified time intervals." ;; killed buffer, it is removed from this list. "Alist of expanded directories and their associated dired buffers.") +(defvar dired-find-subdir) + +;; FIXME add a doc-string, and document dired-x extensions. (defun dired-find-buffer-nocreate (dirname &optional mode) ;; This differs from dired-buffers-for-dir in that it does not consider ;; subdirs of default-directory and searches for the first match only. ;; Also, the major mode must be MODE. - (setq dirname (expand-file-name dirname)) - (let (found (blist dired-buffers)) ; was (buffer-list) - (or mode (setq mode 'dired-mode)) - (while blist - (if (null (buffer-name (cdr (car blist)))) - (setq blist (cdr blist)) - (with-current-buffer (cdr (car blist)) - (if (and (eq major-mode mode) - dired-directory ;; nil during find-alternate-file - (equal dirname - (expand-file-name - (if (consp dired-directory) - (car dired-directory) - dired-directory)))) - (setq found (cdr (car blist)) - blist nil) - (setq blist (cdr blist)))))) - found)) + (if (and (featurep 'dired-x) + dired-find-subdir + ;; Don't try to find a wildcard as a subdirectory. + (string-equal dirname (file-name-directory dirname))) + (let* ((cur-buf (current-buffer)) + (buffers (nreverse + (dired-buffers-for-dir (expand-file-name dirname)))) + (cur-buf-matches (and (memq cur-buf buffers) + ;; Wildcards must match, too: + (equal dired-directory dirname)))) + ;; We don't want to switch to the same buffer--- + (setq buffers (delq cur-buf buffers)) + (or (car (sort buffers #'dired-buffer-more-recently-used-p)) + ;; ---unless it's the only possibility: + (and cur-buf-matches cur-buf))) + ;; No dired-x, or dired-find-subdir nil. + (setq dirname (expand-file-name dirname)) + (let (found (blist dired-buffers)) ; was (buffer-list) + (or mode (setq mode 'dired-mode)) + (while blist + (if (null (buffer-name (cdr (car blist)))) + (setq blist (cdr blist)) + (with-current-buffer (cdr (car blist)) + (if (and (eq major-mode mode) + dired-directory ;; nil during find-alternate-file + (equal dirname + (expand-file-name + (if (consp dired-directory) + (car dired-directory) + dired-directory)))) + (setq found (cdr (car blist)) + blist nil) + (setq blist (cdr blist)))))) + found))) ;; Read in a new dired buffer @@ -1841,6 +1873,7 @@ Keybindings: (set (make-local-variable 'desktop-save-buffer) 'dired-desktop-buffer-misc-data) (setq dired-switches-alist nil) + (hack-dir-local-variables-non-file-buffer) ; before sorting (dired-sort-other dired-actual-switches t) (when (featurep 'dnd) (set (make-local-variable 'dnd-protocol-alist) @@ -3594,7 +3627,7 @@ Ask means pop up a menu for the user to select one of copy, move or link." ;;;;;; dired-run-shell-command dired-do-shell-command dired-do-async-shell-command ;;;;;; dired-clean-directory dired-do-print dired-do-touch dired-do-chown ;;;;;; dired-do-chgrp dired-do-chmod dired-compare-directories dired-backup-diff -;;;;;; dired-diff) "dired-aux" "dired-aux.el" "281daa2642afe5c52ba09a29ea17dbd7") +;;;;;; dired-diff) "dired-aux" "dired-aux.el" "154cdfbf451aedec60c5012b625ff329") ;;; Generated autoloads from dired-aux.el (autoload 'dired-diff "dired-aux" "\ @@ -4052,8 +4085,8 @@ true then the type of the file linked to by FILE is printed instead. ;;;*** -;;;### (autoloads (dired-do-relsymlink dired-jump) "dired-x" "dired-x.el" -;;;;;; "9e412288898d065e4ae92d106e0426c0") +;;;### (autoloads (dired-do-relsymlink dired-jump-other-window dired-jump) +;;;;;; "dired-x" "dired-x.el" "87fd4ae2fdade7e0f11c4a0b1cfdeda2") ;;; Generated autoloads from dired-x.el (autoload 'dired-jump "dired-x" "\ @@ -4068,6 +4101,11 @@ move to its line in dired. \(fn &optional OTHER-WINDOW FILE-NAME)" t nil) +(autoload 'dired-jump-other-window "dired-x" "\ +Like \\[dired-jump] (`dired-jump') but in other window. + +\(fn &optional FILE-NAME)" t nil) + (autoload 'dired-do-relsymlink "dired-x" "\ Relative symlink all marked (or next ARG) files into a directory. Otherwise make a relative symbolic link to the current file.