Mercurial > emacs
diff lisp/dired.el @ 89943:4c90ffeb71c5
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-15
Merge from emacs--cvs-trunk--0
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-218
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-220
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-221
Restore deleted tagline in etc/TUTORIAL.ru
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-222
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-228
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-229
Remove TeX output files from the archive
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-230
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-247
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-248
src/lisp.h (CYCLE_CHECK): Macro moved from xfaces.c
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-249
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-256
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-258
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-263
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-264
Update from CVS: lispref/display.texi: emacs -> Emacs.
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-265
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-274
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-275
Update from CVS: man/makefile.w32-in: Revert last change
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-276
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-295
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-296
Allow restarting an existing debugger session that's exited
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-297
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-299
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-300
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-327
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-328
Update from CVS: src/.gdbinit (xsymbol): Fix last change.
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-329
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-344
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-345
Tweak source regexps so that building in place won't cause problems
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-346
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-351
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-352
Update from CVS: lisp/flymake.el: New file.
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-353
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-361
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-362
Support " [...]" style defaults in minibuffer-electric-default-mode
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-363
(read-number): Use canonical format for default in prompt.
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-364
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-367
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-368
Improve display-supports-face-attributes-p on non-ttys
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-369
Rewrite face-differs-from-default-p
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-370
Move `display-supports-face-attributes-p' entirely into C code
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-371
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-372
Simplify face-differs-from-default-p; don't consider :stipple.
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-373
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-374
(tty_supports_face_attributes_p): Ensure attributes differ from default
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-375
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-376
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-377
(Fdisplay_supports_face_attributes_p): Work around bootstrapping problem
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-378
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-380
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-381
Face merging cleanups
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-382
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-384
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-385
src/xfaces.c (push_named_merge_point): Return 0 if a cycle is detected
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-386
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-395
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-396
Tweak arch tagging to make build/install-in-place less annoying
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-397
Work around vc-arch problems when building eshell
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-398
Tweak permissions
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-399
Tweak directory permissions
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-400
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-401
More build-in-place tweaking of arch tagging
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-402
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-403
Yet more build-in-place tweaking of arch tagging
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-404
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-409
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-410
Make sure image types are initialized for lookup too
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-411
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-416
Update from CVS
author | Miles Bader <miles@gnu.org> |
---|---|
date | Mon, 28 Jun 2004 07:56:49 +0000 |
parents | 68c22ea6027c e3ace501b5f4 |
children | 97905c4f1a42 |
line wrap: on
line diff
--- a/lisp/dired.el Sat May 29 02:17:09 2004 +0000 +++ b/lisp/dired.el Mon Jun 28 07:56:49 2004 +0000 @@ -60,6 +60,10 @@ :type 'string :group 'dired) +(defvar dired-subdir-switches nil + "If non-nil, switches passed to `ls' for inserting subdirectories. +If nil, `dired-listing-switches' is used.") + ; Don't use absolute file names as /bin should be in any PATH and people ; may prefer /usr/local/gnu/bin or whatever. However, chown is ; usually not in PATH. @@ -274,13 +278,18 @@ (defvar dired-re-perms "[-bcdlps][-r][-w].[-r][-w].[-r][-w].") (defvar dired-re-dot "^.* \\.\\.?/?$") -;; The subdirectory names in this list are expanded. +;; The subdirectory names in the next two lists are expanded. (defvar dired-subdir-alist nil "Association list of subdirectories and their buffer positions. Each subdirectory has an element: (DIRNAME . STARTMARKER). The order of elements is the reverse of the order in the buffer. In simple cases, this list contains one element.") +(defvar dired-switches-alist nil + "Keeps track of which switches to use for inserted subdirectories. +This is an alist of the form (SUBDIR . SWITCHES).") +(make-variable-buffer-local 'dired-switches-alist) + (defvar dired-subdir-regexp "^. \\([^\n\r]+\\)\\(:\\)[\n\r]" "Regexp matching a maybe hidden subdirectory line in `ls -lR' output. Subexpression 1 is the subdirectory proper, no trailing colon. @@ -871,7 +880,8 @@ Should not fail even on completely garbaged buffers. Preserves old cursor, marks/flags, hidden-p." (widen) ; just in case user narrowed - (let ((opoint (point)) + (let ((modflag (buffer-modified-p)) + (opoint (point)) (ofile (dired-get-filename nil t)) (mark-alist nil) ; save marked files (hidden-subdirs (dired-remember-hidden)) @@ -898,9 +908,10 @@ (save-excursion ; hide subdirs that were hidden (dolist (dir hidden-subdirs) (if (dired-goto-subdir dir) - (dired-hide-subdir 1))))) + (dired-hide-subdir 1)))) + (unless modflag (restore-buffer-modified-p nil))) ;; outside of the let scope -;;; Might as well not override the user if the user changed this. +;;; Might as well not override the user if the user changed this. ;;; (setq buffer-read-only t) ) @@ -1160,6 +1171,8 @@ :help "Edit file at cursor")) (define-key map [menu-bar immediate create-directory] '(menu-item "Create Directory..." dired-create-directory)) + (define-key map [menu-bar immediate wdired-mode] + '(menu-item "Edit File Names" wdired-change-to-wdired-mode)) (define-key map [menu-bar regexp] (cons "Regexp" (make-sparse-keymap "Regexp"))) @@ -1402,6 +1415,9 @@ (or switches dired-listing-switches)) (set (make-local-variable 'font-lock-defaults) '(dired-font-lock-keywords t nil nil beginning-of-line)) + (set (make-local-variable 'desktop-save-buffer) + 'dired-desktop-buffer-misc-data) + (setq dired-switches-alist nil) (dired-sort-other dired-actual-switches t) (run-mode-hooks 'dired-mode-hook) (when (featurep 'x-dnd) @@ -1427,14 +1443,13 @@ (defun dired-undo () "Undo in a dired buffer. This doesn't recover lost files, it just undoes changes in the buffer itself. -You can use it to recover marks, killed lines or subdirs. -In the latter case, you have to do \\[dired-build-subdir-alist] to -parse the buffer again." +You can use it to recover marks, killed lines or subdirs." (interactive) (let (buffer-read-only) - (undo) - (message "Change in Dired buffer undone. -Actual changes in files cannot be undone by Emacs."))) + (undo)) + (dired-build-subdir-alist) + (message "Change in Dired buffer undone. +Actual changes in files cannot be undone by Emacs.")) (defun dired-next-line (arg) "Move down lines then position at filename. @@ -1630,9 +1645,7 @@ ((eq localp 'verbatim) file) ((and (not no-error-if-not-filep) - (save-excursion - (beginning-of-line) - (looking-at dired-re-dot))) + (member file '("." ".."))) (error "Cannot operate on `.' or `..'")) ((and (eq localp 'no-dir) already-absolute) (file-name-nondirectory file)) @@ -1696,7 +1709,7 @@ (setq dir (expand-file-name dir))) (if (string-match (concat "^" (regexp-quote dir)) file) (substring file (match-end 0)) -;;; (or no-error +;;; (or no-error ;;; (error "%s: not in directory tree growing at %s" file dir)) file)) @@ -2071,7 +2084,7 @@ (goto-char (match-beginning 0)) (beginning-of-line) (point-marker)))) - (if (> count 1) + (if (and (> count 1) (interactive-p)) (message "Buffer includes %d directories" count)) ;; We don't need to sort it because it is in buffer order per ;; constructionem. Return new alist: @@ -3018,244 +3031,6 @@ ;; listing: (list (car (reverse dired-subdir-alist)))))))) -;; To make this file smaller, the less common commands -;; go in a separate file. But autoload them here -;; to make the separation invisible. - -(autoload 'dired-diff "dired-aux" - "Compare file at point with file FILE using `diff'. -FILE defaults to the file at the mark. (That's the mark set by -\\[set-mark-command], not by Dired's \\[dired-mark] command.) -The prompted-for file is the first file given to `diff'." - t) - -(autoload 'dired-backup-diff "dired-aux" - "Diff this file with its backup file or vice versa. -Uses the latest backup, if there are several numerical backups. -If this file is a backup, diff it with its original. -The backup file is the first file given to `diff'." - t) - -(autoload 'dired-clean-directory "dired-aux" - "Flag numerical backups for deletion. -Spares `dired-kept-versions' latest versions, and `kept-old-versions' oldest. -Positive prefix arg KEEP overrides `dired-kept-versions'; -Negative prefix arg KEEP overrides `kept-old-versions' with KEEP made positive. - -To clear the flags on these files, you can use \\[dired-flag-backup-files] -with a prefix argument." - t) - -(autoload 'dired-do-chmod "dired-aux" - "Change the mode of the marked (or next ARG) files. -This calls chmod, thus symbolic modes like `g+w' are allowed." - t) - -(autoload 'dired-do-chgrp "dired-aux" - "Change the group of the marked (or next ARG) files." - t) - -(autoload 'dired-do-chown "dired-aux" - "Change the owner of the marked (or next ARG) files." - t) - -(autoload 'dired-do-touch "dired-aux" - "Change the timestamp of the marked (or next ARG) files." - t) - -(autoload 'dired-do-print "dired-aux" - "Print the marked (or next ARG) files. -Uses the shell command coming from variables `lpr-command' and -`lpr-switches' as default." - t) - -(autoload 'dired-do-shell-command "dired-aux" - "Run a shell command COMMAND on the marked files. -If no files are marked or a specific numeric prefix arg is given, -the next ARG files are used. Just \\[universal-argument] means the current file. -The prompt mentions the file(s) or the marker, as appropriate. - -If there is a `*' in COMMAND, surrounded by whitespace, this runs -COMMAND just once with the entire file list substituted there. - -If there is no `*', but there is a `?' in COMMAND, surrounded by -whitespace, this runs COMMAND on each file individually with the -file name substituted for `?'. - -Otherwise, this runs COMMAND on each file individually with the -file name added at the end of COMMAND (separated by a space). - -`*' and `?' when not surrounded by whitespace have no special -significance for `dired-do-shell-command', and are passed through -normally to the shell, but you must confirm first. To pass `*' by -itself to the shell as a wildcard, type `*\"\"'. - -If COMMAND produces output, it goes to a separate buffer. - -This feature does not try to redisplay Dired buffers afterward, as -there's no telling what files COMMAND may have changed. -Type \\[dired-do-redisplay] to redisplay the marked files. - -When COMMAND runs, its working directory is the top-level directory of -the Dired buffer, so output files usually are created there instead of -in a subdir. - -In a noninteractive call (from Lisp code), you must specify -the list of file names explicitly with the FILE-LIST argument." - t) - -(autoload 'dired-do-kill-lines "dired-aux" - "Kill all marked lines (not the files). -With a prefix arg, kill all lines not marked or flagged." - t) - -(autoload 'dired-do-compress "dired-aux" - "Compress or uncompress marked (or next ARG) files." - t) - -(autoload 'dired-do-byte-compile "dired-aux" - "Byte compile marked (or next ARG) Emacs Lisp files." - t) - -(autoload 'dired-do-load "dired-aux" - "Load the marked (or next ARG) Emacs Lisp files." - t) - -(autoload 'dired-do-redisplay "dired-aux" - "Redisplay all marked (or next ARG) files. -If on a subdir line, redisplay that subdirectory. In that case, -a prefix arg lets you edit the `ls' switches used for the new listing." - t) - -(autoload 'dired-create-directory "dired-aux" - "Create a directory called DIRECTORY." - t) - -(autoload 'dired-do-copy "dired-aux" - "Copy all marked (or next ARG) files, or copy the current file. -Thus, a zero prefix argument copies nothing. But it toggles the -variable `dired-copy-preserve-time' (which see)." - t) - -(autoload 'dired-do-symlink "dired-aux" - "Make symbolic links to current file or all marked (or next ARG) files. -When operating on just the current file, you specify the new name. -When operating on multiple or marked files, you specify a directory -and new symbolic links are made in that directory -with the same names that the files currently have." - t) - -(autoload 'dired-do-hardlink "dired-aux" - "Add names (hard links) current file or all marked (or next ARG) files. -When operating on just the current file, you specify the new name. -When operating on multiple or marked files, you specify a directory -and new hard links are made in that directory -with the same names that the files currently have." - t) - -(autoload 'dired-do-rename "dired-aux" - "Rename current file or all marked (or next ARG) files. -When renaming just the current file, you specify the new name. -When renaming multiple or marked files, you specify a directory." - t) - -(autoload 'dired-do-rename-regexp "dired-aux" - "Rename marked files containing REGEXP to NEWNAME. -As each match is found, the user must type a character saying - what to do with it. For directions, type \\[help-command] at that time. -NEWNAME may contain \\=\\<n> or \\& as in `query-replace-regexp'. -REGEXP defaults to the last regexp used. -With a zero prefix arg, renaming by regexp affects the full file name; -usually only the non-directory part of file names is used and changed." - t) - -(autoload 'dired-do-copy-regexp "dired-aux" - "Copy all marked files containing REGEXP to NEWNAME. -See function `dired-do-rename-regexp' for more info." - t) - -(autoload 'dired-do-hardlink-regexp "dired-aux" - "Hardlink all marked files containing REGEXP to NEWNAME. -See function `dired-do-rename-regexp' for more info." - t) - -(autoload 'dired-do-symlink-regexp "dired-aux" - "Symlink all marked files containing REGEXP to NEWNAME. -See function `dired-do-rename-regexp' for more info." - t) - -(autoload 'dired-upcase "dired-aux" - "Rename all marked (or next ARG) files to upper case." - t) - -(autoload 'dired-downcase "dired-aux" - "Rename all marked (or next ARG) files to lower case." - t) - -(autoload 'dired-maybe-insert-subdir "dired-aux" - "Insert this subdirectory into the same dired buffer. -If it is already present, just move to it (type \\[dired-do-redisplay] to refresh), - else inserts it at its natural place (as `ls -lR' would have done). -With a prefix arg, you may edit the ls switches used for this listing. - You can add `R' to the switches to expand the whole tree starting at - this subdirectory. -This function takes some pains to conform to `ls -lR' output." - t) - -(autoload 'dired-next-subdir "dired-aux" - "Go to next subdirectory, regardless of level." - t) - -(autoload 'dired-prev-subdir "dired-aux" - "Go to previous subdirectory, regardless of level. -When called interactively and not on a subdir line, go to this subdir's line." - t) - -(autoload 'dired-goto-subdir "dired-aux" - "Go to end of header line of DIR in this dired buffer. -Return value of point on success, otherwise return nil. -The next char is either \\n, or \\r if DIR is hidden." - t) - -(autoload 'dired-mark-subdir-files "dired-aux" - "Mark all files except `.' and `..'." - t) - -(autoload 'dired-kill-subdir "dired-aux" - "Remove all lines of current subdirectory. -Lower levels are unaffected." - t) - -(autoload 'dired-tree-up "dired-aux" - "Go up ARG levels in the dired tree." - t) - -(autoload 'dired-tree-down "dired-aux" - "Go down in the dired tree." - t) - -(autoload 'dired-hide-subdir "dired-aux" - "Hide or unhide the current subdirectory and move to next directory. -Optional prefix arg is a repeat factor. -Use \\[dired-hide-all] to (un)hide all directories." - t) - -(autoload 'dired-hide-all "dired-aux" - "Hide all subdirectories, leaving only their header lines. -If there is already something hidden, make everything visible again. -Use \\[dired-hide-subdir] to (un)hide a particular subdirectory." - t) - -(autoload 'dired-show-file-type "dired-aux" - "Print the type of FILE, according to the `file' command. -If FILE is a symbolic link and the optional argument DEREF-SYMLINKS is -true then the type of the file linked to by FILE is printed instead." - t) - -(autoload 'dired-run-shell-command "dired-aux") - -(autoload 'dired-query "dired-aux") - ;;;; Drag and drop support @@ -3272,16 +3047,16 @@ nil))) (defun dired-dnd-popup-notice () - (x-popup-dialog + (x-popup-dialog t - '("Recursive copies not enabled.\nSee variable dired-recursive-copies." + '("Recursive copies not enabled.\nSee variable dired-recursive-copies." ("Ok" . nil)))) (defun dired-dnd-do-ask-action (uri) ;; No need to get actions and descriptions from the source, ;; we only have three actions anyway. - (let ((action (x-popup-menu + (let ((action (x-popup-menu t (list "What action?" (cons "" @@ -3340,7 +3115,49 @@ (let ((local-file (x-dnd-get-local-file-uri uri))) (if local-file (dired-dnd-handle-local-file local-file action) nil))) + +;;;; Desktop support + +(eval-when-compile (require 'desktop)) + +(defun dired-desktop-buffer-misc-data (desktop-dirname) + "Auxiliary information to be saved in desktop file." + (cons + ;; Value of `dired-directory'. + (if (consp dired-directory) + ;; Directory name followed by list of files. + (cons (desktop-file-name (car dired-directory) desktop-dirname) + (cdr dired-directory)) + ;; Directory name, optionally with with shell wildcard. + (desktop-file-name dired-directory desktop-dirname)) + ;; Subdirectories in `dired-subdir-alist'. + (cdr + (nreverse + (mapcar + (function (lambda (f) (desktop-file-name (car f) desktop-dirname))) + dired-subdir-alist))))) + +;;;###autoload +(defun dired-restore-desktop-buffer (desktop-buffer-file-name + desktop-buffer-name + desktop-buffer-misc) + "Restore a dired buffer specified in a desktop file." + ;; First element of `desktop-buffer-misc' is the value of `dired-directory'. + ;; This value is a directory name, optionally with with shell wildcard or + ;; a directory name followed by list of files. + (let* ((dired-dir (car desktop-buffer-misc)) + (dir (if (consp dired-dir) (car dired-dir) dired-dir))) + (if (file-directory-p (file-name-directory dir)) + (progn + (dired dired-dir) + ;; The following elements of `desktop-buffer-misc' are the keys + ;; from `dired-subdir-alist'. + (mapcar 'dired-maybe-insert-subdir (cdr desktop-buffer-misc)) + (current-buffer)) + (message "Desktop: Directory %s no longer exists." dir) + (when desktop-missing-file-warning (sit-for 1)) + nil))) (if (eq system-type 'vax-vms)