annotate lisp/dired-aux.el @ 23323:0800a4f84757

(underlying_strftime): Set the buffer to a nonzero value before calling strftime, and check to see whether strftime has set the buffer to zero. This lets us distinguish between an empty buffer and an error. I'm installing this patch by hand now; it will be superseded whenever the glibc sources are propagated back to fsf.org.
author Paul Eggert <eggert@twinsun.com>
date Fri, 25 Sep 1998 21:40:23 +0000
parents f7b7887cb90f
children c79fbd7d8162
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10213
dd2102e33b29 (dired-string-replace-match): Moved to dired.el.
Richard M. Stallman <rms@gnu.org>
parents: 9978
diff changeset
1 ;;; dired-aux.el --- less commonly used parts of dired -*-byte-compile-dynamic: t;-*-
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
21279
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
3 ;; Copyright (C) 1985, 1986, 1992, 1994, 1998 Free Software Foundation, Inc.
846
20674ae6bf52 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
4
794
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
5 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>.
17977
727cf56647a4 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 17733
diff changeset
6 ;; Maintainer: FSF
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 794
diff changeset
7
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 794
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; any later version.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
23 ;; Boston, MA 02111-1307, USA.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
794
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
25 ;;; Commentary:
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
26
2307
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2229
diff changeset
27 ;; The parts of dired mode not normally used. This is a space-saving hack
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2229
diff changeset
28 ;; to avoid having to load a large mode when all that's wanted are a few
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2229
diff changeset
29 ;; functions.
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2229
diff changeset
30
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; Rewritten in 1990/1991 to add tree features, file marking and
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 ;; sorting by Sebastian Kremer <sk@thp.uni-koeln.de>.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; Finished up by rms in 1992.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
794
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
35 ;;; Code:
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
36
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
37 ;; We need macros in dired.el to compile properly.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
38 (eval-when-compile (require 'dired))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
39
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;;; 15K
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;;;###begin dired-cmd.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 ;; Diffing and compressing
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 (defun dired-diff (file &optional switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 "Compare file at point with file FILE using `diff'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 FILE defaults to the file at the mark.
4478
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
48 The prompted-for file is the first file given to `diff'.
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
49 With prefix arg, prompt for second argument SWITCHES,
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
50 which is options for `diff'."
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 (interactive
3950
6e13c3b03b67 * dired-aux.el (dired-diff): Work even when the mark is inactive.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
52 (let ((default (if (mark t)
6e13c3b03b67 * dired-aux.el (dired-diff): Work even when the mark is inactive.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
53 (save-excursion (goto-char (mark t))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 (dired-get-filename t t)))))
5144
9083db1526b4 (dired-diff): Require diff.
Richard M. Stallman <rms@gnu.org>
parents: 4580
diff changeset
55 (require 'diff)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 (list (read-file-name (format "Diff %s with: %s"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 (dired-get-filename t)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 (if default
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 (concat "(default " default ") ")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ""))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 (dired-current-directory) default t)
4478
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
62 (if current-prefix-arg
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
63 (read-string "Options for diff: "
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
64 (if (stringp diff-switches)
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
65 diff-switches
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
66 (mapconcat 'identity diff-switches " ")))))))
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
67 (diff file (dired-get-filename t) switches))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 (defun dired-backup-diff (&optional switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 "Diff this file with its backup file or vice versa.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 Uses the latest backup, if there are several numerical backups.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 If this file is a backup, diff it with its original.
4478
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
74 The backup file is the first file given to `diff'.
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
75 With prefix arg, prompt for argument SWITCHES which is options for `diff'."
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
76 (interactive
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
77 (if current-prefix-arg
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
78 (list (read-string "Options for diff: "
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
79 (if (stringp diff-switches)
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
80 diff-switches
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
81 (mapconcat 'identity diff-switches " "))))
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
82 nil))
f25a821aefb0 (dired-diff): Read options right here;
Richard M. Stallman <rms@gnu.org>
parents: 3950
diff changeset
83 (diff-backup (dired-get-filename) switches))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 (defun dired-do-chxxx (attribute-name program op-symbol arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 ;; Change file attributes (mode, group, owner) of marked files and
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 ;; refresh their file lines.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 ;; ATTRIBUTE-NAME is a string describing the attribute to the user.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 ;; PROGRAM is the program used to change the attribute.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 ;; OP-SYMBOL is the type of operation (for use in dired-mark-pop-up).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 ;; ARG describes which files to use, as in dired-get-marked-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 (let* ((files (dired-get-marked-files t arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 (new-attribute
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 (dired-mark-read-string
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 (concat "Change " attribute-name " of %s to: ")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 nil op-symbol arg files))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 (operation (concat program " " new-attribute))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 failures)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 (setq failures
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 (dired-bunch-files 10000
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 (function dired-check-process)
16808
aac35896dd04 (dired-do-chxxx): Use -- only on GNU systems.
Richard M. Stallman <rms@gnu.org>
parents: 16791
diff changeset
102 (append
aac35896dd04 (dired-do-chxxx): Use -- only on GNU systems.
Richard M. Stallman <rms@gnu.org>
parents: 16791
diff changeset
103 (list operation program new-attribute)
aac35896dd04 (dired-do-chxxx): Use -- only on GNU systems.
Richard M. Stallman <rms@gnu.org>
parents: 16791
diff changeset
104 (if (string-match "gnu" system-configuration)
aac35896dd04 (dired-do-chxxx): Use -- only on GNU systems.
Richard M. Stallman <rms@gnu.org>
parents: 16791
diff changeset
105 '("--") nil))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 files))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 (dired-do-redisplay arg);; moves point if ARG is an integer
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 (if failures
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 (dired-log-summary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 (format "%s: error" operation)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 nil))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 (defun dired-do-chmod (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 "Change the mode of the marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 This calls chmod, thus symbolic modes like `g+w' are allowed."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 (interactive "P")
11395
a3c6991e86b4 * dired-aux.el (dired-do-chmod): Use dired-chmod-program.
Karl Heuer <kwzh@gnu.org>
parents: 11158
diff changeset
118 (dired-do-chxxx "Mode" dired-chmod-program 'chmod arg))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 (defun dired-do-chgrp (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 "Change the group of the marked (or next ARG) files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 (interactive "P")
11395
a3c6991e86b4 * dired-aux.el (dired-do-chmod): Use dired-chmod-program.
Karl Heuer <kwzh@gnu.org>
parents: 11158
diff changeset
124 (if (memq system-type '(ms-dos windows-nt))
a3c6991e86b4 * dired-aux.el (dired-do-chmod): Use dired-chmod-program.
Karl Heuer <kwzh@gnu.org>
parents: 11158
diff changeset
125 (error "chgrp not supported on this system."))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 (dired-do-chxxx "Group" "chgrp" 'chgrp arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 (defun dired-do-chown (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 "Change the owner of the marked (or next ARG) files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 (interactive "P")
11395
a3c6991e86b4 * dired-aux.el (dired-do-chmod): Use dired-chmod-program.
Karl Heuer <kwzh@gnu.org>
parents: 11158
diff changeset
132 (if (memq system-type '(ms-dos windows-nt))
a3c6991e86b4 * dired-aux.el (dired-do-chmod): Use dired-chmod-program.
Karl Heuer <kwzh@gnu.org>
parents: 11158
diff changeset
133 (error "chown not supported on this system."))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 (dired-do-chxxx "Owner" dired-chown-program 'chown arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 ;; Process all the files in FILES in batches of a convenient size,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 ;; by means of (FUNCALL FUNCTION ARGS... SOME-FILES...).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 ;; Batches are chosen to need less than MAX chars for the file names,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 ;; allowing 3 extra characters of separator per file name.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 (defun dired-bunch-files (max function args files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 (let (pending
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 (pending-length 0)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 failures)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 ;; Accumulate files as long as they fit in MAX chars,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 ;; then process the ones accumulated so far.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (while files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 (let* ((thisfile (car files))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (thislength (+ (length thisfile) 3))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 (rest (cdr files)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 ;; If we have at least 1 pending file
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 ;; and this file won't fit in the length limit, process now.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 (if (and pending (> (+ thislength pending-length) max))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (setq failures
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
154 (nconc (apply function (append args pending))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 failures)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 pending nil
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 pending-length 0))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 ;; Do (setq pending (cons thisfile pending))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 ;; but reuse the cons that was in `files'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 (setcdr files pending)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 (setq pending files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (setq pending-length (+ thislength pending-length))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 (setq files rest)))
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
164 (nconc (apply function (append args pending))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 failures)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 (defun dired-do-print (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 "Print the marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 Uses the shell command coming from variables `lpr-command' and
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 `lpr-switches' as default."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 (let* ((file-list (dired-get-marked-files t arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (command (dired-mark-read-string
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 "Print %s with: "
10982
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
176 (mapconcat 'identity
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
177 (cons lpr-command
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
178 (if (stringp lpr-switches)
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
179 (list lpr-switches)
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
180 lpr-switches))
e5942b624f45 (dired-do-print): Allow lpr-switches to be a string. Clean up.
Richard M. Stallman <rms@gnu.org>
parents: 10213
diff changeset
181 " ")
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 'print arg file-list)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (dired-run-shell-command (dired-shell-stuff-it command file-list nil))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 ;; Read arguments for a marked-files command that wants a string
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 ;; that is not a file name,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 ;; perhaps popping up the list of marked files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 ;; ARG is the prefix arg and indicates whether the files came from
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 ;; marks (ARG=nil) or a repeat factor (integerp ARG).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 ;; If the current file was used, the list has but one element and ARG
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 ;; does not matter. (It is non-nil, non-integer in that case, namely '(4)).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 (defun dired-mark-read-string (prompt initial op-symbol arg files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 ;; PROMPT for a string, with INITIAL input.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 ;; Other args are used to give user feedback and pop-up:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 ;; OP-SYMBOL of command, prefix ARG, marked FILES.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 (dired-mark-pop-up
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 nil op-symbol files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 (function read-string)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (format prompt (dired-mark-prompt arg files)) initial))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201
890
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
202 ;;; Cleaning a directory: flagging some backups for deletion.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
203
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
204 (defvar dired-file-version-alist)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
205
890
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
206 (defun dired-clean-directory (keep)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
207 "Flag numerical backups for deletion.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
208 Spares `dired-kept-versions' latest versions, and `kept-old-versions' oldest.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
209 Positive prefix arg KEEP overrides `dired-kept-versions';
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
210 Negative prefix arg KEEP overrides `kept-old-versions' with KEEP made positive.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
211
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
212 To clear the flags on these files, you can use \\[dired-flag-backup-files]
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
213 with a prefix argument."
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
214 (interactive "P")
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
215 (setq keep (if keep (prefix-numeric-value keep) dired-kept-versions))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
216 (let ((early-retention (if (< keep 0) (- keep) kept-old-versions))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
217 (late-retention (if (<= keep 0) dired-kept-versions keep))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
218 (dired-file-version-alist ()))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
219 (message "Cleaning numerical backups (keeping %d late, %d old)..."
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
220 late-retention early-retention)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
221 ;; Look at each file.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
222 ;; If the file has numeric backup versions,
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
223 ;; put on dired-file-version-alist an element of the form
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
224 ;; (FILENAME . VERSION-NUMBER-LIST)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
225 (dired-map-dired-file-lines (function dired-collect-file-versions))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
226 ;; Sort each VERSION-NUMBER-LIST,
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
227 ;; and remove the versions not to be deleted.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
228 (let ((fval dired-file-version-alist))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
229 (while fval
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
230 (let* ((sorted-v-list (cons 'q (sort (cdr (car fval)) '<)))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
231 (v-count (length sorted-v-list)))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
232 (if (> v-count (+ early-retention late-retention))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
233 (rplacd (nthcdr early-retention sorted-v-list)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
234 (nthcdr (- v-count late-retention)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
235 sorted-v-list)))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
236 (rplacd (car fval)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
237 (cdr sorted-v-list)))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
238 (setq fval (cdr fval))))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
239 ;; Look at each file. If it is a numeric backup file,
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
240 ;; find it in a VERSION-NUMBER-LIST and maybe flag it for deletion.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
241 (dired-map-dired-file-lines (function dired-trample-file-versions))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
242 (message "Cleaning numerical backups...done")))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
243
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
244 ;;; Subroutines of dired-clean-directory.
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
245
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
246 (defun dired-map-dired-file-lines (fun)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
247 ;; Perform FUN with point at the end of each non-directory line.
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
248 ;; FUN takes one argument, the absolute filename.
890
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
249 (save-excursion
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
250 (let (file buffer-read-only)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
251 (goto-char (point-min))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
252 (while (not (eobp))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
253 (save-excursion
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
254 (and (not (looking-at dired-re-dir))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
255 (not (eolp))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
256 (setq file (dired-get-filename nil t)) ; nil on non-file
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
257 (progn (end-of-line)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
258 (funcall fun file))))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
259 (forward-line 1)))))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
260
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
261 (defun dired-collect-file-versions (fn)
9978
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
262 (let ((fn (file-name-sans-versions fn)))
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
263 ;; Only do work if this file is not already in the alist.
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
264 (if (assoc fn dired-file-version-alist)
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
265 nil
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
266 ;; If it looks like file FN has versions, return a list of the versions.
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
267 ;;That is a list of strings which are file names.
10213
dd2102e33b29 (dired-string-replace-match): Moved to dired.el.
Richard M. Stallman <rms@gnu.org>
parents: 9978
diff changeset
268 ;;The caller may want to flag some of these files for deletion.
9978
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
269 (let* ((base-versions
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
270 (concat (file-name-nondirectory fn) ".~"))
17733
6d8fecd12940 (dired-collect-file-versions):
Richard M. Stallman <rms@gnu.org>
parents: 17272
diff changeset
271 (backup-extract-version-start (length base-versions))
9978
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
272 (possibilities (file-name-all-completions
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
273 base-versions
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
274 (file-name-directory fn)))
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
275 (versions (mapcar 'backup-extract-version possibilities)))
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
276 (if versions
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
277 (setq dired-file-version-alist
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
278 (cons (cons fn versions)
5b5406fbd833 (dired-collect-file-versions): Discard version #s from
Richard M. Stallman <rms@gnu.org>
parents: 9660
diff changeset
279 dired-file-version-alist)))))))
890
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
280
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
281 (defun dired-trample-file-versions (fn)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
282 (let* ((start-vn (string-match "\\.~[0-9]+~$" fn))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
283 base-version-list)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
284 (and start-vn
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
285 (setq base-version-list ; there was a base version to which
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
286 (assoc (substring fn 0 start-vn) ; this looks like a
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
287 dired-file-version-alist)) ; subversion
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
288 (not (memq (string-to-int (substring fn (+ 2 start-vn)))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
289 base-version-list)) ; this one doesn't make the cut
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
290 (progn (beginning-of-line)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
291 (delete-char 1)
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
292 (insert dired-del-marker)))))
bad1b9af86a1 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 878
diff changeset
293
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 ;;; Shell commands
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (defun dired-read-shell-command (prompt arg files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 ;; "Read a dired shell command prompting with PROMPT (using read-string).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 ;;ARG is the prefix arg and may be used to indicate in the prompt which
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 ;; files are affected.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 ;;This is an extra function so that you can redefine it, e.g., to use gmhist."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 (dired-mark-pop-up
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 nil 'shell files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 (function read-string)
12733
2b3371d2facb (dired-read-shell-command): Pass `shell-command-history' to read-string.
Richard M. Stallman <rms@gnu.org>
parents: 12338
diff changeset
304 (format prompt (dired-mark-prompt arg files))
2b3371d2facb (dired-read-shell-command): Pass `shell-command-history' to read-string.
Richard M. Stallman <rms@gnu.org>
parents: 12338
diff changeset
305 nil 'shell-command-history))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 ;; The in-background argument is only needed in Emacs 18 where
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 ;; shell-command doesn't understand an appended ampersand `&'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 ;;;###autoload
18500
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
310 (defun dired-do-shell-command (command &optional arg file-list)
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
311 "Run a shell command COMMAND on the marked files.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
312 If no files are marked or a specific numeric prefix arg is given,
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
313 the next ARG files are used. Just \\[universal-argument] means the current file.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
314 The prompt mentions the file(s) or the marker, as appropriate.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
315
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 If there is output, it goes to a separate buffer.
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
317
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 Normally the command is run on each file individually.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 However, if there is a `*' in the command then it is run
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 just once with the entire file list substituted there.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
322 No automatic redisplay of dired buffers is attempted, as there's no
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
323 telling what files the command may have changed. Type
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
324 \\[dired-do-redisplay] to redisplay the marked files.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 The shell command has the top level directory as working directory, so
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 output files usually are created there instead of in a subdir."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 ;;Functions dired-run-shell-command and dired-shell-stuff-it do the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 ;;actual work and can be redefined for customization.
18500
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
330 (interactive
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
331 (let ((files (dired-get-marked-files t current-prefix-arg)))
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
332 (list
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
333 ;; Want to give feedback whether this file or marked files are used:
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
334 (dired-read-shell-command (concat "! on "
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
335 "%s: ")
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
336 current-prefix-arg
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
337 files)
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
338 current-prefix-arg
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
339 files)))
2240a2e37b12 (dired-do-shell-command): New arg FILE-LIST
Richard M. Stallman <rms@gnu.org>
parents: 18417
diff changeset
340 (let* ((on-each (not (string-match "\\*" command))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (if on-each
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (dired-bunch-files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (- 10000 (length command))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (function (lambda (&rest files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (dired-run-shell-command
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
346 (dired-shell-stuff-it command files t arg))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 nil
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 file-list)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 ;; execute the shell command
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 (dired-run-shell-command
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
351 (dired-shell-stuff-it command file-list nil arg)))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 ;; Might use {,} for bash or csh:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (defvar dired-mark-prefix ""
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 "Prepended to marked files in dired shell commands.")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 (defvar dired-mark-postfix ""
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 "Appended to marked files in dired shell commands.")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 (defvar dired-mark-separator " "
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 "Separates marked files in dired shell commands.")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 (defun dired-shell-stuff-it (command file-list on-each &optional raw-arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 ;; "Make up a shell command line from COMMAND and FILE-LIST.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 ;; If ON-EACH is t, COMMAND should be applied to each file, else
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 ;; simply concat all files and apply COMMAND to this.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 ;; FILE-LIST's elements will be quoted for the shell."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 ;; Might be redefined for smarter things and could then use RAW-ARG
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 ;; (coming from interactive P and currently ignored) to decide what to do.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 ;; Smart would be a way to access basename or extension of file names.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 ;; See dired-trns.el for an approach to this.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 ;; Bug: There is no way to quote a *
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 ;; On the other hand, you can never accidentally get a * into your cmd.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (let ((stuff-it
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (if (string-match "\\*" command)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (function (lambda (x)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 (dired-replace-in-string "\\*" x command)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (function (lambda (x) (concat command " " x))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (if on-each
21186
de9c2d924962 (dired-shell-stuff-it): Use shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents: 18500
diff changeset
378 (mapconcat stuff-it (mapcar 'shell-quote-argument file-list) ";")
de9c2d924962 (dired-shell-stuff-it): Use shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents: 18500
diff changeset
379 (let ((fns (mapconcat 'shell-quote-argument
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 file-list dired-mark-separator)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (if (> (length file-list) 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (setq fns (concat dired-mark-prefix fns dired-mark-postfix)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (funcall stuff-it fns)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 ;; This is an extra function so that it can be redefined by ange-ftp.
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
386 (defun dired-run-shell-command (command)
21279
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
387 (let ((handler
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
388 (find-file-name-handler (directory-file-name default-directory)
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
389 'shell-command)))
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
390 (if handler (apply handler 'shell-command (list command))
9d5cc9392151 (dired-run-shell-command): Maybe run handler.
Dave Love <fx@gnu.org>
parents: 21186
diff changeset
391 (shell-command command)))
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
392 ;; Return nil for sake of nconc in dired-bunch-files.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
393 nil)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 ;; In Emacs 19 this will return program's exit status.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 ;; This is a separate function so that ange-ftp can redefine it.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (defun dired-call-process (program discard &rest arguments)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 ; "Run PROGRAM with output to current buffer unless DISCARD is t.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 ;Remaining arguments are strings passed as command arguments to PROGRAM."
14635
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
400 ;; Look for a handler for default-directory in case it is a remote file name.
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
401 (let ((handler
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
402 (find-file-name-handler (directory-file-name default-directory)
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
403 'dired-call-process)))
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
404 (if handler (apply handler 'dired-call-process
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
405 program discard arguments)
7a7506ffde31 (dired-call-process): Call file name handler.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
406 (apply 'call-process program nil (not discard) nil arguments))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 (defun dired-check-process (msg program &rest arguments)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 ; "Display MSG while running PROGRAM, and check for output.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 ;Remaining arguments are strings passed as command arguments to PROGRAM.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 ; On error, insert output
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 ; in a log buffer and return the offending ARGUMENTS or PROGRAM.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 ; Caller can cons up a list of failed args.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 ;Else returns nil for success."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 (let (err-buffer err (dir default-directory))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 (message "%s..." msg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 ;; Get a clean buffer for error output:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (setq err-buffer (get-buffer-create " *dired-check-process output*"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 (set-buffer err-buffer)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (erase-buffer)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (setq default-directory dir ; caller's default-directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 err (/= 0
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (apply (function dired-call-process) program nil arguments)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (if err
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (dired-log (concat program " " (prin1-to-string arguments) "\n"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 (dired-log err-buffer)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 (or arguments program t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 (kill-buffer err-buffer)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (message "%s...done" msg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 nil))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 ;; Commands that delete or redisplay part of the dired buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 (defun dired-kill-line (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (setq arg (prefix-numeric-value arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (let (buffer-read-only file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 (while (/= 0 arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (setq file (dired-get-filename nil t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 (if (not file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 (error "Can only kill file lines.")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (save-excursion (and file
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (dired-goto-subdir file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (dired-kill-subdir)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (delete-region (progn (beginning-of-line) (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 (progn (forward-line 1) (point)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 (if (> arg 0)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 (setq arg (1- arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 (setq arg (1+ arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 (forward-line -1))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 (dired-move-to-filename)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (defun dired-do-kill-lines (&optional arg fmt)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 "Kill all marked lines (not the files).
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
458 With a prefix argument, kill that many lines starting with the current line.
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
459 \(A negative argument kills lines before the current line.)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
460 To kill an entire subdirectory, go to its directory header line
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
461 and use this command with a prefix argument (the value does not matter)."
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 ;; Returns count of killed lines. FMT="" suppresses message.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 (interactive "P")
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
464 (if arg
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
465 (if (dired-get-subdir)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
466 (dired-kill-subdir)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
467 (dired-kill-line arg))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
468 (save-excursion
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
469 (goto-char (point-min))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
470 (let (buffer-read-only (count 0))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
471 (if (not arg) ; kill marked lines
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
472 (let ((regexp (dired-marker-regexp)))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
473 (while (and (not (eobp))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
474 (re-search-forward regexp nil t))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
475 (setq count (1+ count))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
476 (delete-region (progn (beginning-of-line) (point))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
477 (progn (forward-line 1) (point)))))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
478 ;; else kill unmarked lines
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
479 (while (not (eobp))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
480 (if (or (dired-between-files)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
481 (not (looking-at "^ ")))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
482 (forward-line 1)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (setq count (1+ count))
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
484 (delete-region (point) (save-excursion
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
485 (forward-line 1)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
486 (point))))))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
487 (or (equal "" fmt)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
488 (message (or fmt "Killed %d line%s.") count (dired-plural-s count)))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
489 count))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 ;;;###end dired-cmd.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 ;;; 30K
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 ;;;###begin dired-cp.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 (defun dired-compress ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 ;; Compress or uncompress the current file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 ;; Return nil for success, offending filename else.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 (let* (buffer-read-only
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
500 (from-file (dired-get-filename))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
501 (new-file (dired-compress-file from-file)))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
502 (if new-file
4481
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
503 (let ((start (point)))
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
504 ;; Remove any preexisting entry for the name NEW-FILE.
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
505 (condition-case nil
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
506 (dired-remove-entry new-file)
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
507 (error nil))
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
508 (goto-char start)
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
509 ;; Now replace the current line with an entry for NEW-FILE.
c40febdb9967 (dired-compress-file): For .z file, run gunzip.
Richard M. Stallman <rms@gnu.org>
parents: 4478
diff changeset
510 (dired-update-file-line new-file) nil)
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
511 (dired-log (concat "Failed to compress" from-file))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
512 from-file)))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
513
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
514 (defvar dired-compress-file-suffixes
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
515 '(("\\.gz\\'" "" "gunzip")
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
516 ("\\.tgz\\'" ".tar" "gunzip")
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
517 ("\\.Z\\'" "" "uncompress")
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
518 ;; For .z, try gunzip. It might be an old gzip file,
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
519 ;; or it might be from compact? pack? (which?) but gunzip handles both.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
520 ("\\.z\\'" "" "gunzip")
23125
f7b7887cb90f (dired-compress-file-suffixes): Add `bz2'.
Karl Heuer <kwzh@gnu.org>
parents: 23012
diff changeset
521 ("\\.bz2\\'" "" "bunzip2")
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
522 ;; This item controls naming for compression.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
523 ("\\.tar\\'" ".tgz" nil))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
524 "Control changes in file name suffixes for compression and uncompression.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
525 Each element specifies one transformation rule, and has the form:
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
526 (REGEXP NEW-SUFFIX PROGRAM)
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
527 The rule applies when the old file name matches REGEXP.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
528 The new file name is computed by deleting the part that matches REGEXP
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
529 (as well as anything after that), then adding NEW-SUFFIX in its place.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
530 If PROGRAM is non-nil, the rule is an uncompression rule,
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
531 and uncompression is done by running PROGRAM.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
532 Otherwise, the rule is a compression rule, and compression is done with gzip.")
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
533
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
534 ;;;###autoload
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
535 (defun dired-compress-file (file)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
536 ;; Compress or uncompress FILE.
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
537 ;; Return the name of the compressed or uncompressed file.
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3398
diff changeset
538 ;; Return nil if no change in files.
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
539 (let ((handler (find-file-name-handler file 'dired-compress-file))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
540 suffix newname
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
541 (suffixes dired-compress-file-suffixes))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
542 ;; See if any suffix rule matches this file name.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
543 (while suffixes
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
544 (let (case-fold-search)
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
545 (if (string-match (car (car suffixes)) file)
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
546 (setq suffix (car suffixes) suffixes nil))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
547 (setq suffixes (cdr suffixes))))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
548 ;; If so, compute desired new name.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
549 (if suffix
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
550 (setq newname (concat (substring file 0 (match-beginning 0))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
551 (nth 1 suffix))))
1110
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
552 (cond (handler
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
553 (funcall handler 'dired-compress-file file))
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
554 ((file-symlink-p file)
f165d900e06e *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 917
diff changeset
555 nil)
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
556 ((and suffix (nth 2 suffix))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
557 ;; We found an uncompression rule.
3398
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
558 (if (not (dired-check-process (concat "Uncompressing " file)
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
559 (nth 2 suffix) file))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
560 newname))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 (t
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
562 ;;; We don't recognize the file as compressed, so compress it.
3398
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
563 ;;; Try gzip; if we don't have that, use compress.
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
564 (condition-case nil
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
565 (if (not (dired-check-process (concat "Compressing " file)
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
566 "gzip" "-f" file))
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
567 (let ((out-name
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
568 (if (file-exists-p (concat file ".gz"))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
569 (concat file ".gz")
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
570 (concat file ".z"))))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
571 ;; Rename the compressed file to NEWNAME
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
572 ;; if it hasn't got that name already.
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
573 (if (and newname (not (equal newname out-name)))
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
574 (progn
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
575 (rename-file out-name newname t)
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
576 newname)
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
577 out-name)))
3398
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
578 (file-error
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
579 (if (not (dired-check-process (concat "Compressing " file)
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
580 "compress" "-f" file))
14737
9e847303147a (dired-compress-file-suffixes): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14635
diff changeset
581 ;; Don't use NEWNAME with `compress'.
3398
4fb117e74844 (dired-compress-file): Use gzip when proper/possible.
Richard M. Stallman <rms@gnu.org>
parents: 3089
diff changeset
582 (concat file ".Z"))))))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 (defun dired-mark-confirm (op-symbol arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 ;; Request confirmation from the user that the operation described
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 ;; by OP-SYMBOL is to be performed on the marked files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 ;; Confirmation consists in a y-or-n question with a file list
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 ;; pop-up unless OP-SYMBOL is a member of `dired-no-confirm'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 ;; The files used are determined by ARG (as in dired-get-marked-files).
17199
91cf1da75ccd Allow a dired-no-confirm of t
Simon Marshall <simon@gnu.org>
parents: 16972
diff changeset
590 (or (eq dired-no-confirm t)
91cf1da75ccd Allow a dired-no-confirm of t
Simon Marshall <simon@gnu.org>
parents: 16972
diff changeset
591 (memq op-symbol dired-no-confirm)
1538
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
592 (let ((files (dired-get-marked-files t arg))
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
593 (string (if (eq op-symbol 'compress) "Compress or uncompress"
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
594 (capitalize (symbol-name op-symbol)))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 (dired-mark-pop-up nil op-symbol files (function y-or-n-p)
1538
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
596 (concat string " "
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 (dired-mark-prompt arg files) "? ")))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 (defun dired-map-over-marks-check (fun arg op-symbol &optional show-progress)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 ; "Map FUN over marked files (with second ARG like in dired-map-over-marks)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 ; and display failures.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 ; FUN takes zero args. It returns non-nil (the offending object, e.g.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 ; the short form of the filename) for a failure and probably logs a
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 ; detailed error explanation using function `dired-log'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 ; OP-SYMBOL is a symbol describing the operation performed (e.g.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 ; `compress'). It is used with `dired-mark-pop-up' to prompt the user
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 ; (e.g. with `Compress * [2 files]? ') and to display errors (e.g.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610 ; `Failed to compress 1 of 2 files - type W to see why ("foo")')
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 ; SHOW-PROGRESS if non-nil means redisplay dired after each file."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 (if (dired-mark-confirm op-symbol arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 (let* ((total-list;; all of FUN's return values
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 (dired-map-over-marks (funcall fun) arg show-progress))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 (total (length total-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 (failures (delq nil total-list))
1538
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
618 (count (length failures))
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
619 (string (if (eq op-symbol 'compress) "Compress or uncompress"
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
620 (capitalize (symbol-name op-symbol)))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 (if (not failures)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 (message "%s: %d file%s."
1538
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
623 string total (dired-plural-s total))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 ;; end this bunch of errors:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 (dired-log-summary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 (format "Failed to %s %d of %d file%s"
1538
2d29bf379da3 (dired-mark-confirm): For `compress', say `Compress or uncompress'.
Richard M. Stallman <rms@gnu.org>
parents: 1381
diff changeset
627 (downcase string) count total (dired-plural-s total))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 failures)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 (defvar dired-query-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631 '((?\y . y) (?\040 . y) ; `y' or SPC means accept once
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 (?n . n) (?\177 . n) ; `n' or DEL skips once
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 (?! . yes) ; `!' accepts rest
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 (?q. no) (?\e . no) ; `q' or ESC skips rest
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
635 ;; None of these keys quit - use C-g for that.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 ))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638 (defun dired-query (qs-var qs-prompt &rest qs-args)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 ;; Query user and return nil or t.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 ;; Store answer in symbol VAR (which must initially be bound to nil).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 ;; Format PROMPT with ARGS.
917
d09aafad0e95 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 910
diff changeset
642 ;; Binding variable help-form will help the user who types the help key.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 (let* ((char (symbol-value qs-var))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 (action (cdr (assoc char dired-query-alist))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 (cond ((eq 'yes action)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646 t) ; accept, and don't ask again
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 ((eq 'no action)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648 nil) ; skip, and don't ask again
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 (t;; no lasting effects from last time we asked - ask now
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 (let ((qprompt (concat qs-prompt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 (if help-form
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652 (format " [Type yn!q or %s] "
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653 (key-description
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
654 (char-to-string help-char)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655 " [Type y, n, q or !] ")))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656 result elt)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 ;; Actually it looks nicer without cursor-in-echo-area - you can
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658 ;; look at the dired buffer instead of at the prompt to decide.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 (apply 'message qprompt qs-args)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 (setq char (set qs-var (read-char)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661 (while (not (setq elt (assoc char dired-query-alist)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 (message "Invalid char - type %c for help." help-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 (ding)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 (sit-for 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 (apply 'message qprompt qs-args)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 (setq char (set qs-var (read-char))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
667 (memq (cdr elt) '(t y yes)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
670 (defun dired-do-compress (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
671 "Compress or uncompress marked (or next ARG) files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673 (dired-map-over-marks-check (function dired-compress) arg 'compress t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 ;; Commands for Emacs Lisp files - load and byte compile
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 (defun dired-byte-compile ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 ;; Return nil for success, offending file name else.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679 (let* ((filename (dired-get-filename))
8236
444501972687 (dired-byte-compile): Use byte-compile-dest-file
Richard M. Stallman <rms@gnu.org>
parents: 7838
diff changeset
680 elc-file buffer-read-only failure)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681 (condition-case err
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 (save-excursion (byte-compile-file filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683 (error
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 (setq failure err)))
8236
444501972687 (dired-byte-compile): Use byte-compile-dest-file
Richard M. Stallman <rms@gnu.org>
parents: 7838
diff changeset
685 (setq elc-file (byte-compile-dest-file filename))
12972
62682d1146a0 (dired-byte-compile): Report failure if output file is not created.
Richard M. Stallman <rms@gnu.org>
parents: 12905
diff changeset
686 (or (file-exists-p elc-file)
62682d1146a0 (dired-byte-compile): Report failure if output file is not created.
Richard M. Stallman <rms@gnu.org>
parents: 12905
diff changeset
687 (setq failure t))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 (if failure
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 (dired-log "Byte compile error for %s:\n%s\n" filename failure)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691 (dired-make-relative filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692 (dired-remove-file elc-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 (forward-line) ; insert .elc after its .el file
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 (dired-add-file elc-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695 nil)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 (defun dired-do-byte-compile (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699 "Byte compile marked (or next ARG) Emacs Lisp files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701 (dired-map-over-marks-check (function dired-byte-compile) arg 'byte-compile t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
703 (defun dired-load ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704 ;; Return nil for success, offending file name else.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
705 (let ((file (dired-get-filename)) failure)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706 (condition-case err
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707 (load file nil nil t)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708 (error (setq failure err)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 (if (not failure)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710 nil
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711 (dired-log "Load error for %s:\n%s\n" file failure)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 (dired-make-relative file))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 (defun dired-do-load (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
716 "Load the marked (or next ARG) Emacs Lisp files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 (dired-map-over-marks-check (function dired-load) arg 'load t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 (defun dired-do-redisplay (&optional arg test-for-subdir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 "Redisplay all marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 If on a subdir line, redisplay that subdirectory. In that case,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 a prefix arg lets you edit the `ls' switches used for the new listing."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725 ;; Moves point if the next ARG files are redisplayed.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 (interactive "P\np")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 (if (and test-for-subdir (dired-get-subdir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 (dired-insert-subdir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 (dired-get-subdir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730 (if arg (read-string "Switches for listing: " dired-actual-switches)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 (message "Redisplaying...")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 ;; message much faster than making dired-map-over-marks show progress
12338
3e84024ad5d8 (dired-do-redisplay): Call dired-uncache.
Richard M. Stallman <rms@gnu.org>
parents: 11458
diff changeset
733 (dired-uncache
3e84024ad5d8 (dired-do-redisplay): Call dired-uncache.
Richard M. Stallman <rms@gnu.org>
parents: 11458
diff changeset
734 (if (consp dired-directory) (car dired-directory) dired-directory))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 (dired-map-over-marks (let ((fname (dired-get-filename)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
736 (message "Redisplaying... %s" fname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737 (dired-update-file-line fname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
738 arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
739 (dired-move-to-filename)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 (message "Redisplaying...done")))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
741
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
742 (defun dired-update-file-line (file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
743 ;; Delete the current line, and insert an entry for FILE.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
744 ;; If FILE is nil, then just delete the current line.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
745 ;; Keeps any marks that may be present in column one (doing this
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
746 ;; here is faster than with dired-add-entry's optional arg).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
747 ;; Does not update other dired buffers. Use dired-relist-entry for that.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 (beginning-of-line)
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
749 (let ((char (following-char)) (opoint (point))
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
750 (buffer-read-only))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751 (delete-region (point) (progn (forward-line 1) (point)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752 (if file
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
753 (progn
18417
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
754 (dired-add-entry file nil t)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755 ;; Replace space by old marker without moving point.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
756 ;; Faster than goto+insdel inside a save-excursion?
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
757 (subst-char-in-region opoint (1+ opoint) ?\040 char))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 (dired-move-to-filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
759
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
760 (defun dired-fun-in-all-buffers (directory file fun &rest args)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 ;; In all buffers dired'ing DIRECTORY, run FUN with ARGS.
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
762 ;; If the buffer has a wildcard pattern, check that it matches FILE.
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
763 ;; (FILE does not include a directory component.)
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
764 ;; FILE may be nil, in which case ignore it.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
765 ;; Return list of buffers where FUN succeeded (i.e., returned non-nil).
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
766 (let ((buf-list (dired-buffers-for-dir (expand-file-name directory)
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
767 file))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 (obuf (current-buffer))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 buf success-list)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 (while buf-list
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 (setq buf (car buf-list)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 buf-list (cdr buf-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773 (unwind-protect
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
774 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
775 (set-buffer buf)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
776 (if (apply fun args)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 (setq success-list (cons (buffer-name buf) success-list))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778 (set-buffer obuf)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779 success-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
781 ;;;###autoload
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
782 (defun dired-add-file (filename &optional marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
783 (dired-fun-in-all-buffers
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
784 (file-name-directory filename) (file-name-nondirectory filename)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
785 (function dired-add-entry) filename marker-char))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786
18417
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
787 (defun dired-add-entry (filename &optional marker-char relative)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 ;; Add a new entry for FILENAME, optionally marking it
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 ;; with MARKER-CHAR (a character, else dired-marker-char is used).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
790 ;; Note that this adds the entry `out of order' if files sorted by
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791 ;; time, etc.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
792 ;; At least this version inserts in the right subdirectory (if present).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
793 ;; And it skips "." or ".." (see `dired-trivial-filenames').
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
794 ;; Hidden subdirs are exposed if a file is added there.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
795 (setq filename (directory-file-name filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796 ;; Entry is always for files, even if they happen to also be directories
18417
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
797 (let* ((opoint (point))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
798 (cur-dir (dired-current-directory))
11158
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
799 (orig-file-name filename)
18417
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
800 (directory (if relative cur-dir (file-name-directory filename)))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
801 reason)
18417
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
802 (setq filename
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
803 (if relative
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
804 (file-relative-name filename directory)
9a272a7dae12 (dired-add-entry): New optional arg RELATIVE.
Richard M. Stallman <rms@gnu.org>
parents: 17997
diff changeset
805 (file-name-nondirectory filename))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
806 reason
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807 (catch 'not-found
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
808 (if (string= directory cur-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
809 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 (skip-chars-forward "^\r\n")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811 (if (eq (following-char) ?\r)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 (dired-unhide-subdir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
813 ;; We are already where we should be, except when
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
814 ;; point is before the subdir line or its total line.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815 (let ((p (dired-after-subdir-garbage cur-dir)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
816 (if (< (point) p)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
817 (goto-char p))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818 ;; else try to find correct place to insert
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819 (if (dired-goto-subdir directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
820 (progn;; unhide if necessary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821 (if (looking-at "\r");; point is at end of subdir line
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
822 (dired-unhide-subdir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
823 ;; found - skip subdir and `total' line
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
824 ;; and uninteresting files like . and ..
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
825 ;; This better not moves into the next subdir!
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
826 (dired-goto-next-nontrivial-file))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
827 ;; not found
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
828 (throw 'not-found "Subdir not found")))
6824
ec94aee0bf55 (dired-add-entry): Set opoint at beginning of line.
Richard M. Stallman <rms@gnu.org>
parents: 6633
diff changeset
829 (let (buffer-read-only opoint)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
830 (beginning-of-line)
6824
ec94aee0bf55 (dired-add-entry): Set opoint at beginning of line.
Richard M. Stallman <rms@gnu.org>
parents: 6633
diff changeset
831 (setq opoint (point))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
832 (dired-add-entry-do-indentation marker-char)
6824
ec94aee0bf55 (dired-add-entry): Set opoint at beginning of line.
Richard M. Stallman <rms@gnu.org>
parents: 6633
diff changeset
833 ;; don't expand `.'. Show just the file name within directory.
6633
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
834 (let ((default-directory directory))
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
835 (insert-directory filename
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
836 (concat dired-actual-switches "d")))
11158
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
837 ;; Compensate for a bug in ange-ftp.
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
838 ;; It inserts the file's absolute name, rather than
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
839 ;; the relative one. That may be hard to fix since it
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
840 ;; is probably controlled by something in ftp.
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
841 (goto-char opoint)
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
842 (let ((inserted-name (dired-get-filename 'no-dir)))
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
843 (if (file-name-directory inserted-name)
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
844 (progn
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
845 (end-of-line)
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
846 (delete-char (- (length inserted-name)))
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
847 (insert filename)
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
848 (forward-char 1))
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
849 (forward-line 1)))
b9376f3450bb (dired-add-entry): If ange-ftp inserted the file's absolute name, fix that.
Richard M. Stallman <rms@gnu.org>
parents: 10982
diff changeset
850 ;; Give each line a text property recording info about it.
6633
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
851 (dired-insert-set-properties opoint (point))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852 (forward-line -1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 (if dired-after-readin-hook;; the subdir-alist is not affected...
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 (save-excursion;; ...so we can run it right now:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 (save-restriction
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 (beginning-of-line)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 (narrow-to-region (point) (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 (forward-line 1) (point)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 (run-hooks 'dired-after-readin-hook))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
860 (dired-move-to-filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
861 ;; return nil if all went well
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
862 nil))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
863 (if reason ; don't move away on failure
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864 (goto-char opoint))
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3398
diff changeset
865 (not reason))) ; return t on success, nil else
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
866
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
867 ;; This is a separate function for the sake of nested dired format.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868 (defun dired-add-entry-do-indentation (marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869 ;; two spaces or a marker plus a space:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870 (insert (if marker-char
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
871 (if (integerp marker-char) marker-char dired-marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
872 ?\040)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
873 ?\040))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
874
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875 (defun dired-after-subdir-garbage (dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 ;; Return pos of first file line of DIR, skipping header and total
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 ;; or wildcard lines.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 ;; Important: never moves into the next subdir.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 ;; DIR is assumed to be unhidden.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 ;; Will probably be redefined for VMS etc.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882 (or (dired-goto-subdir dir) (error "This cannot happen"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 (forward-line 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 (while (and (not (eolp)) ; don't cross subdir boundary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 (not (dired-move-to-filename)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 (forward-line 1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 (point)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
889 ;;;###autoload
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 (defun dired-remove-file (file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 (dired-fun-in-all-buffers
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
892 (file-name-directory file) (file-name-nondirectory file)
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
893 (function dired-remove-entry) file))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
894
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895 (defun dired-remove-entry (file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
896 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
897 (and (dired-goto-file file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
898 (let (buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
899 (delete-region (progn (beginning-of-line) (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
900 (save-excursion (forward-line 1) (point)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
901
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
902 ;;;###autoload
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
903 (defun dired-relist-file (file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 (dired-fun-in-all-buffers (file-name-directory file)
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
905 (file-name-nondirectory file)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
906 (function dired-relist-entry) file))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
907
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
908 (defun dired-relist-entry (file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
909 ;; Relist the line for FILE, or just add it if it did not exist.
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
910 ;; FILE must be an absolute file name.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
911 (let (buffer-read-only marker)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
912 ;; If cursor is already on FILE's line delete-region will cause
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
913 ;; save-excursion to fail because of floating makers,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
914 ;; moving point to beginning of line. Sigh.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
915 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
916 (and (dired-goto-file file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
917 (delete-region (progn (beginning-of-line)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918 (setq marker (following-char))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
919 (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
920 (save-excursion (forward-line 1) (point))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
921 (setq file (directory-file-name file))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 (dired-add-entry file (if (eq ?\040 marker) nil marker)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
923
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
924 ;;; Copy, move/rename, making hard and symbolic links
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925
17997
ba5fefe8ede1 Customize.
Richard M. Stallman <rms@gnu.org>
parents: 17977
diff changeset
926 (defcustom dired-backup-overwrite nil
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
927 "*Non-nil if Dired should ask about making backups before overwriting files.
17997
ba5fefe8ede1 Customize.
Richard M. Stallman <rms@gnu.org>
parents: 17977
diff changeset
928 Special value `always' suppresses confirmation."
ba5fefe8ede1 Customize.
Richard M. Stallman <rms@gnu.org>
parents: 17977
diff changeset
929 :type '(choice (const :tag "off" nil)
ba5fefe8ede1 Customize.
Richard M. Stallman <rms@gnu.org>
parents: 17977
diff changeset
930 (const :tag "suppress" always)
22573
de7033a2c5fe (dired-backup-overwrite): Use `other' widget type.
Andreas Schwab <schwab@suse.de>
parents: 22094
diff changeset
931 (other :tag "ask" t))
17997
ba5fefe8ede1 Customize.
Richard M. Stallman <rms@gnu.org>
parents: 17977
diff changeset
932 :group 'dired)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
934 (defvar dired-overwrite-confirmed)
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
935
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 (defun dired-handle-overwrite (to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937 ;; Save old version of a to be overwritten file TO.
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
938 ;; `dired-overwrite-confirmed' and `overwrite-backup-query' are fluid vars
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 ;; from dired-create-files.
15160
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
940 (let (backup)
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
941 (if (and dired-backup-overwrite
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
942 dired-overwrite-confirmed
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
943 (setq backup (car (find-backup-file-name to)))
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
944 (or (eq 'always dired-backup-overwrite)
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
945 (dired-query 'overwrite-backup-query
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
946 (format "Make backup for existing file `%s'? " to))))
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
947 (progn
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
948 (rename-file to backup 0) ; confirm overwrite of old backup
bc35b62c3798 (dired-handle-overwrite): `find-backup-file-name'
Richard M. Stallman <rms@gnu.org>
parents: 14737
diff changeset
949 (dired-relist-entry backup)))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
950
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
951 ;;;###autoload
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 (defun dired-copy-file (from to ok-flag)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
953 (dired-handle-overwrite to)
17272
5dd977f51652 (dired-copy-file): Handle file-date-error.
Richard M. Stallman <rms@gnu.org>
parents: 17205
diff changeset
954 (condition-case ()
5dd977f51652 (dired-copy-file): Handle file-date-error.
Richard M. Stallman <rms@gnu.org>
parents: 17205
diff changeset
955 (copy-file from to ok-flag dired-copy-preserve-time)
5dd977f51652 (dired-copy-file): Handle file-date-error.
Richard M. Stallman <rms@gnu.org>
parents: 17205
diff changeset
956 (file-date-error (message "Can't set date")
5dd977f51652 (dired-copy-file): Handle file-date-error.
Richard M. Stallman <rms@gnu.org>
parents: 17205
diff changeset
957 (sit-for 1))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
958
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
959 ;;;###autoload
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960 (defun dired-rename-file (from to ok-flag)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 (dired-handle-overwrite to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 (rename-file from to ok-flag) ; error is caught in -create-files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 ;; Silently rename the visited file of any buffer visiting this file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964 (and (get-file-buffer from)
16972
99de1dc68184 (dired-rename-file): Pass new arg to set-visited-file-name.
Richard M. Stallman <rms@gnu.org>
parents: 16808
diff changeset
965 (with-current-buffer (get-file-buffer from)
99de1dc68184 (dired-rename-file): Pass new arg to set-visited-file-name.
Richard M. Stallman <rms@gnu.org>
parents: 16808
diff changeset
966 (set-visited-file-name to nil t)))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
967 (dired-remove-file from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
968 ;; See if it's an inserted subdir, and rename that, too.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
969 (dired-rename-subdir from to))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 (defun dired-rename-subdir (from-dir to-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 (setq from-dir (file-name-as-directory from-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 to-dir (file-name-as-directory to-dir))
17205
a886f419a946 (dired-fun-in-all-buffers): New arg FILE. Don't operate on buffers
Richard M. Stallman <rms@gnu.org>
parents: 17199
diff changeset
974 (dired-fun-in-all-buffers from-dir nil
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
975 (function dired-rename-subdir-1) from-dir to-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 ;; Update visited file name of all affected buffers
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
977 (let ((expanded-from-dir (expand-file-name from-dir))
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
978 (blist (buffer-list)))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979 (while blist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
980 (save-excursion
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
981 (set-buffer (car blist))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982 (if (and buffer-file-name
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
983 (dired-in-this-tree buffer-file-name expanded-from-dir))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 (let ((modflag (buffer-modified-p))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985 (to-file (dired-replace-in-string
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 (concat "^" (regexp-quote from-dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 to-dir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
988 buffer-file-name)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
989 (set-visited-file-name to-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 (set-buffer-modified-p modflag))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 (setq blist (cdr blist)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993 (defun dired-rename-subdir-1 (dir to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 ;; Rename DIR to TO in headerlines and dired-subdir-alist, if DIR or
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
995 ;; one of its subdirectories is expanded in this buffer.
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
996 (let ((expanded-dir (expand-file-name dir))
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
997 (alist dired-subdir-alist)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998 (elt nil))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
999 (while alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1000 (setq elt (car alist)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 alist (cdr alist))
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
1002 (if (dired-in-this-tree (car elt) expanded-dir)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003 ;; ELT's subdir is affected by the rename
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1004 (dired-rename-subdir-2 elt dir to)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1005 (if (equal dir default-directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1006 ;; if top level directory was renamed, lots of things have to be
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1007 ;; updated:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1008 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1009 (dired-unadvertise dir) ; we no longer dired DIR...
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010 (setq default-directory to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011 dired-directory (expand-file-name;; this is correct
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1012 ;; with and without wildcards
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1013 (file-name-nondirectory dired-directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1014 to))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1015 (let ((new-name (file-name-nondirectory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1016 (directory-file-name dired-directory))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1017 ;; try to rename buffer, but just leave old name if new
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1018 ;; name would already exist (don't try appending "<%d>")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1019 (or (get-buffer new-name)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1020 (rename-buffer new-name)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021 ;; ... we dired TO now:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022 (dired-advertise)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1023
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1024 (defun dired-rename-subdir-2 (elt dir to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1025 ;; Update the headerline and dired-subdir-alist element of directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1026 ;; described by alist-element ELT to reflect the moving of DIR to TO.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 ;; Thus, ELT describes either DIR itself or a subdir of DIR.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1028 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 (let ((regexp (regexp-quote (directory-file-name dir)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1030 (newtext (directory-file-name to))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1031 buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032 (goto-char (dired-get-subdir-min elt))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 ;; Update subdir headerline in buffer
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1034 (if (not (looking-at dired-subdir-regexp))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1035 (error "%s not found where expected - dired-subdir-alist broken?"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1036 dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1037 (goto-char (match-beginning 1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038 (if (re-search-forward regexp (match-end 1) t)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 (replace-match newtext t t)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 (error "Expected to find `%s' in headerline of %s" dir (car elt))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041 ;; Update buffer-local dired-subdir-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1042 (setcar elt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1043 (dired-normalize-subdir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 (dired-replace-in-string regexp newtext (car elt)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1045
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1046 ;; The basic function for half a dozen variations on cp/mv/ln/ln -s.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1047 (defun dired-create-files (file-creator operation fn-list name-constructor
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048 &optional marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 ;; Create a new file for each from a list of existing files. The user
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 ;; is queried, dired buffers are updated, and at the end a success or
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 ;; failure message is displayed
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1053
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1054 ;; FILE-CREATOR must accept three args: oldfile newfile ok-if-already-exists
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1056 ;; It is called for each file and must create newfile, the entry of
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 ;; which will be added. The user will be queried if the file already
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1058 ;; exists. If oldfile is removed by FILE-CREATOR (i.e, it is a
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059 ;; rename), it is FILE-CREATOR's responsibility to update dired
14040
187735b53d52 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 12972
diff changeset
1060 ;; buffers. FILE-CREATOR must abort by signaling a file-error if it
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1061 ;; could not create newfile. The error is caught and logged.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1062
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1063 ;; OPERATION (a capitalized string, e.g. `Copy') describes the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1064 ;; operation performed. It is used for error logging.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1066 ;; FN-LIST is the list of files to copy (full absolute file names).
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1067
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1068 ;; NAME-CONSTRUCTOR returns a newfile for every oldfile, or nil to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1069 ;; skip. If it skips files for other reasons than a direct user
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070 ;; query, it is supposed to tell why (using dired-log).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1072 ;; Optional MARKER-CHAR is a character with which to mark every
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1073 ;; newfile's entry, or t to use the current marker character if the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1074 ;; oldfile was marked.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1075
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1076 (let (failures skipped (success-count 0) (total (length fn-list)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1077 (let (to overwrite-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1078 overwrite-backup-query) ; for dired-handle-overwrite
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1079 (mapcar
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1080 (function
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081 (lambda (from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082 (setq to (funcall name-constructor from))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1083 (if (equal to from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1084 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1085 (setq to nil)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1086 (dired-log "Cannot %s to same file: %s\n"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1087 (downcase operation) from)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1088 (if (not to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1089 (setq skipped (cons (dired-make-relative from) skipped))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1090 (let* ((overwrite (file-exists-p to))
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
1091 (dired-overwrite-confirmed ; for dired-handle-overwrite
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 (and overwrite
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093 (let ((help-form '(format "\
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 Type SPC or `y' to overwrite file `%s',
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1095 DEL or `n' to skip to next,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1096 ESC or `q' to not overwrite any of the remaining files,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1097 `!' to overwrite all remaining files with no more questions." to)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098 (dired-query 'overwrite-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 "Overwrite `%s'?" to))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1100 ;; must determine if FROM is marked before file-creator
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101 ;; gets a chance to delete it (in case of a move).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1102 (actual-marker-char
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1103 (cond ((integerp marker-char) marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104 (marker-char (dired-file-marker from)) ; slow
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1105 (t nil))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1106 (condition-case err
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1107 (progn
910
4fba6d4b6a28 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 890
diff changeset
1108 (funcall file-creator from to dired-overwrite-confirmed)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1109 (if overwrite
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1110 ;; If we get here, file-creator hasn't been aborted
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1111 ;; and the old entry (if any) has to be deleted
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1112 ;; before adding the new entry.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1113 (dired-remove-file to))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1114 (setq success-count (1+ success-count))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1115 (message "%s: %d of %d" operation success-count total)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1116 (dired-add-file to actual-marker-char))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1117 (file-error ; FILE-CREATOR aborted
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1118 (progn
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1119 (setq failures (cons (dired-make-relative from) failures))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1120 (dired-log "%s `%s' to `%s' failed:\n%s\n"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1121 operation from to err))))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1122 fn-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1123 (cond
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1124 (failures
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1125 (dired-log-summary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1126 (format "%s failed for %d of %d file%s"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1127 operation (length failures) total
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1128 (dired-plural-s total))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1129 failures))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1130 (skipped
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1131 (dired-log-summary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132 (format "%s: %d of %d file%s skipped"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1133 operation (length skipped) total
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1134 (dired-plural-s total))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1135 skipped))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1136 (t
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1137 (message "%s: %s file%s"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1138 operation success-count (dired-plural-s success-count)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1139 (dired-move-to-filename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1140
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1141 (defun dired-do-create-files (op-symbol file-creator operation arg
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142 &optional marker-char op1
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 how-to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144 ;; Create a new file for each marked file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1145 ;; Prompts user for target, which is a directory in which to create
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1146 ;; the new files. Target may be a plain file if only one marked
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147 ;; file exists.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 ;; OP-SYMBOL is the symbol for the operation. Function `dired-mark-pop-up'
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3398
diff changeset
1149 ;; will determine whether pop-ups are appropriate for this OP-SYMBOL.
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1150 ;; FILE-CREATOR and OPERATION as in dired-create-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1151 ;; ARG as in dired-get-marked-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1152 ;; Optional arg OP1 is an alternate form for OPERATION if there is
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 ;; only one file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 ;; Optional arg MARKER-CHAR as in dired-create-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1155 ;; Optional arg HOW-TO determines how to treat target:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1156 ;; If HOW-TO is not given (or nil), and target is a directory, the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1157 ;; file(s) are created inside the target directory. If target
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 ;; is not a directory, there must be exactly one marked file,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1159 ;; else error.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1160 ;; If HOW-TO is t, then target is not modified. There must be
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1161 ;; exactly one marked file, else error.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1162 ;; Else HOW-TO is assumed to be a function of one argument, target,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1163 ;; that looks at target and returns a value for the into-dir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1164 ;; variable. The function dired-into-dir-with-symlinks is provided
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1165 ;; for the case (common when creating symlinks) that symbolic
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1166 ;; links to directories are not to be considered as directories
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1167 ;; (as file-directory-p would if HOW-TO had been nil).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1168 (or op1 (setq op1 operation))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169 (let* ((fn-list (dired-get-marked-files nil arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170 (fn-count (length fn-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171 (target (expand-file-name
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172 (dired-mark-read-file-name
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173 (concat (if (= 1 fn-count) op1 operation) " %s to: ")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1174 (dired-dwim-target-directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1175 op-symbol arg (mapcar (function dired-make-relative) fn-list))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1176 (into-dir (cond ((null how-to) (file-directory-p target))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1177 ((eq how-to t) nil)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1178 (t (funcall how-to target)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1179 (if (and (> fn-count 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1180 (not into-dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1181 (error "Marked %s: target must be a directory: %s" operation target))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182 ;; rename-file bombs when moving directories unless we do this:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 (or into-dir (setq target (directory-file-name target)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184 (dired-create-files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1185 file-creator operation fn-list
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1186 (if into-dir ; target is a directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1187 ;; This function uses fluid vars into-dir and target when called
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1188 ;; inside dired-create-files:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1189 (function (lambda (from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1190 (expand-file-name (file-name-nondirectory from) target)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1191 (function (lambda (from) target)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1192 marker-char)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1193
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1194 ;; Read arguments for a marked-files command that wants a file name,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1195 ;; perhaps popping up the list of marked files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 ;; ARG is the prefix arg and indicates whether the files came from
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1197 ;; marks (ARG=nil) or a repeat factor (integerp ARG).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1198 ;; If the current file was used, the list has but one element and ARG
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199 ;; does not matter. (It is non-nil, non-integer in that case, namely '(4)).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1201 (defun dired-mark-read-file-name (prompt dir op-symbol arg files)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1202 (dired-mark-pop-up
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1203 nil op-symbol files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1204 (function read-file-name)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1205 (format prompt (dired-mark-prompt arg files)) dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1207 (defun dired-dwim-target-directory ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1208 ;; Try to guess which target directory the user may want.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1209 ;; If there is a dired buffer displayed in the next window, use
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1210 ;; its current subdir, else use current subdir of this dired buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1211 (let ((this-dir (and (eq major-mode 'dired-mode)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1212 (dired-current-directory))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1213 ;; non-dired buffer may want to profit from this function, e.g. vm-uudecode
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1214 (if dired-dwim-target
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1215 (let* ((other-buf (window-buffer (next-window)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1216 (other-dir (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1217 (set-buffer other-buf)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1218 (and (eq major-mode 'dired-mode)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1219 (dired-current-directory)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1220 (or other-dir this-dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1221 this-dir)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1222
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1223 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1224 (defun dired-create-directory (directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1225 "Create a directory called DIRECTORY."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226 (interactive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1227 (list (read-file-name "Create directory: " (dired-current-directory))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 (let ((expanded (directory-file-name (expand-file-name directory))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1229 (make-directory expanded)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 (dired-add-file expanded)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1231 (dired-move-to-filename)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1232
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1233 (defun dired-into-dir-with-symlinks (target)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 (and (file-directory-p target)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1235 (not (file-symlink-p target))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1236 ;; This may not always be what you want, especially if target is your
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1237 ;; home directory and it happens to be a symbolic link, as is often the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1238 ;; case with NFS and automounters. Or if you want to make symlinks
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1239 ;; into directories that themselves are only symlinks, also quite
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1240 ;; common.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1241
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1242 ;; So we don't use this function as value for HOW-TO in
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1243 ;; dired-do-symlink, which has the minor disadvantage of
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1244 ;; making links *into* a symlinked-dir, when you really wanted to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1245 ;; *overwrite* that symlink. In that (rare, I guess) case, you'll
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1246 ;; just have to remove that symlink by hand before making your marked
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1247 ;; symlinks.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1249 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1250 (defun dired-do-copy (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1251 "Copy all marked (or next ARG) files, or copy the current file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1252 This normally preserves the last-modified date when copying.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1253 When operating on just the current file, you specify the new name.
12757
3af640c2a0fe (dired-do-copy): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12733
diff changeset
1254 When operating on multiple or marked files, you specify a directory,
3af640c2a0fe (dired-do-copy): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12733
diff changeset
1255 and new copies of these files are made in that directory
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1256 with the same names that the files currently have."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1257 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1258 (dired-do-create-files 'copy (function dired-copy-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1259 (if dired-copy-preserve-time "Copy [-p]" "Copy")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1260 arg dired-keep-marker-copy))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1261
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1262 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1263 (defun dired-do-symlink (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1264 "Make symbolic links to current file or all marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1265 When operating on just the current file, you specify the new name.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1266 When operating on multiple or marked files, you specify a directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1267 and new symbolic links are made in that directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1268 with the same names that the files currently have."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1269 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1270 (dired-do-create-files 'symlink (function make-symbolic-link)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1271 "Symlink" arg dired-keep-marker-symlink))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1272
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1273 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1274 (defun dired-do-hardlink (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1275 "Add names (hard links) current file or all marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1276 When operating on just the current file, you specify the new name.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1277 When operating on multiple or marked files, you specify a directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1278 and new hard links are made in that directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1279 with the same names that the files currently have."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1280 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1281 (dired-do-create-files 'hardlink (function add-name-to-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1282 "Hardlink" arg dired-keep-marker-hardlink))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1283
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1284 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1285 (defun dired-do-rename (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1286 "Rename current file or all marked (or next ARG) files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1287 When renaming just the current file, you specify the new name.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1288 When renaming multiple or marked files, you specify a directory."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1289 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1290 (dired-do-create-files 'move (function dired-rename-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1291 "Move" arg dired-keep-marker-rename "Rename"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1292 ;;;###end dired-cp.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1293
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1294 ;;; 5K
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1295 ;;;###begin dired-re.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1296 (defun dired-do-create-files-regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1297 (file-creator operation arg regexp newname &optional whole-path marker-char)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1298 ;; Create a new file for each marked file using regexps.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1299 ;; FILE-CREATOR and OPERATION as in dired-create-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 ;; ARG as in dired-get-marked-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301 ;; Matches each marked file against REGEXP and constructs the new
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1302 ;; filename from NEWNAME (like in function replace-match).
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1303 ;; Optional arg WHOLE-PATH means match/replace the whole file name
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1304 ;; instead of only the non-directory part of the file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1305 ;; Optional arg MARKER-CHAR as in dired-create-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1306 (let* ((fn-list (dired-get-marked-files nil arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1307 (fn-count (length fn-list))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1308 (operation-prompt (concat operation " `%s' to `%s'?"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1309 (rename-regexp-help-form (format "\
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1310 Type SPC or `y' to %s one match, DEL or `n' to skip to next,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1311 `!' to %s all remaining matches with no more questions."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1312 (downcase operation)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1313 (downcase operation)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1314 (regexp-name-constructor
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1315 ;; Function to construct new filename using REGEXP and NEWNAME:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1316 (if whole-path ; easy (but rare) case
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1317 (function
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1318 (lambda (from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1319 (let ((to (dired-string-replace-match regexp from newname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1320 ;; must bind help-form directly around call to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1321 ;; dired-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1322 (help-form rename-regexp-help-form))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1323 (if to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1324 (and (dired-query 'rename-regexp-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1325 operation-prompt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1326 from
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1327 to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1328 to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1329 (dired-log "%s: %s did not match regexp %s\n"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1330 operation from regexp)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 ;; not whole-path, replace non-directory part only
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1332 (function
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1333 (lambda (from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1334 (let* ((new (dired-string-replace-match
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1335 regexp (file-name-nondirectory from) newname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336 (to (and new ; nil means there was no match
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 (expand-file-name new
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1338 (file-name-directory from))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1339 (help-form rename-regexp-help-form))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1340 (if to
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1341 (and (dired-query 'rename-regexp-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1342 operation-prompt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1343 (dired-make-relative from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1344 (dired-make-relative to))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1345 to)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1346 (dired-log "%s: %s did not match regexp %s\n"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1347 operation (file-name-nondirectory from) regexp)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1348 rename-regexp-query)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1349 (dired-create-files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1350 file-creator operation fn-list regexp-name-constructor marker-char)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1351
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1352 (defun dired-mark-read-regexp (operation)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1353 ;; Prompt user about performing OPERATION.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1354 ;; Read and return list of: regexp newname arg whole-path.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1355 (let* ((whole-path
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1356 (equal 0 (prefix-numeric-value current-prefix-arg)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1357 (arg
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1358 (if whole-path nil current-prefix-arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1359 (regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1360 (dired-read-regexp
1756
ffef0718ef6b (dired-mark-read-regexp): Give dired-read-regexp 1 arg.
Richard M. Stallman <rms@gnu.org>
parents: 1672
diff changeset
1361 (concat (if whole-path "Path " "") operation " from (regexp): ")))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1362 (newname
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1363 (read-string
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1364 (concat (if whole-path "Path " "") operation " " regexp " to: "))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1365 (list regexp newname arg whole-path)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1366
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1367 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1368 (defun dired-do-rename-regexp (regexp newname &optional arg whole-path)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1369 "Rename marked files containing REGEXP to NEWNAME.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1370 As each match is found, the user must type a character saying
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1371 what to do with it. For directions, type \\[help-command] at that time.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1372 NEWNAME may contain \\=\\<n> or \\& as in `query-replace-regexp'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 REGEXP defaults to the last regexp used.
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1374
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1375 With a zero prefix arg, renaming by regexp affects the absolute file name.
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1376 Normally, only the non-directory part of the file name is used and changed."
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1377 (interactive (dired-mark-read-regexp "Rename"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1378 (dired-do-create-files-regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1379 (function dired-rename-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1380 "Rename" arg regexp newname whole-path dired-keep-marker-rename))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1381
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1382 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1383 (defun dired-do-copy-regexp (regexp newname &optional arg whole-path)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1384 "Copy all marked files containing REGEXP to NEWNAME.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1385 See function `dired-rename-regexp' for more info."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1386 (interactive (dired-mark-read-regexp "Copy"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1387 (dired-do-create-files-regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1388 (function dired-copy-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1389 (if dired-copy-preserve-time "Copy [-p]" "Copy")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1390 arg regexp newname whole-path dired-keep-marker-copy))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1391
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1392 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1393 (defun dired-do-hardlink-regexp (regexp newname &optional arg whole-path)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1394 "Hardlink all marked files containing REGEXP to NEWNAME.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1395 See function `dired-rename-regexp' for more info."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1396 (interactive (dired-mark-read-regexp "HardLink"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1397 (dired-do-create-files-regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1398 (function add-name-to-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1399 "HardLink" arg regexp newname whole-path dired-keep-marker-hardlink))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1400
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1401 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1402 (defun dired-do-symlink-regexp (regexp newname &optional arg whole-path)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1403 "Symlink all marked files containing REGEXP to NEWNAME.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1404 See function `dired-rename-regexp' for more info."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1405 (interactive (dired-mark-read-regexp "SymLink"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1406 (dired-do-create-files-regexp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1407 (function make-symbolic-link)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1408 "SymLink" arg regexp newname whole-path dired-keep-marker-symlink))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1409
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1410 (defun dired-create-files-non-directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1411 (file-creator basename-constructor operation arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1412 ;; Perform FILE-CREATOR on the non-directory part of marked files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1413 ;; using function BASENAME-CONSTRUCTOR, with query for each file.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1414 ;; OPERATION like in dired-create-files, ARG as in dired-get-marked-files.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1415 (let (rename-non-directory-query)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1416 (dired-create-files
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1417 file-creator
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1418 operation
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1419 (dired-get-marked-files nil arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1420 (function
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1421 (lambda (from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1422 (let ((to (concat (file-name-directory from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1423 (funcall basename-constructor
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1424 (file-name-nondirectory from)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1425 (and (let ((help-form (format "\
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1426 Type SPC or `y' to %s one file, DEL or `n' to skip to next,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1427 `!' to %s all remaining matches with no more questions."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1428 (downcase operation)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1429 (downcase operation))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1430 (dired-query 'rename-non-directory-query
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1431 (concat operation " `%s' to `%s'")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1432 (dired-make-relative from)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1433 (dired-make-relative to)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1434 to))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1435 dired-keep-marker-rename)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1436
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1437 (defun dired-rename-non-directory (basename-constructor operation arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1438 (dired-create-files-non-directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1439 (function dired-rename-file)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1440 basename-constructor operation arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1441
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1442 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1443 (defun dired-upcase (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1444 "Rename all marked (or next ARG) files to upper case."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1445 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1446 (dired-rename-non-directory (function upcase) "Rename upcase" arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1447
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1448 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1449 (defun dired-downcase (&optional arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1450 "Rename all marked (or next ARG) files to lower case."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1451 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1452 (dired-rename-non-directory (function downcase) "Rename downcase" arg))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1453
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1454 ;;;###end dired-re.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1455
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1456 ;;; 13K
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1457 ;;;###begin dired-ins.el
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1458
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1459 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1460 (defun dired-maybe-insert-subdir (dirname &optional
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1461 switches no-error-if-not-dir-p)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1462 "Insert this subdirectory into the same dired buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1463 If it is already present, just move to it (type \\[dired-do-redisplay] to refresh),
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1464 else inserts it at its natural place (as `ls -lR' would have done).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1465 With a prefix arg, you may edit the ls switches used for this listing.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1466 You can add `R' to the switches to expand the whole tree starting at
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1467 this subdirectory.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1468 This function takes some pains to conform to `ls -lR' output."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1469 (interactive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1470 (list (dired-get-filename)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1471 (if current-prefix-arg
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1472 (read-string "Switches for listing: " dired-actual-switches))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1473 (let ((opoint (point)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1474 ;; We don't need a marker for opoint as the subdir is always
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1475 ;; inserted *after* opoint.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1476 (setq dirname (file-name-as-directory dirname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1477 (or (and (not switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1478 (dired-goto-subdir dirname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1479 (dired-insert-subdir dirname switches no-error-if-not-dir-p))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1480 ;; Push mark so that it's easy to find back. Do this after the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1481 ;; insert message so that the user sees the `Mark set' message.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1482 (push-mark opoint)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1483
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1484 (defun dired-insert-subdir (dirname &optional switches no-error-if-not-dir-p)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1485 "Insert this subdirectory into the same dired buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1486 If it is already present, overwrites previous entry,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1487 else inserts it at its natural place (as `ls -lR' would have done).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1488 With a prefix arg, you may edit the `ls' switches used for this listing.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1489 You can add `R' to the switches to expand the whole tree starting at
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1490 this subdirectory.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1491 This function takes some pains to conform to `ls -lR' output."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1492 ;; NO-ERROR-IF-NOT-DIR-P needed for special filesystems like
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1493 ;; Prospero where dired-ls does the right thing, but
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1494 ;; file-directory-p has not been redefined.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1495 (interactive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1496 (list (dired-get-filename)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1497 (if current-prefix-arg
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1498 (read-string "Switches for listing: " dired-actual-switches))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1499 (setq dirname (file-name-as-directory (expand-file-name dirname)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1500 (dired-insert-subdir-validate dirname switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1501 (or no-error-if-not-dir-p
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1502 (file-directory-p dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1503 (error "Attempt to insert a non-directory: %s" dirname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1504 (let ((elt (assoc dirname dired-subdir-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1505 switches-have-R mark-alist case-fold-search buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1506 ;; case-fold-search is nil now, so we can test for capital `R':
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1507 (if (setq switches-have-R (and switches (string-match "R" switches)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1508 ;; avoid duplicated subdirs
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1509 (setq mark-alist (dired-kill-tree dirname t)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1510 (if elt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1511 ;; If subdir is already present, remove it and remember its marks
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1512 (setq mark-alist (nconc (dired-insert-subdir-del elt) mark-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1513 (dired-insert-subdir-newpos dirname)) ; else compute new position
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1514 (dired-insert-subdir-doupdate
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1515 dirname elt (dired-insert-subdir-doinsert dirname switches))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1516 (if switches-have-R (dired-build-subdir-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1517 (dired-initial-position dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1518 (save-excursion (dired-mark-remembered mark-alist))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1519
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1520 ;; This is a separate function for dired-vms.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1521 (defun dired-insert-subdir-validate (dirname &optional switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1522 ;; Check that it is valid to insert DIRNAME with SWITCHES.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1523 ;; Signal an error if invalid (e.g. user typed `i' on `..').
5281
edd5fb2614b1 Autoload dired-.*-file.
Richard M. Stallman <rms@gnu.org>
parents: 5144
diff changeset
1524 (or (dired-in-this-tree dirname (expand-file-name default-directory))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1525 (error "%s: not in this directory tree" dirname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1526 (if switches
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1527 (let (case-fold-search)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1528 (mapcar
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1529 (function
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1530 (lambda (x)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1531 (or (eq (null (string-match x switches))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1532 (null (string-match x dired-actual-switches)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1533 (error "Can't have dirs with and without -%s switches together"
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1534 x))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1535 ;; all switches that make a difference to dired-get-filename:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1536 '("F" "b")))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1537
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1538 (defun dired-alist-add (dir new-marker)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1539 ;; Add new DIR at NEW-MARKER. Sort alist.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1540 (dired-alist-add-1 dir new-marker)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1541 (dired-alist-sort))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1542
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1543 (defun dired-alist-sort ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1544 ;; Keep the alist sorted on buffer position.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1545 (setq dired-subdir-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1546 (sort dired-subdir-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1547 (function (lambda (elt1 elt2)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1548 (> (dired-get-subdir-min elt1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1549 (dired-get-subdir-min elt2)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1550
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1551 (defun dired-kill-tree (dirname &optional remember-marks)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1552 ;;"Kill all proper subdirs of DIRNAME, excluding DIRNAME itself.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1553 ;; With optional arg REMEMBER-MARKS, return an alist of marked files."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1554 (interactive "DKill tree below directory: ")
8793
babecf4f73c6 (dired-fun-in-all-buffers): Expand dir at start.
Richard M. Stallman <rms@gnu.org>
parents: 8236
diff changeset
1555 (setq dirname (expand-file-name dirname))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1556 (let ((s-alist dired-subdir-alist) dir m-alist)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1557 (while s-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1558 (setq dir (car (car s-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1559 s-alist (cdr s-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1560 (if (and (not (string-equal dir dirname))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1561 (dired-in-this-tree dir dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1562 (dired-goto-subdir dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1563 (setq m-alist (nconc (dired-kill-subdir remember-marks) m-alist))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1564 m-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1565
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1566 (defun dired-insert-subdir-newpos (new-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1567 ;; Find pos for new subdir, according to tree order.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1568 ;;(goto-char (point-max))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1569 (let ((alist dired-subdir-alist) elt dir pos new-pos)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1570 (while alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1571 (setq elt (car alist)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1572 alist (cdr alist)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1573 dir (car elt)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1574 pos (dired-get-subdir-min elt))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1575 (if (dired-tree-lessp dir new-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1576 ;; Insert NEW-DIR after DIR
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1577 (setq new-pos (dired-get-subdir-max elt)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1578 alist nil)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1579 (goto-char new-pos))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1580 ;; want a separating newline between subdirs
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1581 (or (eobp)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1582 (forward-line -1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1583 (insert "\n")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1584 (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1585
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1586 (defun dired-insert-subdir-del (element)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1587 ;; Erase an already present subdir (given by ELEMENT) from buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1588 ;; Move to that buffer position. Return a mark-alist.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1589 (let ((begin-marker (dired-get-subdir-min element)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1590 (goto-char begin-marker)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1591 ;; Are at beginning of subdir (and inside it!). Now determine its end:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1592 (goto-char (dired-subdir-max))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1593 (or (eobp);; want a separating newline _between_ subdirs:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1594 (forward-char -1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1595 (prog1
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1596 (dired-remember-marks begin-marker (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1597 (delete-region begin-marker (point)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1598
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1599 (defun dired-insert-subdir-doinsert (dirname switches)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1600 ;; Insert ls output after point and put point on the correct
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1601 ;; position for the subdir alist.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1602 ;; Return the boundary of the inserted text (as list of BEG and END).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1603 (let ((begin (point)) end)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1604 (message "Reading directory %s..." dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1605 (let ((dired-actual-switches
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1606 (or switches
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1607 (dired-replace-in-string "R" "" dired-actual-switches))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1608 (if (equal dirname (car (car (reverse dired-subdir-alist))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1609 ;; top level directory may contain wildcards:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1610 (dired-readin-insert dired-directory)
6633
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
1611 (let ((opoint (point)))
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
1612 (insert-directory dirname dired-actual-switches nil t)
451a2973d86b (dired-add-entry, dired-insert-subdir-doinsert):
Richard M. Stallman <rms@gnu.org>
parents: 6309
diff changeset
1613 (dired-insert-set-properties opoint (point)))))
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1614 (message "Reading directory %s...done" dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1615 (setq end (point-marker))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1616 (indent-rigidly begin end 2)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1617 ;; call dired-insert-headerline afterwards, as under VMS dired-ls
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1618 ;; does insert the headerline itself and the insert function just
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1619 ;; moves point.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1620 ;; Need a marker for END as this inserts text.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1621 (goto-char begin)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1622 (dired-insert-headerline dirname)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1623 ;; point is now like in dired-build-subdir-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1624 (prog1
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1625 (list begin (marker-position end))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1626 (set-marker end nil))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1627
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1628 (defun dired-insert-subdir-doupdate (dirname elt beg-end)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1629 ;; Point is at the correct subdir alist position for ELT,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1630 ;; BEG-END is the subdir-region (as list of begin and end).
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1631 (if elt ; subdir was already present
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1632 ;; update its position (should actually be unchanged)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1633 (set-marker (dired-get-subdir-min elt) (point-marker))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1634 (dired-alist-add dirname (point-marker)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1635 ;; The hook may depend on the subdir-alist containing the just
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1636 ;; inserted subdir, so run it after dired-alist-add:
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1637 (if dired-after-readin-hook
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1638 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1639 (let ((begin (nth 0 beg-end))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1640 (end (nth 1 beg-end)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1641 (goto-char begin)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1642 (save-restriction
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1643 (narrow-to-region begin end)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1644 ;; hook may add or delete lines, but the subdir boundary
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1645 ;; marker floats
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1646 (run-hooks 'dired-after-readin-hook))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1647
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1648 (defun dired-tree-lessp (dir1 dir2)
23012
8cf1a05c1ced (dired-do-rename-regexp): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22573
diff changeset
1649 ;; Lexicographic order on file name components, like `ls -lR':
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1650 ;; DIR1 < DIR2 iff DIR1 comes *before* DIR2 in an `ls -lR' listing,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1651 ;; i.e., iff DIR1 is a (grand)parent dir of DIR2,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1652 ;; or DIR1 and DIR2 are in the same parentdir and their last
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1653 ;; components are string-lessp.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1654 ;; Thus ("/usr/" "/usr/bin") and ("/usr/a/" "/usr/b/") are tree-lessp.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1655 ;; string-lessp could arguably be replaced by file-newer-than-file-p
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1656 ;; if dired-actual-switches contained `t'.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1657 (setq dir1 (file-name-as-directory dir1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1658 dir2 (file-name-as-directory dir2))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1659 (let ((components-1 (dired-split "/" dir1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1660 (components-2 (dired-split "/" dir2)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1661 (while (and components-1
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1662 components-2
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1663 (equal (car components-1) (car components-2)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1664 (setq components-1 (cdr components-1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1665 components-2 (cdr components-2)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1666 (let ((c1 (car components-1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1667 (c2 (car components-2)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1668
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1669 (cond ((and c1 c2)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1670 (string-lessp c1 c2))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1671 ((and (null c1) (null c2))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1672 nil) ; they are equal, not lessp
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1673 ((null c1) ; c2 is a subdir of c1: c1<c2
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1674 t)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1675 ((null c2) ; c1 is a subdir of c2: c1>c2
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1676 nil)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1677 (t (error "This can't happen"))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1678
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1679 ;; There should be a builtin split function - inverse to mapconcat.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1680 (defun dired-split (pat str &optional limit)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1681 "Splitting on regexp PAT, turn string STR into a list of substrings.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1682 Optional third arg LIMIT (>= 1) is a limit to the length of the
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1683 resulting list.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1684 Thus, if SEP is a regexp that only matches itself,
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1685
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1686 (mapconcat 'identity (dired-split SEP STRING) SEP)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1687
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1688 is always equal to STRING."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1689 (let* ((start (string-match pat str))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1690 (result (list (substring str 0 start)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1691 (count 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1692 (end (if start (match-end 0))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1693 (if end ; else nothing left
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1694 (while (and (or (not (integerp limit))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1695 (< count limit))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1696 (string-match pat str end))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1697 (setq start (match-beginning 0)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1698 count (1+ count)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1699 result (cons (substring str end start) result)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1700 end (match-end 0)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1701 start end)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1702 ))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1703 (if (and (or (not (integerp limit))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1704 (< count limit))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1705 end) ; else nothing left
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1706 (setq result
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1707 (cons (substring str end) result)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1708 (nreverse result)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1709
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1710 ;;; moving by subdirectories
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1711
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1712 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1713 (defun dired-prev-subdir (arg &optional no-error-if-not-found no-skip)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1714 "Go to previous subdirectory, regardless of level.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1715 When called interactively and not on a subdir line, go to this subdir's line."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1716 ;;(interactive "p")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1717 (interactive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1718 (list (if current-prefix-arg
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1719 (prefix-numeric-value current-prefix-arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1720 ;; if on subdir start already, don't stay there!
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1721 (if (dired-get-subdir) 1 0))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1722 (dired-next-subdir (- arg) no-error-if-not-found no-skip))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1723
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1724 (defun dired-subdir-min ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1725 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1726 (if (not (dired-prev-subdir 0 t t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1727 (error "Not in a subdir!")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1728 (point))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1729
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1730 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1731 (defun dired-goto-subdir (dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1732 "Go to end of header line of DIR in this dired buffer.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1733 Return value of point on success, otherwise return nil.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1734 The next char is either \\n, or \\r if DIR is hidden."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1735 (interactive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1736 (prog1 ; let push-mark display its message
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1737 (list (expand-file-name
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1738 (completing-read "Goto in situ directory: " ; prompt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1739 dired-subdir-alist ; table
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1740 nil ; predicate
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1741 t ; require-match
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1742 (dired-current-directory))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1743 (push-mark)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1744 (setq dir (file-name-as-directory dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1745 (let ((elt (assoc dir dired-subdir-alist)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1746 (and elt
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1747 (goto-char (dired-get-subdir-min elt))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1748 ;; dired-subdir-hidden-p and dired-add-entry depend on point being
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1749 ;; at either \r or \n after this function succeeds.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1750 (progn (skip-chars-forward "^\r\n")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1751 (point)))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1752
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1753 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1754 (defun dired-mark-subdir-files ()
22094
aad24611f04c (dired-mark-subdir-files): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 21279
diff changeset
1755 "Mark all files except `.' and `..' in current subdirectory.
aad24611f04c (dired-mark-subdir-files): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 21279
diff changeset
1756 If the Dired buffer shows multiple directories, this command
aad24611f04c (dired-mark-subdir-files): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 21279
diff changeset
1757 marks the files listed in the subdirectory that point is in."
7383
d635aebf8036 (dired-mark-subdir-files): Don't pass any arguments interactively.
Karl Heuer <kwzh@gnu.org>
parents: 7300
diff changeset
1758 (interactive)
724
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1759 (let ((p-min (dired-subdir-min)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1760 (dired-mark-files-in-region p-min (dired-subdir-max))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1761
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1762 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1763 (defun dired-kill-subdir (&optional remember-marks)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1764 "Remove all lines of current subdirectory.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1765 Lower levels are unaffected."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1766 ;; With optional REMEMBER-MARKS, return a mark-alist.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1767 (interactive)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1768 (let ((beg (dired-subdir-min))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1769 (end (dired-subdir-max))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1770 buffer-read-only cur-dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1771 (setq cur-dir (dired-current-directory))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1772 (if (equal cur-dir default-directory)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1773 (error "Attempt to kill top level directory"))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1774 (prog1
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1775 (if remember-marks (dired-remember-marks beg end))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1776 (delete-region beg end)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1777 (if (eobp) ; don't leave final blank line
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1778 (delete-char -1))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1779 (dired-unsubdir cur-dir))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1780
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1781 (defun dired-unsubdir (dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1782 ;; Remove DIR from the alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1783 (setq dired-subdir-alist
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1784 (delq (assoc dir dired-subdir-alist) dired-subdir-alist)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1785
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1786 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1787 (defun dired-tree-up (arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1788 "Go up ARG levels in the dired tree."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1789 (interactive "p")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1790 (let ((dir (dired-current-directory)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1791 (while (>= arg 1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1792 (setq arg (1- arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1793 dir (file-name-directory (directory-file-name dir))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1794 ;;(setq dir (expand-file-name dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1795 (or (dired-goto-subdir dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1796 (error "Cannot go up to %s - not in this tree." dir))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1797
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1798 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1799 (defun dired-tree-down ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1800 "Go down in the dired tree."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1801 (interactive)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1802 (let ((dir (dired-current-directory)) ; has slash
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1803 pos case-fold-search) ; filenames are case sensitive
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1804 (let ((rest (reverse dired-subdir-alist)) elt)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1805 (while rest
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1806 (setq elt (car rest)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1807 rest (cdr rest))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1808 (if (dired-in-this-tree (directory-file-name (car elt)) dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1809 (setq rest nil
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1810 pos (dired-goto-subdir (car elt))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1811 (if pos
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1812 (goto-char pos)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1813 (error "At the bottom"))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1814
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1815 ;;; hiding
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1816
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1817 (defun dired-unhide-subdir ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1818 (let (buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1819 (subst-char-in-region (dired-subdir-min) (dired-subdir-max) ?\r ?\n)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1820
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1821 (defun dired-hide-check ()
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1822 (or selective-display
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1823 (error "selective-display must be t for subdir hiding to work!")))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1824
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1825 (defun dired-subdir-hidden-p (dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1826 (and selective-display
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1827 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1828 (dired-goto-subdir dir)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1829 (looking-at "\r"))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1830
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1831 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1832 (defun dired-hide-subdir (arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1833 "Hide or unhide the current subdirectory and move to next directory.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1834 Optional prefix arg is a repeat factor.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1835 Use \\[dired-hide-all] to (un)hide all directories."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1836 (interactive "p")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1837 (dired-hide-check)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1838 (while (>= (setq arg (1- arg)) 0)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1839 (let* ((cur-dir (dired-current-directory))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1840 (hidden-p (dired-subdir-hidden-p cur-dir))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1841 (elt (assoc cur-dir dired-subdir-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1842 (end-pos (1- (dired-get-subdir-max elt)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1843 buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1844 ;; keep header line visible, hide rest
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1845 (goto-char (dired-get-subdir-min elt))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1846 (skip-chars-forward "^\n\r")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1847 (if hidden-p
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1848 (subst-char-in-region (point) end-pos ?\r ?\n)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1849 (subst-char-in-region (point) end-pos ?\n ?\r)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1850 (dired-next-subdir 1 t)))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1851
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1852 ;;;###autoload
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1853 (defun dired-hide-all (arg)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1854 "Hide all subdirectories, leaving only their header lines.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1855 If there is already something hidden, make everything visible again.
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1856 Use \\[dired-hide-subdir] to (un)hide a particular subdirectory."
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1857 (interactive "P")
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1858 (dired-hide-check)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1859 (let (buffer-read-only)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1860 (if (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1861 (goto-char (point-min))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1862 (search-forward "\r" nil t))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1863 ;; unhide - bombs on \r in filenames
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1864 (subst-char-in-region (point-min) (point-max) ?\r ?\n)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1865 ;; hide
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1866 (let ((pos (point-max)) ; pos of end of last directory
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1867 (alist dired-subdir-alist))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1868 (while alist ; while there are dirs before pos
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1869 (subst-char-in-region (dired-get-subdir-min (car alist)) ; pos of prev dir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1870 (save-excursion
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1871 (goto-char pos) ; current dir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1872 ;; we're somewhere on current dir's line
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1873 (forward-line -1)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1874 (point))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1875 ?\n ?\r)
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1876 (setq pos (dired-get-subdir-min (car alist))) ; prev dir gets current dir
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1877 (setq alist (cdr alist)))))))
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1878
fb86b8eef4e5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1879 ;;;###end dired-ins.el
794
2598c08c91c2 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 724
diff changeset
1880
9660
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1881
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1882 ;; Functions for searching in tags style among marked files.
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1883
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1884 ;;;###autoload
11458
43ce6ed860a6 (dired-do-search): Renamed from dired-do-tags-search.
Richard M. Stallman <rms@gnu.org>
parents: 11395
diff changeset
1885 (defun dired-do-search (regexp)
9660
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1886 "Search through all marked files for a match for REGEXP.
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1887 Stops when a match is found.
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1888 To continue searching for next match, use command \\[tags-loop-continue]."
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1889 (interactive "sSearch marked files (regexp): ")
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1890 (tags-search regexp '(dired-get-marked-files)))
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1891
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1892 ;;;###autoload
11458
43ce6ed860a6 (dired-do-search): Renamed from dired-do-tags-search.
Richard M. Stallman <rms@gnu.org>
parents: 11395
diff changeset
1893 (defun dired-do-query-replace (from to &optional delimited)
43ce6ed860a6 (dired-do-search): Renamed from dired-do-tags-search.
Richard M. Stallman <rms@gnu.org>
parents: 11395
diff changeset
1894 "Do `query-replace-regexp' of FROM with TO, on all marked files.
9660
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1895 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
11458
43ce6ed860a6 (dired-do-search): Renamed from dired-do-tags-search.
Richard M. Stallman <rms@gnu.org>
parents: 11395
diff changeset
1896 If you exit (\\[keyboard-quit] or ESC), you can resume the query replace
9660
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1897 with the command \\[tags-loop-continue]."
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1898 (interactive
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1899 "sQuery replace in marked files (regexp): \nsQuery replace %s by: \nP")
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1900 (tags-query-replace from to delimited '(dired-get-marked-files)))
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1901
adcb2e49f6a2 (dired-do-tags-search, dired-do-tags-query-replace): New functions.
Roland McGrath <roland@gnu.org>
parents: 9221
diff changeset
1902
7838
8c3ed9be9bed Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 7383
diff changeset
1903 (provide 'dired-aux)
8c3ed9be9bed Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 7383
diff changeset
1904
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 794
diff changeset
1905 ;;; dired-aux.el ends here