2229
|
1 ;;; dired.el --- directory-browsing commands
|
834
|
2
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
3 ;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995, 1996, 1997, 2000,
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
4 ;; 2001, 2003, 2004 Free Software Foundation, Inc.
|
878
|
5
|
5803
|
6 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
|
|
7 ;; Maintainer: FSF
|
39015
|
8 ;; Keywords: files
|
661
|
9
|
|
10 ;; This file is part of GNU Emacs.
|
|
11
|
|
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
|
|
13 ;; it under the terms of the GNU General Public License as published by
|
834
|
14 ;; the Free Software Foundation; either version 2, or (at your option)
|
661
|
15 ;; any later version.
|
|
16
|
|
17 ;; GNU Emacs is distributed in the hope that it will be useful,
|
|
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20 ;; GNU General Public License for more details.
|
|
21
|
|
22 ;; You should have received a copy of the GNU General Public License
|
14169
|
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
25 ;; Boston, MA 02111-1307, USA.
|
661
|
26
|
834
|
27 ;;; Commentary:
|
|
28
|
2307
|
29 ;; This is a major mode for directory browsing and editing. It is
|
|
30 ;; documented in the Emacs manual.
|
|
31
|
723
|
32 ;; Rewritten in 1990/1991 to add tree features, file marking and
|
|
33 ;; sorting by Sebastian Kremer <sk@thp.uni-koeln.de>.
|
|
34 ;; Finished up by rms in 1992.
|
|
35
|
834
|
36 ;;; Code:
|
723
|
37
|
|
38 ;;; Customizable variables
|
|
39
|
17944
|
40 (defgroup dired nil
|
|
41 "Directory editing."
|
54533
|
42 :link '(custom-manual "(emacs)Dired")
|
47181
|
43 :group 'files)
|
17944
|
44
|
|
45 (defgroup dired-mark nil
|
40950
|
46 "Handling marks in Dired."
|
17944
|
47 :prefix "dired-"
|
|
48 :group 'dired)
|
|
49
|
|
50
|
723
|
51 ;;;###autoload
|
17944
|
52 (defcustom dired-listing-switches "-al"
|
723
|
53 "*Switches passed to `ls' for dired. MUST contain the `l' option.
|
|
54 May contain all other options that don't contradict `-l';
|
5803
|
55 may contain even `F', `b', `i' and `s'. See also the variable
|
41307
|
56 `dired-ls-F-marks-symlinks' concerning the `F' switch.
|
|
57 On systems such as MS-DOS and MS-Windows, which use `ls' emulation in Lisp,
|
|
58 some of the `ls' switches are not supported; see the doc string of
|
|
59 `insert-directory' on ls-lisp.el for more details."
|
17944
|
60 :type 'string
|
|
61 :group 'dired)
|
723
|
62
|
55937
|
63 (defvar dired-subdir-switches nil
|
|
64 "If non-nil, switches passed to `ls' for inserting subdirectories.
|
|
65 If nil, `dired-listing-switches' is used.")
|
|
66
|
49243
|
67 ; Don't use absolute file names as /bin should be in any PATH and people
|
723
|
68 ; may prefer /usr/local/gnu/bin or whatever. However, chown is
|
|
69 ; usually not in PATH.
|
|
70
|
|
71 ;;;###autoload
|
|
72 (defvar dired-chown-program
|
49549
|
73 (if (memq system-type '(hpux dgux usg-unix-v irix linux gnu/linux cygwin))
|
15348
|
74 "chown"
|
|
75 (if (file-exists-p "/usr/sbin/chown")
|
|
76 "/usr/sbin/chown"
|
|
77 "/etc/chown"))
|
3591
|
78 "Name of chown command (usually `chown' or `/etc/chown').")
|
723
|
79
|
47488
|
80 (defvar dired-use-ls-dired (not (not (string-match "gnu" system-configuration)))
|
|
81 "Non-nil means Dired should use `ls --dired'.")
|
|
82
|
21743
|
83 (defvar dired-chmod-program "chmod"
|
|
84 "Name of chmod command (usually `chmod').")
|
11396
|
85
|
54663
|
86 (defvar dired-touch-program "touch"
|
|
87 "Name of touch command (usually `touch').")
|
|
88
|
723
|
89 ;;;###autoload
|
17944
|
90 (defcustom dired-ls-F-marks-symlinks nil
|
723
|
91 "*Informs dired about how `ls -lF' marks symbolic links.
|
14146
|
92 Set this to t if `ls' (or whatever program is specified by
|
|
93 `insert-directory-program') with `-lF' marks the symbolic link
|
723
|
94 itself with a trailing @ (usually the case under Ultrix).
|
|
95
|
|
96 Example: if `ln -s foo bar; ls -F bar' gives `bar -> foo', set it to
|
|
97 nil (the default), if it gives `bar@ -> foo', set it to t.
|
|
98
|
|
99 Dired checks if there is really a @ appended. Thus, if you have a
|
|
100 marking `ls' program on one host and a non-marking on another host, and
|
|
101 don't care about symbolic links which really end in a @, you can
|
17944
|
102 always set this variable to t."
|
|
103 :type 'boolean
|
|
104 :group 'dired-mark)
|
723
|
105
|
|
106 ;;;###autoload
|
17944
|
107 (defcustom dired-trivial-filenames "^\\.\\.?$\\|^#"
|
723
|
108 "*Regexp of files to skip when finding first file of a directory.
|
|
109 A value of nil means move to the subdir line.
|
17944
|
110 A value of t means move to first file."
|
|
111 :type '(choice (const :tag "Move to subdir" nil)
|
|
112 (const :tag "Move to first" t)
|
|
113 regexp)
|
|
114 :group 'dired)
|
723
|
115
|
|
116 ;;;###autoload
|
17944
|
117 (defcustom dired-keep-marker-rename t
|
723
|
118 ;; Use t as default so that moved files "take their markers with them".
|
|
119 "*Controls marking of renamed files.
|
|
120 If t, files keep their previous marks when they are renamed.
|
|
121 If a character, renamed files (whether previously marked or not)
|
17944
|
122 are afterward marked with that character."
|
|
123 :type '(choice (const :tag "Keep" t)
|
|
124 (character :tag "Mark"))
|
|
125 :group 'dired-mark)
|
723
|
126
|
|
127 ;;;###autoload
|
17944
|
128 (defcustom dired-keep-marker-copy ?C
|
723
|
129 "*Controls marking of copied files.
|
|
130 If t, copied files are marked if and as the corresponding original files were.
|
17944
|
131 If a character, copied files are unconditionally marked with that character."
|
|
132 :type '(choice (const :tag "Keep" t)
|
|
133 (character :tag "Mark"))
|
|
134 :group 'dired-mark)
|
723
|
135
|
|
136 ;;;###autoload
|
17944
|
137 (defcustom dired-keep-marker-hardlink ?H
|
723
|
138 "*Controls marking of newly made hard links.
|
|
139 If t, they are marked if and as the files linked to were marked.
|
17944
|
140 If a character, new links are unconditionally marked with that character."
|
|
141 :type '(choice (const :tag "Keep" t)
|
|
142 (character :tag "Mark"))
|
|
143 :group 'dired-mark)
|
723
|
144
|
|
145 ;;;###autoload
|
17944
|
146 (defcustom dired-keep-marker-symlink ?Y
|
723
|
147 "*Controls marking of newly made symbolic links.
|
|
148 If t, they are marked if and as the files linked to were marked.
|
17944
|
149 If a character, new links are unconditionally marked with that character."
|
|
150 :type '(choice (const :tag "Keep" t)
|
|
151 (character :tag "Mark"))
|
|
152 :group 'dired-mark)
|
723
|
153
|
|
154 ;;;###autoload
|
17944
|
155 (defcustom dired-dwim-target nil
|
723
|
156 "*If non-nil, dired tries to guess a default target directory.
|
|
157 This means: if there is a dired buffer displayed in the next window,
|
|
158 use its current subdir, instead of the current subdir of this dired buffer.
|
|
159
|
17944
|
160 The target is used in the prompt for file copy, rename etc."
|
|
161 :type 'boolean
|
|
162 :group 'dired)
|
661
|
163
|
|
164 ;;;###autoload
|
17944
|
165 (defcustom dired-copy-preserve-time t
|
723
|
166 "*If non-nil, Dired preserves the last-modified time in a file copy.
|
17944
|
167 \(This works on only some systems.)"
|
|
168 :type 'boolean
|
|
169 :group 'dired)
|
723
|
170
|
42245
|
171 ; These variables were deleted and the replacements are on files.el.
|
|
172 ; We leave aliases behind for back-compatibility.
|
|
173 (defvaralias 'dired-free-space-program 'directory-free-space-program)
|
|
174 (defvaralias 'dired-free-space-args 'directory-free-space-args)
|
|
175
|
723
|
176 ;;; Hook variables
|
|
177
|
43107
|
178 (defcustom dired-load-hook nil
|
723
|
179 "Run after loading dired.
|
43107
|
180 You can customize key bindings or load extensions with this."
|
|
181 :group 'dired
|
|
182 :type 'hook)
|
723
|
183
|
43107
|
184 (defcustom dired-mode-hook nil
|
|
185 "Run at the very end of dired-mode."
|
|
186 :group 'dired
|
|
187 :type 'hook)
|
723
|
188
|
43107
|
189 (defcustom dired-before-readin-hook nil
|
|
190 "This hook is run before a dired buffer is read in (created or reverted)."
|
|
191 :group 'dired
|
|
192 :type 'hook)
|
723
|
193
|
43107
|
194 (defcustom dired-after-readin-hook nil
|
723
|
195 "Hook run after each time a file or directory is read by Dired.
|
|
196 After each listing of a file or directory, this hook is run
|
43107
|
197 with the buffer narrowed to the listing."
|
|
198 :group 'dired
|
|
199 :type 'hook)
|
723
|
200 ;; Note this can't simply be run inside function `dired-ls' as the hook
|
|
201 ;; functions probably depend on the dired-subdir-alist to be OK.
|
|
202
|
47507
|
203 ;; Internal variables
|
723
|
204
|
|
205 (defvar dired-marker-char ?* ; the answer is 42
|
|
206 ;; so that you can write things like
|
|
207 ;; (let ((dired-marker-char ?X))
|
|
208 ;; ;; great code using X markers ...
|
|
209 ;; )
|
|
210 ;; For example, commands operating on two sets of files, A and B.
|
|
211 ;; Or marking files with digits 0-9. This could implicate
|
|
212 ;; concentric sets or an order for the marked files.
|
|
213 ;; The code depends on dynamic scoping on the marker char.
|
|
214 "In Dired, the current mark character.
|
|
215 This is what the `do' commands look for and what the `mark' commands store.")
|
|
216
|
|
217 (defvar dired-del-marker ?D
|
|
218 "Character used to flag files for deletion.")
|
|
219
|
|
220 (defvar dired-shrink-to-fit
|
878
|
221 t
|
|
222 ;; I see no reason ever to make this nil -- rms.
|
|
223 ;; (> baud-rate search-slow-speed)
|
723
|
224 "Non-nil means Dired shrinks the display buffer to fit the marked files.")
|
|
225
|
|
226 (defvar dired-flagging-regexp nil);; Last regexp used to flag files.
|
|
227
|
878
|
228 (defvar dired-file-version-alist)
|
|
229
|
49772
|
230 ;;;###autoload
|
723
|
231 (defvar dired-directory nil
|
47488
|
232 "The directory name or wildcard spec that this Dired directory lists.
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
233 Local to each dired buffer. May be a list, in which case the car is the
|
47488
|
234 directory name and the cdr is the list of files to mention.
|
|
235 The directory name must be absolute, but need not be fully expanded.")
|
723
|
236
|
|
237 (defvar dired-actual-switches nil
|
|
238 "The value of `dired-listing-switches' used to make this buffer's text.")
|
|
239
|
|
240 (defvar dired-re-inode-size "[0-9 \t]*"
|
|
241 "Regexp for optional initial inode and file size as made by `ls -i -s'.")
|
|
242
|
|
243 ;; These regexps must be tested at beginning-of-line, but are also
|
|
244 ;; used to search for next matches, so neither omitting "^" nor
|
|
245 ;; replacing "^" by "\n" (to make it slightly faster) will work.
|
|
246
|
|
247 (defvar dired-re-mark "^[^ \n]")
|
|
248 ;; "Regexp matching a marked line.
|
|
249 ;; Important: the match ends just after the marker."
|
|
250 (defvar dired-re-maybe-mark "^. ")
|
25558
|
251 ;; The [^:] part after "d" and "l" is to avoid confusion with the
|
|
252 ;; DOS/Windows-style drive letters in directory names, like in "d:/foo".
|
|
253 (defvar dired-re-dir (concat dired-re-maybe-mark dired-re-inode-size "d[^:]"))
|
|
254 (defvar dired-re-sym (concat dired-re-maybe-mark dired-re-inode-size "l[^:]"))
|
723
|
255 (defvar dired-re-exe;; match ls permission string of an executable file
|
|
256 (mapconcat (function
|
|
257 (lambda (x)
|
|
258 (concat dired-re-maybe-mark dired-re-inode-size x)))
|
|
259 '("-[-r][-w][xs][-r][-w].[-r][-w]."
|
|
260 "-[-r][-w].[-r][-w][xs][-r][-w]."
|
|
261 "-[-r][-w].[-r][-w].[-r][-w][xst]")
|
|
262 "\\|"))
|
9098
|
263 (defvar dired-re-perms "[-bcdlps][-r][-w].[-r][-w].[-r][-w].")
|
51539
|
264 (defvar dired-re-dot "^.* \\.\\.?/?$")
|
723
|
265
|
55937
|
266 ;; The subdirectory names in the next two lists are expanded.
|
723
|
267 (defvar dired-subdir-alist nil
|
|
268 "Association list of subdirectories and their buffer positions.
|
|
269 Each subdirectory has an element: (DIRNAME . STARTMARKER).
|
1170
|
270 The order of elements is the reverse of the order in the buffer.
|
|
271 In simple cases, this list contains one element.")
|
723
|
272
|
55937
|
273 (defvar dired-switches-alist nil
|
|
274 "Keeps track of which switches to use for inserted subdirectories.
|
|
275 This is an alist of the form (SUBDIR . SWITCHES).")
|
|
276 (make-variable-buffer-local 'dired-switches-alist)
|
|
277
|
6864
|
278 (defvar dired-subdir-regexp "^. \\([^\n\r]+\\)\\(:\\)[\n\r]"
|
723
|
279 "Regexp matching a maybe hidden subdirectory line in `ls -lR' output.
|
|
280 Subexpression 1 is the subdirectory proper, no trailing colon.
|
|
281 The match starts at the beginning of the line and ends after the end
|
|
282 of the line (\\n or \\r).
|
|
283 Subexpression 2 must end right before the \\n or \\r.")
|
|
284
|
54780
|
285 (defgroup dired-faces nil
|
|
286 "Faces used by dired."
|
|
287 :group 'dired
|
|
288 :group 'faces)
|
|
289
|
|
290 (defface dired-header
|
|
291 '((t (:inherit font-lock-type-face)))
|
|
292 "Face used for directory headers."
|
|
293 :group 'dired-faces
|
59996
|
294 :version "22.1")
|
54780
|
295 (defvar dired-header-face 'dired-header
|
|
296 "Face name used for directory headers.")
|
|
297
|
|
298 (defface dired-mark
|
|
299 '((t (:inherit font-lock-constant-face)))
|
|
300 "Face used for dired marks."
|
|
301 :group 'dired-faces
|
59996
|
302 :version "22.1")
|
54780
|
303 (defvar dired-mark-face 'dired-mark
|
|
304 "Face name used for dired marks.")
|
|
305
|
|
306 (defface dired-marked
|
|
307 '((t (:inherit font-lock-warning-face)))
|
|
308 "Face used for marked files."
|
|
309 :group 'dired-faces
|
59996
|
310 :version "22.1")
|
54780
|
311 (defvar dired-marked-face 'dired-marked
|
|
312 "Face name used for marked files.")
|
|
313
|
|
314 (defface dired-flagged
|
|
315 '((t (:inherit font-lock-warning-face)))
|
|
316 "Face used for flagged files."
|
|
317 :group 'dired-faces
|
59996
|
318 :version "22.1")
|
54780
|
319 (defvar dired-flagged-face 'dired-flagged
|
|
320 "Face name used for flagged files.")
|
|
321
|
|
322 (defface dired-warning
|
|
323 '((t (:inherit font-lock-comment-face)))
|
|
324 "Face used to highlight a part of a buffer that needs user attention."
|
|
325 :group 'dired-faces
|
59996
|
326 :version "22.1")
|
54780
|
327 (defvar dired-warning-face 'dired-warning
|
|
328 "Face name used for a part of a buffer that needs user attention.")
|
|
329
|
|
330 (defface dired-directory
|
|
331 '((t (:inherit font-lock-function-name-face)))
|
|
332 "Face used for subdirectories."
|
|
333 :group 'dired-faces
|
59996
|
334 :version "22.1")
|
54780
|
335 (defvar dired-directory-face 'dired-directory
|
|
336 "Face name used for subdirectories.")
|
|
337
|
|
338 (defface dired-symlink
|
|
339 '((t (:inherit font-lock-keyword-face)))
|
|
340 "Face used for symbolic links."
|
|
341 :group 'dired-faces
|
59996
|
342 :version "22.1")
|
54780
|
343 (defvar dired-symlink-face 'dired-symlink
|
|
344 "Face name used for symbolic links.")
|
|
345
|
|
346 (defface dired-ignored
|
|
347 '((t (:inherit font-lock-string-face)))
|
|
348 "Face used for files suffixed with `completion-ignored-extensions'."
|
|
349 :group 'dired-faces
|
59996
|
350 :version "22.1")
|
54780
|
351 (defvar dired-ignored-face 'dired-ignored
|
|
352 "Face name used for files suffixed with `completion-ignored-extensions'.")
|
|
353
|
16454
|
354 (defvar dired-font-lock-keywords
|
|
355 (list
|
|
356 ;;
|
|
357 ;; Directory headers.
|
54780
|
358 (list dired-subdir-regexp '(1 dired-header-face))
|
|
359 ;;
|
|
360 ;; Dired marks.
|
|
361 (list dired-re-mark '(0 dired-mark-face))
|
16454
|
362 ;;
|
|
363 ;; We make heavy use of MATCH-ANCHORED, since the regexps don't identify the
|
|
364 ;; file name itself. We search for Dired defined regexps, and then use the
|
|
365 ;; Dired defined function `dired-move-to-filename' before searching for the
|
|
366 ;; simple regexp ".+". It is that regexp which matches the file name.
|
|
367 ;;
|
54780
|
368 ;; Marked files.
|
|
369 (list (concat "^[" (char-to-string dired-marker-char) "]")
|
|
370 '(".+" (dired-move-to-filename) nil (0 dired-marked-face)))
|
|
371 ;;
|
|
372 ;; Flagged files.
|
|
373 (list (concat "^[" (char-to-string dired-del-marker) "]")
|
|
374 '(".+" (dired-move-to-filename) nil (0 dired-flagged-face)))
|
19320
|
375 ;; People who are paranoid about security would consider this more
|
|
376 ;; important than other things such as whether it is a directory.
|
|
377 ;; But we don't want to encourage paranoia, so our default
|
|
378 ;; should be what's most useful for non-paranoids. -- rms.
|
|
379 ;;; ;;
|
|
380 ;;; ;; Files that are group or world writable.
|
|
381 ;;; (list (concat dired-re-maybe-mark dired-re-inode-size
|
|
382 ;;; "\\([-d]\\(....w....\\|.......w.\\)\\)")
|
54780
|
383 ;;; '(1 dired-warning-face)
|
|
384 ;;; '(".+" (dired-move-to-filename) nil (0 dired-warning-face)))
|
54533
|
385 ;; However, we don't need to highlight the file name, only the
|
|
386 ;; permissions, to win generally. -- fx.
|
|
387 ;; Fixme: we could also put text properties on the permission
|
|
388 ;; fields with keymaps to frob the permissions, somewhat a la XEmacs.
|
|
389 (list (concat dired-re-maybe-mark dired-re-inode-size
|
54685
|
390 "[-d]....\\(w\\)....") ; group writable
|
54780
|
391 '(1 dired-warning-face))
|
54533
|
392 (list (concat dired-re-maybe-mark dired-re-inode-size
|
54685
|
393 "[-d].......\\(w\\).") ; world writable
|
54780
|
394 '(1 dired-warning-face))
|
16454
|
395 ;;
|
|
396 ;; Subdirectories.
|
|
397 (list dired-re-dir
|
54780
|
398 '(".+" (dired-move-to-filename) nil (0 dired-directory-face)))
|
16454
|
399 ;;
|
|
400 ;; Symbolic links.
|
49549
|
401 (list dired-re-sym
|
54780
|
402 '(".+" (dired-move-to-filename) nil (0 dired-symlink-face)))
|
16454
|
403 ;;
|
|
404 ;; Files suffixed with `completion-ignored-extensions'.
|
|
405 '(eval .
|
47507
|
406 ;; It is quicker to first find just an extension, then go back to the
|
|
407 ;; start of that file name. So we do this complex MATCH-ANCHORED form.
|
|
408 (list (concat "\\(" (regexp-opt completion-ignored-extensions) "\\|#\\)$")
|
54780
|
409 '(".+" (dired-move-to-filename) nil (0 dired-ignored-face)))))
|
16454
|
410 "Additional expressions to highlight in Dired mode.")
|
35607
|
411
|
723
|
412 ;;; Macros must be defined before they are used, for the byte compiler.
|
|
413
|
|
414 (defmacro dired-mark-if (predicate msg)
|
54533
|
415 "Mark all files for which PREDICATE evals to non-nil.
|
|
416 PREDICATE is evaluated on each line, with point at beginning of line.
|
|
417 MSG is a noun phrase for the type of files being marked.
|
|
418 It should end with a noun that can be pluralized by adding `s'.
|
|
419 Return value is the number of files marked, or nil if none were marked."
|
41608
|
420 `(let (buffer-read-only count)
|
|
421 (save-excursion
|
|
422 (setq count 0)
|
|
423 (if ,msg (message "Marking %ss..." ,msg))
|
|
424 (goto-char (point-min))
|
|
425 (while (not (eobp))
|
|
426 (if ,predicate
|
|
427 (progn
|
|
428 (delete-char 1)
|
|
429 (insert dired-marker-char)
|
|
430 (setq count (1+ count))))
|
|
431 (forward-line 1))
|
|
432 (if ,msg (message "%s %s%s %s%s."
|
|
433 count
|
|
434 ,msg
|
|
435 (dired-plural-s count)
|
|
436 (if (eq dired-marker-char ?\040) "un" "")
|
|
437 (if (eq dired-marker-char dired-del-marker)
|
|
438 "flagged" "marked"))))
|
|
439 (and (> count 0) count)))
|
661
|
440
|
723
|
441 (defmacro dired-map-over-marks (body arg &optional show-progress)
|
32027
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
442 "Eval BODY with point on each marked line. Return a list of BODY's results.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
443 If no marked file could be found, execute BODY on the current line.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
444 If ARG is an integer, use the next ARG (or previous -ARG, if ARG<0)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
445 files instead of the marked files.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
446 In that case point is dragged along. This is so that commands on
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
447 the next ARG (instead of the marked) files can be chained easily.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
448 If ARG is otherwise non-nil, use current file instead.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
449 If optional third arg SHOW-PROGRESS evaluates to non-nil,
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
450 redisplay the dired buffer after each file is processed.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
451 No guarantee is made about the position on the marked line.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
452 BODY must ensure this itself if it depends on this.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
453 Search starts at the beginning of the buffer, thus the car of the list
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
454 corresponds to the line nearest to the buffer's bottom. This
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
455 is also true for (positive and negative) integer values of ARG.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
456 BODY should not be too long as it is expanded four times."
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
457 ;;
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
458 ;;Warning: BODY must not add new lines before point - this may cause an
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
459 ;;endless loop.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
460 ;;This warning should not apply any longer, sk 2-Sep-1991 14:10.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
461 `(prog1
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
462 (let (buffer-read-only case-fold-search found results)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
463 (if ,arg
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
464 (if (integerp ,arg)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
465 (progn ;; no save-excursion, want to move point.
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
466 (dired-repeat-over-lines
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
467 ,arg
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
468 (function (lambda ()
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
469 (if ,show-progress (sit-for 0))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
470 (setq results (cons ,body results)))))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
471 (if (< ,arg 0)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
472 (nreverse results)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
473 results))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
474 ;; non-nil, non-integer ARG means use current file:
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
475 (list ,body))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
476 (let ((regexp (dired-marker-regexp)) next-position)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
477 (save-excursion
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
478 (goto-char (point-min))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
479 ;; remember position of next marked file before BODY
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
480 ;; can insert lines before the just found file,
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
481 ;; confusing us by finding the same marked file again
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
482 ;; and again and...
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
483 (setq next-position (and (re-search-forward regexp nil t)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
484 (point-marker))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
485 found (not (null next-position)))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
486 (while next-position
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
487 (goto-char next-position)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
488 (if ,show-progress (sit-for 0))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
489 (setq results (cons ,body results))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
490 ;; move after last match
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
491 (goto-char next-position)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
492 (forward-line 1)
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
493 (set-marker next-position nil)
|
723
|
494 (setq next-position (and (re-search-forward regexp nil t)
|
32027
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
495 (point-marker)))))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
496 (if found
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
497 results
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
498 (list ,body)))))
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
499 ;; save-excursion loses, again
|
638a006b3c47
(dired-map-over-marks): Use modern backquotes and docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
500 (dired-move-to-filename)))
|
723
|
501
|
44234
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
502 (defun dired-get-marked-files (&optional localp arg filter)
|
723
|
503 "Return the marked files' names as list of strings.
|
|
504 The list is in the same order as the buffer, that is, the car is the
|
|
505 first marked file.
|
44234
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
506 Values returned are normally absolute file names.
|
723
|
507 Optional arg LOCALP as in `dired-get-filename'.
|
44234
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
508 Optional second argument ARG specifies files near point
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
509 instead of marked files. If ARG is an integer, use the next ARG files.
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
510 If ARG is otherwise non-nil, use file. Usually ARG comes from
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
511 the command's prefix arg.
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
512 Optional third argument FILTER, if non-nil, is a function to select
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
513 some of the files--those for which (funcall FILTER FILENAME) is non-nil."
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
514 (let ((all-of-them
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
515 (save-excursion
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
516 (dired-map-over-marks (dired-get-filename localp) arg)))
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
517 result)
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
518 (if (not filter)
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
519 (nreverse all-of-them)
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
520 (dolist (file all-of-them)
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
521 (if (funcall filter file)
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
522 (push file result)))
|
acb1f97fda8f
(dired-get-marked-files): New arg FILTER allows selection of some files.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
523 result)))
|
35607
|
524
|
723
|
525 ;; The dired command
|
|
526
|
|
527 (defun dired-read-dir-and-switches (str)
|
|
528 ;; For use in interactive.
|
|
529 (reverse (list
|
|
530 (if current-prefix-arg
|
|
531 (read-string "Dired listing switches: "
|
|
532 dired-listing-switches))
|
57943
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
533 ;; If a dialog is about to be used, call read-directory-name so
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
534 ;; the dialog code knows we want directories. Some dialogs can
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
535 ;; only select directories or files when popped up, not both.
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
536 (if (next-read-file-uses-dialog-p)
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
537 (read-directory-name (format "Dired %s(directory): " str)
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
538 nil default-directory nil)
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
539 (read-file-name (format "Dired %s(directory): " str)
|
e4c39a455af0
* dired.el (dired-read-dir-and-switches): Call read-directory-name
Jan Djärv <jan.h.d@swipnet.se>
diff
changeset
|
540 nil default-directory nil)))))
|
661
|
541
|
723
|
542 ;;;###autoload (define-key ctl-x-map "d" 'dired)
|
|
543 ;;;###autoload
|
|
544 (defun dired (dirname &optional switches)
|
|
545 "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.
|
|
546 Optional second argument SWITCHES specifies the `ls' options used.
|
|
547 \(Interactively, use a prefix argument to be able to specify SWITCHES.)
|
|
548 Dired displays a list of files in DIRNAME (which may also have
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
549 shell wildcards appended to select certain files). If DIRNAME is a cons,
|
13888
|
550 its first element is taken as the directory name and the rest as an explicit
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
551 list of files to make directory entries for.
|
834
|
552 \\<dired-mode-map>\
|
723
|
553 You can move around in it with the usual commands.
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
554 You can flag files for deletion with \\[dired-flag-file-deletion] and then
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
555 delete them by typing \\[dired-do-flagged-delete].
|
723
|
556 Type \\[describe-mode] after entering dired for more info.
|
|
557
|
|
558 If DIRNAME is already in a dired buffer, that buffer is used without refresh."
|
|
559 ;; Cannot use (interactive "D") because of wildcards.
|
|
560 (interactive (dired-read-dir-and-switches ""))
|
|
561 (switch-to-buffer (dired-noselect dirname switches)))
|
|
562
|
|
563 ;;;###autoload (define-key ctl-x-4-map "d" 'dired-other-window)
|
|
564 ;;;###autoload
|
|
565 (defun dired-other-window (dirname &optional switches)
|
|
566 "\"Edit\" directory DIRNAME. Like `dired' but selects in another window."
|
|
567 (interactive (dired-read-dir-and-switches "in other window "))
|
|
568 (switch-to-buffer-other-window (dired-noselect dirname switches)))
|
|
569
|
3148
|
570 ;;;###autoload (define-key ctl-x-5-map "d" 'dired-other-frame)
|
|
571 ;;;###autoload
|
|
572 (defun dired-other-frame (dirname &optional switches)
|
|
573 "\"Edit\" directory DIRNAME. Like `dired' but makes a new frame."
|
|
574 (interactive (dired-read-dir-and-switches "in other frame "))
|
|
575 (switch-to-buffer-other-frame (dired-noselect dirname switches)))
|
|
576
|
723
|
577 ;;;###autoload
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
578 (defun dired-noselect (dir-or-list &optional switches)
|
723
|
579 "Like `dired' but returns the dired buffer as value, does not select it."
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
580 (or dir-or-list (setq dir-or-list default-directory))
|
723
|
581 ;; This loses the distinction between "/foo/*/" and "/foo/*" that
|
|
582 ;; some shells make:
|
17431
|
583 (let (dirname initially-was-dirname)
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
584 (if (consp dir-or-list)
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
585 (setq dirname (car dir-or-list))
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
586 (setq dirname dir-or-list))
|
17431
|
587 (setq initially-was-dirname
|
|
588 (string= (file-name-as-directory dirname) dirname))
|
8403
|
589 (setq dirname (abbreviate-file-name
|
|
590 (expand-file-name (directory-file-name dirname))))
|
14947
|
591 (if find-file-visit-truename
|
|
592 (setq dirname (file-truename dirname)))
|
17431
|
593 ;; If the argument was syntactically a directory name not a file name,
|
|
594 ;; or if it happens to name a file that is a directory,
|
|
595 ;; convert it syntactically to a directory name.
|
|
596 ;; The reason for checking initially-was-dirname
|
|
597 ;; and not just file-directory-p
|
|
598 ;; is that file-directory-p is slow over ftp.
|
|
599 (if (or initially-was-dirname (file-directory-p dirname))
|
|
600 (setq dirname (file-name-as-directory dirname)))
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
601 (if (consp dir-or-list)
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
602 (setq dir-or-list (cons dirname (cdr dir-or-list)))
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
603 (setq dir-or-list dirname))
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
604 (dired-internal-noselect dir-or-list switches)))
|
723
|
605
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
606 ;; The following is an internal dired function. It returns non-nil if
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
607 ;; the directory visited by the current dired buffer has changed on
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
608 ;; disk. DIRNAME should be the directory name of that directory.
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
609 (defun dired-directory-changed-p (dirname)
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
610 (not (let ((attributes (file-attributes dirname))
|
54542
|
611 (modtime (visited-file-modtime)))
|
|
612 (or (eq modtime 0)
|
|
613 (not (eq (car attributes) t))
|
56423
fb8b1f758f89
(dired-directory-changed-p): `visited-file-modtime' now returns a
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
614 (equal (nth 5 attributes) modtime)))))
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
615
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
616 (defun dired-buffer-stale-p (&optional noconfirm)
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
617 "Return non-nil if current dired buffer needs updating.
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
618 If NOCONFIRM is non-nil, then this function always returns nil
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
619 for a remote directory. This feature is used by Auto Revert Mode."
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
620 (let ((dirname
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
621 (if (consp dired-directory) (car dired-directory) dired-directory)))
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
622 (and (stringp dirname)
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
623 (not (when noconfirm (file-remote-p dirname)))
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
624 (file-readable-p dirname)
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
625 (dired-directory-changed-p dirname))))
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
626
|
723
|
627 ;; Separate function from dired-noselect for the sake of dired-vms.el.
|
12996
|
628 (defun dired-internal-noselect (dir-or-list &optional switches mode)
|
723
|
629 ;; If there is an existing dired buffer for DIRNAME, just leave
|
|
630 ;; buffer as it is (don't even call dired-revert).
|
|
631 ;; This saves time especially for deep trees or with ange-ftp.
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
632 ;; The user can type `g' easily, and it is more consistent with find-file.
|
723
|
633 ;; But if SWITCHES are given they are probably different from the
|
|
634 ;; buffer's old value, so call dired-sort-other, which does
|
|
635 ;; revert the buffer.
|
|
636 ;; A pity we can't possibly do "Directory has changed - refresh? "
|
|
637 ;; like find-file does.
|
12996
|
638 ;; Optional argument MODE is passed to dired-find-buffer-nocreate,
|
|
639 ;; see there.
|
47488
|
640 (let* (dirname
|
|
641 buffer
|
723
|
642 ;; note that buffer already is in dired-mode, if found
|
47488
|
643 new-buffer-p
|
723
|
644 (old-buf (current-buffer)))
|
47488
|
645 (if (consp dir-or-list)
|
|
646 (setq dirname (car dir-or-list))
|
|
647 (setq dirname dir-or-list))
|
|
648 ;; Look for an existing buffer.
|
|
649 (setq buffer (dired-find-buffer-nocreate dirname mode)
|
|
650 new-buffer-p (null buffer))
|
723
|
651 (or buffer
|
|
652 (let ((default-major-mode 'fundamental-mode))
|
|
653 ;; We don't want default-major-mode to run hooks and set auto-fill
|
|
654 ;; or whatever, now that dired-mode does not
|
|
655 ;; kill-all-local-variables any longer.
|
|
656 (setq buffer (create-file-buffer (directory-file-name dirname)))))
|
661
|
657 (set-buffer buffer)
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
658 (if (not new-buffer-p) ; existing buffer ...
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
659 (cond (switches ; ... but new switches
|
13010
06f8e805121d
(dired-internal-noselect): Set dired-directory when refreshing a buffer
André Spiegel <spiegel@gnu.org>
diff
changeset
|
660 ;; file list may have changed
|
47488
|
661 (setq dired-directory dir-or-list)
|
13010
06f8e805121d
(dired-internal-noselect): Set dired-directory when refreshing a buffer
André Spiegel <spiegel@gnu.org>
diff
changeset
|
662 ;; this calls dired-revert
|
49549
|
663 (dired-sort-other switches))
|
13010
06f8e805121d
(dired-internal-noselect): Set dired-directory when refreshing a buffer
André Spiegel <spiegel@gnu.org>
diff
changeset
|
664 ;; If directory has changed on disk, offer to revert.
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
665 ((when (dired-directory-changed-p dirname)
|
14309
|
666 (message "%s"
|
14361
|
667 (substitute-command-keys
|
|
668 "Directory has changed on disk; type \\[revert-buffer] to update Dired")))))
|
723
|
669 ;; Else a new buffer
|
5113
|
670 (setq default-directory
|
17439
|
671 ;; We can do this unconditionally
|
|
672 ;; because dired-noselect ensures that the name
|
|
673 ;; is passed in directory name syntax
|
|
674 ;; if it was the name of a directory at all.
|
|
675 (file-name-directory dirname))
|
723
|
676 (or switches (setq switches dired-listing-switches))
|
22355
80bf6e97360b
(dired-internal-noselect): Call either dired-mode or MODE, but not both.
André Spiegel <spiegel@gnu.org>
diff
changeset
|
677 (if mode (funcall mode)
|
47488
|
678 (dired-mode dir-or-list switches))
|
723
|
679 ;; default-directory and dired-actual-switches are set now
|
|
680 ;; (buffer-local), so we can call dired-readin:
|
|
681 (let ((failed t))
|
|
682 (unwind-protect
|
47488
|
683 (progn (dired-readin)
|
723
|
684 (setq failed nil))
|
|
685 ;; dired-readin can fail if parent directories are inaccessible.
|
|
686 ;; Don't leave an empty buffer around in that case.
|
|
687 (if failed (kill-buffer buffer))))
|
661
|
688 (goto-char (point-min))
|
723
|
689 (dired-initial-position dirname))
|
|
690 (set-buffer old-buf)
|
|
691 buffer))
|
661
|
692
|
30108
|
693 (defvar dired-buffers nil
|
|
694 ;; Enlarged by dired-advertise
|
|
695 ;; Queried by function dired-buffers-for-dir. When this detects a
|
|
696 ;; killed buffer, it is removed from this list.
|
|
697 "Alist of expanded directories and their associated dired buffers.")
|
|
698
|
12996
|
699 (defun dired-find-buffer-nocreate (dirname &optional mode)
|
|
700 ;; This differs from dired-buffers-for-dir in that it does not consider
|
|
701 ;; subdirs of default-directory and searches for the first match only.
|
|
702 ;; Also, the major mode must be MODE.
|
47488
|
703 (setq dirname (expand-file-name dirname))
|
11970
|
704 (let (found (blist dired-buffers)) ; was (buffer-list)
|
12996
|
705 (or mode (setq mode 'dired-mode))
|
661
|
706 (while blist
|
12045
|
707 (if (null (buffer-name (cdr (car blist))))
|
|
708 (setq blist (cdr blist))
|
|
709 (save-excursion
|
|
710 (set-buffer (cdr (car blist)))
|
12996
|
711 (if (and (eq major-mode mode)
|
49583
ffebff40964c
(dired-find-buffer-nocreate): Avoid error if dired-directory is nil.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
712 dired-directory ;; nil during find-alternate-file
|
47488
|
713 (equal dirname
|
|
714 (expand-file-name
|
|
715 (if (consp dired-directory)
|
|
716 (car dired-directory)
|
|
717 dired-directory))))
|
12045
|
718 (setq found (cdr (car blist))
|
|
719 blist nil)
|
|
720 (setq blist (cdr blist))))))
|
723
|
721 found))
|
661
|
722
|
35607
|
723
|
723
|
724 ;; Read in a new dired buffer
|
661
|
725
|
47488
|
726 (defun dired-readin ()
|
54533
|
727 "Read in a new dired buffer.
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
728 Differs from `dired-insert-subdir' in that it accepts
|
54533
|
729 wildcards, erases the buffer, and builds the subdir-alist anew
|
|
730 \(including making it buffer-local and clearing it first)."
|
|
731
|
723
|
732 ;; default-directory and dired-actual-switches must be buffer-local
|
|
733 ;; and initialized by now.
|
47488
|
734 (let (dirname)
|
|
735 (if (consp dired-directory)
|
|
736 (setq dirname (car dired-directory))
|
|
737 (setq dirname dired-directory))
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
738 (setq dirname (expand-file-name dirname))
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
739 (save-excursion
|
47488
|
740 ;; This hook which may want to modify dired-actual-switches
|
|
741 ;; based on dired-directory, e.g. with ange-ftp to a SysV host
|
|
742 ;; where ls won't understand -Al switches.
|
|
743 (run-hooks 'dired-before-readin-hook)
|
|
744 (if (consp buffer-undo-list)
|
|
745 (setq buffer-undo-list nil))
|
|
746 (let (buffer-read-only
|
|
747 ;; Don't make undo entries for readin.
|
|
748 (buffer-undo-list t))
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
749 (widen)
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
750 (erase-buffer)
|
47488
|
751 (dired-readin-insert))
|
|
752 (goto-char (point-min))
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
753 ;; Must first make alist buffer local and set it to nil because
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
754 ;; dired-build-subdir-alist will call dired-clear-alist first
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
755 (set (make-local-variable 'dired-subdir-alist) nil)
|
7598
|
756 (dired-build-subdir-alist)
|
8073
|
757 (let ((attributes (file-attributes dirname)))
|
|
758 (if (eq (car attributes) t)
|
|
759 (set-visited-file-modtime (nth 5 attributes))))
|
47488
|
760 (set-buffer-modified-p nil)
|
|
761 ;; No need to narrow since the whole buffer contains just
|
|
762 ;; dired-readin's output, nothing else. The hook can
|
|
763 ;; successfully use dired functions (e.g. dired-get-filename)
|
|
764 ;; as the subdir-alist has been built in dired-readin.
|
|
765 (run-hooks 'dired-after-readin-hook))))
|
661
|
766
|
723
|
767 ;; Subroutines of dired-readin
|
|
768
|
47488
|
769 (defun dired-readin-insert ()
|
|
770 ;; Insert listing for the specified dir (and maybe file list)
|
|
771 ;; already in dired-directory, assuming a clean buffer.
|
|
772 (let (dir file-list)
|
|
773 (if (consp dired-directory)
|
|
774 (setq dir (car dired-directory)
|
|
775 file-list (cdr dired-directory))
|
|
776 (setq dir dired-directory
|
|
777 file-list nil))
|
47901
|
778 (setq dir (expand-file-name dir))
|
47488
|
779 (if (and (equal "" (file-name-nondirectory dir))
|
|
780 (not file-list))
|
4284
|
781 ;; If we are reading a whole single directory...
|
47488
|
782 (dired-insert-directory dir dired-actual-switches nil nil t)
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
783 (if (not (file-readable-p
|
47488
|
784 (directory-file-name (file-name-directory dir))))
|
|
785 (error "Directory %s inaccessible or nonexistent" dir)
|
|
786 ;; Else treat it as a wildcard spec
|
|
787 ;; unless we have an explicit list of files.
|
|
788 (dired-insert-directory dir dired-actual-switches
|
|
789 file-list (not file-list) t)))))
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
790
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
791 (defun dired-align-file (beg end)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
792 "Align the fields of a file to the ones of surrounding lines.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
793 BEG..END is the line where the file info is located."
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
794 ;; Some versions of ls try to adjust the size of each field so as to just
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
795 ;; hold the largest element ("largest" in the current invocation, of
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
796 ;; course). So when a single line is output, the size of each field is
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
797 ;; just big enough for that one output. Thus when dired refreshes one
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
798 ;; line, the alignment if this line w.r.t the rest is messed up because
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
799 ;; the fields of that one line will generally be smaller.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
800 ;;
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
801 ;; To work around this problem, we here add spaces to try and re-align the
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
802 ;; fields as needed. Since this is purely aesthetic, it is of utmost
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
803 ;; importance that it doesn't mess up anything like
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
804 ;; `dired-move-to-filename'. To this end, we limit ourselves to adding
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
805 ;; spaces only, and to only add them at places where there was already at
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
806 ;; least one space. This way, as long as `dired-move-to-filename-regexp'
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
807 ;; always matches spaces with "*" or "+", we know we haven't made anything
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
808 ;; worse. There is one spot where the exact number of spaces is
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
809 ;; important, which is just before the actual filename, so we refrain from
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
810 ;; adding spaces there (and within the filename as well, of course).
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
811 (save-excursion
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
812 (let (file file-col other other-col)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
813 ;; Check the there is indeed a file, and that there is anoter adjacent
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
814 ;; file with which to align, and that additional spaces are needed to
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
815 ;; align the filenames.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
816 (when (and (setq file (progn (goto-char beg)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
817 (dired-move-to-filename nil end)))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
818 (setq file-col (current-column))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
819 (setq other
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
820 (or (and (goto-char beg)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
821 (zerop (forward-line -1))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
822 (dired-move-to-filename))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
823 (and (goto-char beg)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
824 (zerop (forward-line 1))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
825 (dired-move-to-filename))))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
826 (setq other-col (current-column))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
827 (/= file other)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
828 ;; Make sure there is some work left to do.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
829 (> other-col file-col))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
830 ;; If we've only looked at the line above, check to see if the line
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
831 ;; below exists as well and if so, align with the shorter one.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
832 (when (and (< other file)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
833 (goto-char beg)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
834 (zerop (forward-line 1))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
835 (dired-move-to-filename))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
836 (let ((alt-col (current-column)))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
837 (when (< alt-col other-col)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
838 (setq other-col alt-col)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
839 (setq other (point)))))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
840 ;; Keep positions uptodate when we insert stuff.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
841 (if (> other file) (setq other (copy-marker other)))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
842 (setq file (copy-marker file))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
843 ;; Main loop.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
844 (goto-char beg)
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
845 (skip-chars-forward " ") ;Skip to the first field.
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
846 (while (and (> other-col file-col)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
847 ;; Don't touch anything just before (and after) the
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
848 ;; beginning of the filename.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
849 (> file (point)))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
850 ;; We're now just in front of a field, with a space behind us.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
851 (let* ((curcol (current-column))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
852 ;; Nums are right-aligned.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
853 (num-align (looking-at "[0-9]"))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
854 ;; Let's look at the other line, in the same column: we
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
855 ;; should be either near the end of the previous field, or
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
856 ;; in the space between that field and the next.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
857 ;; [ Of course, it's also possible that we're already within
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
858 ;; the next field or even past it, but that's unlikely since
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
859 ;; other-col > file-col. ]
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
860 ;; Let's find the distance to the alignment-point (either
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
861 ;; the beginning or the end of the next field, depending on
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
862 ;; whether this field is left or right aligned).
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
863 (align-pt-offset
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
864 (save-excursion
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
865 (goto-char other)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
866 (move-to-column curcol)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
867 (when (looking-at
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
868 (concat
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
869 (if (eq (char-before) ?\ ) " *" "[^ ]* *")
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
870 (if num-align "[0-9][^ ]*")))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
871 (- (match-end 0) (match-beginning 0)))))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
872 ;; Now, the number of spaces to insert is align-pt-offset
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
873 ;; minus the distance to the equivalent point on the
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
874 ;; current line.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
875 (spaces
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
876 (if (not num-align)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
877 align-pt-offset
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
878 (and align-pt-offset
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
879 (save-excursion
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
880 (skip-chars-forward "^ ")
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
881 (- align-pt-offset (- (current-column) curcol)))))))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
882 (when (and spaces (> spaces 0))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
883 (setq file-col (+ spaces file-col))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
884 (if (> file-col other-col)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
885 (setq spaces (- spaces (- file-col other-col))))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
886 (insert-char ?\s spaces)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
887 ;; Let's just make really sure we did not mess up.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
888 (unless (save-excursion
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
889 (eq (dired-move-to-filename) (marker-position file)))
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
890 ;; Damn! We messed up: let's revert the change.
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
891 (delete-char (- spaces)))))
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
892 ;; Now skip to next field.
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
893 (skip-chars-forward "^ ") (skip-chars-forward " "))
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
894 (set-marker file nil)))))
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
895
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
896
|
47488
|
897 (defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
|
|
898 "Insert a directory listing of DIR, Dired style.
|
|
899 Use SWITCHES to make the listings.
|
|
900 If FILE-LIST is non-nil, list only those files.
|
|
901 Otherwise, if WILDCARD is non-nil, expand wildcards;
|
|
902 in that case, DIR should be a file name that uses wildcards.
|
|
903 In other cases, DIR should be a directory name or a directory filename.
|
|
904 If HDR is non-nil, insert a header line with the directory name."
|
10126
|
905 (let ((opoint (point))
|
13929
|
906 (process-environment (copy-sequence process-environment))
|
10126
|
907 end)
|
47575
4d9f899a5963
* dired.el (dired-insert-directory): Always add "--dired" to to
Kai Großjohann <kgrossjo@eu.uu.net>
diff
changeset
|
908 (if (or dired-use-ls-dired (file-remote-p dir))
|
47488
|
909 (setq switches (concat "--dired " switches)))
|
16773
|
910 ;; We used to specify the C locale here, to force English month names;
|
|
911 ;; but this should not be necessary any more,
|
|
912 ;; with the new value of dired-move-to-filename-regexp.
|
47488
|
913 (if file-list
|
|
914 (dolist (f file-list)
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
915 (let ((beg (point)))
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
916 (insert-directory f switches nil nil)
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
917 ;; Re-align fields, if necessary.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
918 (dired-align-file beg (point))))
|
47488
|
919 (insert-directory dir switches wildcard (not wildcard)))
|
10126
|
920 ;; Quote certain characters, unless ls quoted them for us.
|
11151
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
921 (if (not (string-match "b" dired-actual-switches))
|
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
922 (save-excursion
|
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
923 (setq end (point-marker))
|
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
924 (goto-char opoint)
|
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
925 (while (search-forward "\\" end t)
|
48903
|
926 (replace-match (apply #'propertize
|
|
927 "\\\\"
|
|
928 (text-properties-at (match-beginning 0)))
|
|
929 nil t))
|
11151
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
930 (goto-char opoint)
|
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
931 (while (search-forward "\^m" end t)
|
48903
|
932 (replace-match (apply #'propertize
|
|
933 "\\015"
|
|
934 (text-properties-at (match-beginning 0)))
|
|
935 nil t))
|
11151
ab55a16a92ce
Wrap filename character quoting code with save-excursion so following forms
Simon Marshall <simon@gnu.org>
diff
changeset
|
936 (set-marker end nil)))
|
47488
|
937 (dired-insert-set-properties opoint (point))
|
|
938 ;; If we used --dired and it worked, the lines are already indented.
|
|
939 ;; Otherwise, indent them.
|
|
940 (unless (save-excursion
|
47852
|
941 (goto-char opoint)
|
47488
|
942 (looking-at " "))
|
|
943 (let ((indent-tabs-mode nil))
|
|
944 (indent-rigidly opoint (point) 2)))
|
|
945 ;; Insert text at the beginning to standardize things.
|
|
946 (save-excursion
|
|
947 (goto-char opoint)
|
|
948 (if (and (or hdr wildcard) (not (looking-at "^ /.*:$")))
|
|
949 ;; Note that dired-build-subdir-alist will replace the name
|
|
950 ;; by its expansion, so it does not matter whether what we insert
|
|
951 ;; here is fully expanded, but it should be absolute.
|
|
952 (insert " " (directory-file-name (file-name-directory dir)) ":\n"))
|
|
953 (when wildcard
|
|
954 ;; Insert "wildcard" line where "total" line would be for a full dir.
|
|
955 (insert " wildcard " (file-name-nondirectory dir) "\n")))))
|
723
|
956
|
6634
|
957 (defun dired-insert-set-properties (beg end)
|
54533
|
958 "Make the file names highlight when the mouse is on them."
|
6634
|
959 (save-excursion
|
|
960 (goto-char beg)
|
|
961 (while (< (point) end)
|
12736
|
962 (condition-case nil
|
|
963 (if (dired-move-to-filename)
|
38074
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
964 (add-text-properties
|
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
965 (point)
|
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
966 (save-excursion
|
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
967 (dired-move-to-end-of-filename)
|
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
968 (point))
|
38426
|
969 '(mouse-face highlight
|
38074
7ca7def9af01
(dired-insert-set-properties): Add help-echo to mouse-highlighted text.
Eli Zaretskii <eliz@gnu.org>
diff
changeset
|
970 help-echo "mouse-2: visit this file in other window")))
|
12736
|
971 (error nil))
|
6634
|
972 (forward-line 1))))
|
35607
|
973
|
723
|
974 ;; Reverting a dired buffer
|
661
|
975
|
|
976 (defun dired-revert (&optional arg noconfirm)
|
54533
|
977 "Reread the dired buffer.
|
|
978 Must also be called after dired-actual-switches have changed.
|
|
979 Should not fail even on completely garbaged buffers.
|
|
980 Preserves old cursor, marks/flags, hidden-p."
|
723
|
981 (widen) ; just in case user narrowed
|
56035
|
982 (let ((modflag (buffer-modified-p))
|
|
983 (opoint (point))
|
723
|
984 (ofile (dired-get-filename nil t))
|
|
985 (mark-alist nil) ; save marked files
|
|
986 (hidden-subdirs (dired-remember-hidden))
|
|
987 (old-subdir-alist (cdr (reverse dired-subdir-alist))) ; except pwd
|
|
988 (case-fold-search nil) ; we check for upper case ls flags
|
|
989 buffer-read-only)
|
|
990 (goto-char (point-min))
|
|
991 (setq mark-alist;; only after dired-remember-hidden since this unhides:
|
|
992 (dired-remember-marks (point-min) (point-max)))
|
|
993 ;; treat top level dir extra (it may contain wildcards)
|
2492
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
994 (dired-uncache
|
de8b66eb78cf
dired-noselect, dired-internal-noselect, dired-insert-directory:
Eric S. Raymond <esr@snark.thyrsus.com>
diff
changeset
|
995 (if (consp dired-directory) (car dired-directory) dired-directory))
|
47488
|
996 (dired-readin)
|
723
|
997 (let ((dired-after-readin-hook nil))
|
|
998 ;; don't run that hook for each subdir...
|
|
999 (dired-insert-old-subdirs old-subdir-alist))
|
|
1000 (dired-mark-remembered mark-alist) ; mark files that were marked
|
|
1001 ;; ... run the hook for the whole buffer, and only after markers
|
|
1002 ;; have been reinserted (else omitting in dired-x would omit marked files)
|
|
1003 (run-hooks 'dired-after-readin-hook) ; no need to narrow
|
|
1004 (or (and ofile (dired-goto-file ofile)) ; move cursor to where it
|
|
1005 (goto-char opoint)) ; was before
|
661
|
1006 (dired-move-to-filename)
|
723
|
1007 (save-excursion ; hide subdirs that were hidden
|
54533
|
1008 (dolist (dir hidden-subdirs)
|
|
1009 (if (dired-goto-subdir dir)
|
56035
|
1010 (dired-hide-subdir 1))))
|
|
1011 (unless modflag (restore-buffer-modified-p nil)))
|
723
|
1012 ;; outside of the let scope
|
56035
|
1013 ;;; Might as well not override the user if the user changed this.
|
723
|
1014 ;;; (setq buffer-read-only t)
|
|
1015 )
|
|
1016
|
|
1017 ;; Subroutines of dired-revert
|
|
1018 ;; Some of these are also used when inserting subdirs.
|
|
1019
|
|
1020 (defun dired-remember-marks (beg end)
|
54533
|
1021 "Return alist of files and their marks, from BEG to END."
|
723
|
1022 (if selective-display ; must unhide to make this work.
|
|
1023 (let (buffer-read-only)
|
|
1024 (subst-char-in-region beg end ?\r ?\n)))
|
|
1025 (let (fil chr alist)
|
|
1026 (save-excursion
|
|
1027 (goto-char beg)
|
|
1028 (while (re-search-forward dired-re-mark end t)
|
|
1029 (if (setq fil (dired-get-filename nil t))
|
|
1030 (setq chr (preceding-char)
|
|
1031 alist (cons (cons fil chr) alist)))))
|
|
1032 alist))
|
|
1033
|
|
1034 (defun dired-mark-remembered (alist)
|
54533
|
1035 "Mark all files remembered in ALIST.
|
|
1036 Each element of ALIST looks like (FILE . MARKERCHAR)."
|
723
|
1037 (let (elt fil chr)
|
|
1038 (while alist
|
|
1039 (setq elt (car alist)
|
|
1040 alist (cdr alist)
|
|
1041 fil (car elt)
|
|
1042 chr (cdr elt))
|
|
1043 (if (dired-goto-file fil)
|
|
1044 (save-excursion
|
|
1045 (beginning-of-line)
|
|
1046 (delete-char 1)
|
|
1047 (insert chr))))))
|
|
1048
|
|
1049 (defun dired-remember-hidden ()
|
54533
|
1050 "Return a list of names of subdirs currently hidden."
|
723
|
1051 (let ((l dired-subdir-alist) dir pos result)
|
|
1052 (while l
|
|
1053 (setq dir (car (car l))
|
|
1054 pos (cdr (car l))
|
|
1055 l (cdr l))
|
|
1056 (goto-char pos)
|
|
1057 (skip-chars-forward "^\r\n")
|
834
|
1058 (if (eq (following-char) ?\r)
|
723
|
1059 (setq result (cons dir result))))
|
|
1060 result))
|
|
1061
|
|
1062 (defun dired-insert-old-subdirs (old-subdir-alist)
|
54533
|
1063 "Try to insert all subdirs that were displayed before.
|
|
1064 Do so according to the former subdir alist OLD-SUBDIR-ALIST."
|
723
|
1065 (or (string-match "R" dired-actual-switches)
|
|
1066 (let (elt dir)
|
|
1067 (while old-subdir-alist
|
|
1068 (setq elt (car old-subdir-alist)
|
|
1069 old-subdir-alist (cdr old-subdir-alist)
|
|
1070 dir (car elt))
|
|
1071 (condition-case ()
|
1130
|
1072 (progn
|
|
1073 (dired-uncache dir)
|
56015
e7e7513282b4
(dired-insert-old-subdirs): Adapt to fact that the R switch is no
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
1074 (dired-insert-subdir dir))
|
723
|
1075 (error nil))))))
|
1130
|
1076
|
|
1077 (defun dired-uncache (dir)
|
54533
|
1078 "Remove directory DIR from any directory cache."
|
7030
|
1079 (let ((handler (find-file-name-handler dir 'dired-uncache)))
|
1130
|
1080 (if handler
|
|
1081 (funcall handler 'dired-uncache dir))))
|
35607
|
1082
|
723
|
1083 ;; dired mode key bindings and initialization
|
661
|
1084
|
54533
|
1085 (defvar dired-mode-map
|
723
|
1086 ;; This looks ugly when substitute-command-keys uses C-d instead d:
|
|
1087 ;; (define-key dired-mode-map "\C-d" 'dired-flag-file-deletion)
|
12801
|
1088 (let ((map (make-keymap)))
|
|
1089 (suppress-keymap map)
|
|
1090 (define-key map [mouse-2] 'dired-mouse-find-file-other-window)
|
59024
|
1091 (define-key map [follow-link] 'mouse-face)
|
12801
|
1092 ;; Commands to mark or flag certain categories of files
|
|
1093 (define-key map "#" 'dired-flag-auto-save-files)
|
|
1094 (define-key map "." 'dired-clean-directory)
|
|
1095 (define-key map "~" 'dired-flag-backup-files)
|
16825
|
1096 (define-key map "&" 'dired-flag-garbage-files)
|
12801
|
1097 ;; Upper case keys (except !) for operating on the marked files
|
|
1098 (define-key map "A" 'dired-do-search)
|
|
1099 (define-key map "C" 'dired-do-copy)
|
|
1100 (define-key map "B" 'dired-do-byte-compile)
|
|
1101 (define-key map "D" 'dired-do-delete)
|
|
1102 (define-key map "G" 'dired-do-chgrp)
|
|
1103 (define-key map "H" 'dired-do-hardlink)
|
|
1104 (define-key map "L" 'dired-do-load)
|
|
1105 (define-key map "M" 'dired-do-chmod)
|
|
1106 (define-key map "O" 'dired-do-chown)
|
|
1107 (define-key map "P" 'dired-do-print)
|
28937
|
1108 (define-key map "Q" 'dired-do-query-replace-regexp)
|
12801
|
1109 (define-key map "R" 'dired-do-rename)
|
|
1110 (define-key map "S" 'dired-do-symlink)
|
54663
|
1111 (define-key map "T" 'dired-do-touch)
|
12801
|
1112 (define-key map "X" 'dired-do-shell-command)
|
|
1113 (define-key map "Z" 'dired-do-compress)
|
|
1114 (define-key map "!" 'dired-do-shell-command)
|
|
1115 ;; Comparison commands
|
|
1116 (define-key map "=" 'dired-diff)
|
|
1117 (define-key map "\M-=" 'dired-backup-diff)
|
|
1118 ;; Tree Dired commands
|
|
1119 (define-key map "\M-\C-?" 'dired-unmark-all-files)
|
|
1120 (define-key map "\M-\C-d" 'dired-tree-down)
|
|
1121 (define-key map "\M-\C-u" 'dired-tree-up)
|
|
1122 (define-key map "\M-\C-n" 'dired-next-subdir)
|
|
1123 (define-key map "\M-\C-p" 'dired-prev-subdir)
|
|
1124 ;; move to marked files
|
|
1125 (define-key map "\M-{" 'dired-prev-marked-file)
|
|
1126 (define-key map "\M-}" 'dired-next-marked-file)
|
|
1127 ;; Make all regexp commands share a `%' prefix:
|
|
1128 ;; We used to get to the submap via a symbol dired-regexp-prefix,
|
|
1129 ;; but that seems to serve little purpose, and copy-keymap
|
|
1130 ;; does a better job without it.
|
|
1131 (define-key map "%" nil)
|
|
1132 (define-key map "%u" 'dired-upcase)
|
|
1133 (define-key map "%l" 'dired-downcase)
|
|
1134 (define-key map "%d" 'dired-flag-files-regexp)
|
22206
|
1135 (define-key map "%g" 'dired-mark-files-containing-regexp)
|
12801
|
1136 (define-key map "%m" 'dired-mark-files-regexp)
|
|
1137 (define-key map "%r" 'dired-do-rename-regexp)
|
|
1138 (define-key map "%C" 'dired-do-copy-regexp)
|
|
1139 (define-key map "%H" 'dired-do-hardlink-regexp)
|
|
1140 (define-key map "%R" 'dired-do-rename-regexp)
|
|
1141 (define-key map "%S" 'dired-do-symlink-regexp)
|
16500
|
1142 ;; Commands for marking and unmarking.
|
|
1143 (define-key map "*" nil)
|
|
1144 (define-key map "**" 'dired-mark-executables)
|
|
1145 (define-key map "*/" 'dired-mark-directories)
|
|
1146 (define-key map "*@" 'dired-mark-symlinks)
|
|
1147 (define-key map "*%" 'dired-mark-files-regexp)
|
|
1148 (define-key map "*c" 'dired-change-marks)
|
16514
|
1149 (define-key map "*s" 'dired-mark-subdir-files)
|
16500
|
1150 (define-key map "*m" 'dired-mark)
|
|
1151 (define-key map "*u" 'dired-unmark)
|
|
1152 (define-key map "*?" 'dired-unmark-all-files)
|
18160
|
1153 (define-key map "*!" 'dired-unmark-all-marks)
|
54533
|
1154 (define-key map "U" 'dired-unmark-all-marks)
|
16500
|
1155 (define-key map "*\177" 'dired-unmark-backward)
|
|
1156 (define-key map "*\C-n" 'dired-next-marked-file)
|
|
1157 (define-key map "*\C-p" 'dired-prev-marked-file)
|
44212
e87d819f2887
(dired-toggle-marks): Renamed from dired-do-toggle. Bindings changed.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1158 (define-key map "*t" 'dired-toggle-marks)
|
12801
|
1159 ;; Lower keys for commands not operating on all the marked files
|
30108
|
1160 (define-key map "a" 'dired-find-alternate-file)
|
12801
|
1161 (define-key map "d" 'dired-flag-file-deletion)
|
|
1162 (define-key map "e" 'dired-find-file)
|
|
1163 (define-key map "f" 'dired-find-file)
|
|
1164 (define-key map "\C-m" 'dired-advertised-find-file)
|
|
1165 (define-key map "g" 'revert-buffer)
|
52488
|
1166 (define-key map "\M-g" 'dired-goto-file)
|
12801
|
1167 (define-key map "h" 'describe-mode)
|
|
1168 (define-key map "i" 'dired-maybe-insert-subdir)
|
|
1169 (define-key map "k" 'dired-do-kill-lines)
|
|
1170 (define-key map "l" 'dired-do-redisplay)
|
|
1171 (define-key map "m" 'dired-mark)
|
|
1172 (define-key map "n" 'dired-next-line)
|
|
1173 (define-key map "o" 'dired-find-file-other-window)
|
|
1174 (define-key map "\C-o" 'dired-display-file)
|
|
1175 (define-key map "p" 'dired-previous-line)
|
21095
|
1176 (define-key map "q" 'quit-window)
|
12801
|
1177 (define-key map "s" 'dired-sort-toggle-or-edit)
|
44212
e87d819f2887
(dired-toggle-marks): Renamed from dired-do-toggle. Bindings changed.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1178 (define-key map "t" 'dired-toggle-marks)
|
12801
|
1179 (define-key map "u" 'dired-unmark)
|
|
1180 (define-key map "v" 'dired-view-file)
|
42100
|
1181 (define-key map "w" 'dired-copy-filename-as-kill)
|
12801
|
1182 (define-key map "x" 'dired-do-flagged-delete)
|
38990
|
1183 (define-key map "y" 'dired-show-file-type)
|
12801
|
1184 (define-key map "+" 'dired-create-directory)
|
|
1185 ;; moving
|
|
1186 (define-key map "<" 'dired-prev-dirline)
|
|
1187 (define-key map ">" 'dired-next-dirline)
|
|
1188 (define-key map "^" 'dired-up-directory)
|
|
1189 (define-key map " " 'dired-next-line)
|
|
1190 (define-key map "\C-n" 'dired-next-line)
|
|
1191 (define-key map "\C-p" 'dired-previous-line)
|
|
1192 (define-key map [down] 'dired-next-line)
|
|
1193 (define-key map [up] 'dired-previous-line)
|
|
1194 ;; hiding
|
|
1195 (define-key map "$" 'dired-hide-subdir)
|
|
1196 (define-key map "\M-$" 'dired-hide-all)
|
|
1197 ;; misc
|
|
1198 (define-key map "?" 'dired-summary)
|
|
1199 (define-key map "\177" 'dired-unmark-backward)
|
59786
|
1200 (define-key map [remap undo] 'dired-undo)
|
|
1201 (define-key map [remap advertised-undo] 'dired-undo)
|
4099
|
1202
|
12801
|
1203 ;; Make menu bar items.
|
4099
|
1204
|
27840
|
1205 ;; No need to fo this, now that top-level items are fewer.
|
|
1206 ;;;;
|
12801
|
1207 ;; Get rid of the Edit menu bar item to save space.
|
27840
|
1208 ;(define-key map [menu-bar edit] 'undefined)
|
12801
|
1209
|
|
1210 (define-key map [menu-bar subdir]
|
|
1211 (cons "Subdir" (make-sparse-keymap "Subdir")))
|
4099
|
1212
|
12801
|
1213 (define-key map [menu-bar subdir hide-all]
|
27840
|
1214 '(menu-item "Hide All" dired-hide-all
|
|
1215 :help "Hide all subdirectories, leave only header lines"))
|
12801
|
1216 (define-key map [menu-bar subdir hide-subdir]
|
27840
|
1217 '(menu-item "Hide/UnHide Subdir" dired-hide-subdir
|
|
1218 :help "Hide or unhide current directory listing"))
|
12801
|
1219 (define-key map [menu-bar subdir tree-down]
|
27840
|
1220 '(menu-item "Tree Down" dired-tree-down
|
|
1221 :help "Go to first subdirectory header down the tree"))
|
12801
|
1222 (define-key map [menu-bar subdir tree-up]
|
27840
|
1223 '(menu-item "Tree Up" dired-tree-up
|
|
1224 :help "Go to first subdirectory header up the tree"))
|
12801
|
1225 (define-key map [menu-bar subdir up]
|
27840
|
1226 '(menu-item "Up Directory" dired-up-directory
|
|
1227 :help "Edit the parent directory"))
|
12801
|
1228 (define-key map [menu-bar subdir prev-subdir]
|
27840
|
1229 '(menu-item "Prev Subdir" dired-prev-subdir
|
|
1230 :help "Go to previous subdirectory header line"))
|
12801
|
1231 (define-key map [menu-bar subdir next-subdir]
|
27840
|
1232 '(menu-item "Next Subdir" dired-next-subdir
|
|
1233 :help "Go to next subdirectory header line"))
|
12801
|
1234 (define-key map [menu-bar subdir prev-dirline]
|
27840
|
1235 '(menu-item "Prev Dirline" dired-prev-dirline
|
|
1236 :help "Move to next directory-file line"))
|
12801
|
1237 (define-key map [menu-bar subdir next-dirline]
|
27840
|
1238 '(menu-item "Next Dirline" dired-next-dirline
|
|
1239 :help "Move to previous directory-file line"))
|
12801
|
1240 (define-key map [menu-bar subdir insert]
|
27840
|
1241 '(menu-item "Insert This Subdir" dired-maybe-insert-subdir
|
|
1242 :help "Insert contents of subdirectory"))
|
4099
|
1243
|
12801
|
1244 (define-key map [menu-bar immediate]
|
|
1245 (cons "Immediate" (make-sparse-keymap "Immediate")))
|
4099
|
1246
|
16090
|
1247 (define-key map [menu-bar immediate revert-buffer]
|
27840
|
1248 '(menu-item "Refresh" revert-buffer
|
|
1249 :help "Update contents of shown directories"))
|
16090
|
1250
|
|
1251 (define-key map [menu-bar immediate dashes]
|
|
1252 '("--"))
|
|
1253
|
12801
|
1254 (define-key map [menu-bar immediate backup-diff]
|
27840
|
1255 '(menu-item "Compare with Backup" dired-backup-diff
|
|
1256 :help "Diff file at cursor with its latest backup"))
|
12801
|
1257 (define-key map [menu-bar immediate diff]
|
27840
|
1258 '(menu-item "Diff..." dired-diff
|
|
1259 :help "Compare file at cursor with another file"))
|
12801
|
1260 (define-key map [menu-bar immediate view]
|
27840
|
1261 '(menu-item "View This File" dired-view-file
|
|
1262 :help "Examine file at cursor in read-only mode"))
|
12801
|
1263 (define-key map [menu-bar immediate display]
|
27840
|
1264 '(menu-item "Display in Other Window" dired-display-file
|
|
1265 :help "Display file at cursor in other window"))
|
12801
|
1266 (define-key map [menu-bar immediate find-file-other-window]
|
27840
|
1267 '(menu-item "Find in Other Window" dired-find-file-other-window
|
|
1268 :help "Edit file at cursor in other window"))
|
12801
|
1269 (define-key map [menu-bar immediate find-file]
|
27840
|
1270 '(menu-item "Find This File" dired-find-file
|
|
1271 :help "Edit file at cursor"))
|
12801
|
1272 (define-key map [menu-bar immediate create-directory]
|
27840
|
1273 '(menu-item "Create Directory..." dired-create-directory))
|
55108
|
1274 (define-key map [menu-bar immediate wdired-mode]
|
|
1275 '(menu-item "Edit File Names" wdired-change-to-wdired-mode))
|
12801
|
1276
|
|
1277 (define-key map [menu-bar regexp]
|
|
1278 (cons "Regexp" (make-sparse-keymap "Regexp")))
|
4099
|
1279
|
12801
|
1280 (define-key map [menu-bar regexp downcase]
|
27840
|
1281 '(menu-item "Downcase" dired-downcase
|
|
1282 ;; When running on plain MS-DOS, there's only one
|
|
1283 ;; letter-case for file names.
|
|
1284 :enable (or (not (fboundp 'msdos-long-file-names))
|
|
1285 (msdos-long-file-names))
|
|
1286 :help "Rename marked files to lower-case name"))
|
12801
|
1287 (define-key map [menu-bar regexp upcase]
|
27840
|
1288 '(menu-item "Upcase" dired-upcase
|
|
1289 :enable (or (not (fboundp 'msdos-long-file-names))
|
|
1290 (msdos-long-file-names))
|
|
1291 :help "Rename marked files to upper-case name"))
|
12801
|
1292 (define-key map [menu-bar regexp hardlink]
|
27840
|
1293 '(menu-item "Hardlink..." dired-do-hardlink-regexp
|
|
1294 :help "Make hard links for files matching regexp"))
|
12801
|
1295 (define-key map [menu-bar regexp symlink]
|
27840
|
1296 '(menu-item "Symlink..." dired-do-symlink-regexp
|
|
1297 :visible (fboundp 'make-symbolic-link)
|
|
1298 :help "Make symbolic links for files matching regexp"))
|
12801
|
1299 (define-key map [menu-bar regexp rename]
|
27840
|
1300 '(menu-item "Rename..." dired-do-rename-regexp
|
|
1301 :help "Rename marked files matching regexp"))
|
12801
|
1302 (define-key map [menu-bar regexp copy]
|
27840
|
1303 '(menu-item "Copy..." dired-do-copy-regexp
|
|
1304 :help "Copy marked files matching regexp"))
|
12801
|
1305 (define-key map [menu-bar regexp flag]
|
27840
|
1306 '(menu-item "Flag..." dired-flag-files-regexp
|
|
1307 :help "Flag files matching regexp for deletion"))
|
12801
|
1308 (define-key map [menu-bar regexp mark]
|
27840
|
1309 '(menu-item "Mark..." dired-mark-files-regexp
|
|
1310 :help "Mark files matching regexp for future operations"))
|
24023
|
1311 (define-key map [menu-bar regexp mark-cont]
|
27840
|
1312 '(menu-item "Mark Containing..." dired-mark-files-containing-regexp
|
|
1313 :help "Mark files whose contents matches regexp"))
|
4099
|
1314
|
12801
|
1315 (define-key map [menu-bar mark]
|
|
1316 (cons "Mark" (make-sparse-keymap "Mark")))
|
4099
|
1317
|
12801
|
1318 (define-key map [menu-bar mark prev]
|
27840
|
1319 '(menu-item "Previous Marked" dired-prev-marked-file
|
|
1320 :help "Move to previous marked file"))
|
12801
|
1321 (define-key map [menu-bar mark next]
|
27840
|
1322 '(menu-item "Next Marked" dired-next-marked-file
|
|
1323 :help "Move to next marked file"))
|
12801
|
1324 (define-key map [menu-bar mark marks]
|
27840
|
1325 '(menu-item "Change Marks..." dired-change-marks
|
|
1326 :help "Replace marker with another character"))
|
12801
|
1327 (define-key map [menu-bar mark unmark-all]
|
27840
|
1328 '(menu-item "Unmark All" dired-unmark-all-marks))
|
12801
|
1329 (define-key map [menu-bar mark symlinks]
|
27840
|
1330 '(menu-item "Mark Symlinks" dired-mark-symlinks
|
|
1331 :visible (fboundp 'make-symbolic-link)
|
|
1332 :help "Mark all symbolic links"))
|
12801
|
1333 (define-key map [menu-bar mark directories]
|
27840
|
1334 '(menu-item "Mark Directories" dired-mark-directories
|
|
1335 :help "Mark all directories except `.' and `..'"))
|
12801
|
1336 (define-key map [menu-bar mark directory]
|
27840
|
1337 '(menu-item "Mark Old Backups" dired-clean-directory
|
|
1338 :help "Flag old numbered backups for deletion"))
|
12801
|
1339 (define-key map [menu-bar mark executables]
|
27840
|
1340 '(menu-item "Mark Executables" dired-mark-executables
|
|
1341 :help "Mark all executable files"))
|
16825
|
1342 (define-key map [menu-bar mark garbage-files]
|
27840
|
1343 '(menu-item "Flag Garbage Files" dired-flag-garbage-files
|
|
1344 :help "Flag unneeded files for deletion"))
|
12801
|
1345 (define-key map [menu-bar mark backup-files]
|
27840
|
1346 '(menu-item "Flag Backup Files" dired-flag-backup-files
|
|
1347 :help "Flag all backup files for deletion"))
|
12801
|
1348 (define-key map [menu-bar mark auto-save-files]
|
27840
|
1349 '(menu-item "Flag Auto-save Files" dired-flag-auto-save-files
|
|
1350 :help "Flag auto-save files for deletion"))
|
12801
|
1351 (define-key map [menu-bar mark deletion]
|
27840
|
1352 '(menu-item "Flag" dired-flag-file-deletion
|
|
1353 :help "Flag current line's file for deletion"))
|
12801
|
1354 (define-key map [menu-bar mark unmark]
|
27840
|
1355 '(menu-item "Unmark" dired-unmark
|
|
1356 :help "Unmark or unflag current line's file"))
|
12801
|
1357 (define-key map [menu-bar mark mark]
|
27840
|
1358 '(menu-item "Mark" dired-mark
|
|
1359 :help "Mark current line's file for future operations"))
|
20991
|
1360 (define-key map [menu-bar mark toggle-marks]
|
44212
e87d819f2887
(dired-toggle-marks): Renamed from dired-do-toggle. Bindings changed.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1361 '(menu-item "Toggle Marks" dired-toggle-marks
|
27840
|
1362 :help "Mark unmarked files, unmark marked ones"))
|
4099
|
1363
|
12801
|
1364 (define-key map [menu-bar operate]
|
|
1365 (cons "Operate" (make-sparse-keymap "Operate")))
|
4099
|
1366
|
12801
|
1367 (define-key map [menu-bar operate query-replace]
|
28937
|
1368 '(menu-item "Query Replace in Files..." dired-do-query-replace-regexp
|
27840
|
1369 :help "Replace regexp in marked files"))
|
12801
|
1370 (define-key map [menu-bar operate search]
|
27840
|
1371 '(menu-item "Search Files..." dired-do-search
|
|
1372 :help "Search marked files for regexp"))
|
12801
|
1373 (define-key map [menu-bar operate chown]
|
27840
|
1374 '(menu-item "Change Owner..." dired-do-chown
|
|
1375 :visible (not (memq system-type '(ms-dos windows-nt)))
|
|
1376 :help "Change the owner of marked files"))
|
12801
|
1377 (define-key map [menu-bar operate chgrp]
|
27840
|
1378 '(menu-item "Change Group..." dired-do-chgrp
|
|
1379 :visible (not (memq system-type '(ms-dos windows-nt)))
|
|
1380 :help "Change the group of marked files"))
|
12801
|
1381 (define-key map [menu-bar operate chmod]
|
27840
|
1382 '(menu-item "Change Mode..." dired-do-chmod
|
|
1383 :help "Change mode (attributes) of marked files"))
|
54663
|
1384 (define-key map [menu-bar operate touch]
|
|
1385 '(menu-item "Change Timestamp..." dired-do-touch
|
|
1386 :help "Change timestamp of marked files"))
|
12801
|
1387 (define-key map [menu-bar operate load]
|
27840
|
1388 '(menu-item "Load" dired-do-load
|
|
1389 :help "Load marked Emacs Lisp files"))
|
12801
|
1390 (define-key map [menu-bar operate compile]
|
27840
|
1391 '(menu-item "Byte-compile" dired-do-byte-compile
|
|
1392 :help "Byte-compile marked Emacs Lisp files"))
|
12801
|
1393 (define-key map [menu-bar operate compress]
|
27840
|
1394 '(menu-item "Compress" dired-do-compress
|
|
1395 :help "Compress/uncompress marked files"))
|
12801
|
1396 (define-key map [menu-bar operate print]
|
27840
|
1397 '(menu-item "Print..." dired-do-print
|
|
1398 :help "Ask for print command and print marked files"))
|
12801
|
1399 (define-key map [menu-bar operate hardlink]
|
27840
|
1400 '(menu-item "Hardlink to..." dired-do-hardlink
|
|
1401 :help "Make hard links for current or marked files"))
|
12801
|
1402 (define-key map [menu-bar operate symlink]
|
27840
|
1403 '(menu-item "Symlink to..." dired-do-symlink
|
|
1404 :visible (fboundp 'make-symbolic-link)
|
|
1405 :help "Make symbolic links for current or marked files"))
|
12801
|
1406 (define-key map [menu-bar operate command]
|
27840
|
1407 '(menu-item "Shell Command..." dired-do-shell-command
|
|
1408 :help "Run a shell command on each of marked files"))
|
12801
|
1409 (define-key map [menu-bar operate delete]
|
27840
|
1410 '(menu-item "Delete" dired-do-delete
|
|
1411 :help "Delete current file or all marked files"))
|
12801
|
1412 (define-key map [menu-bar operate rename]
|
27840
|
1413 '(menu-item "Rename to..." dired-do-rename
|
|
1414 :help "Rename current file or move marked files"))
|
12801
|
1415 (define-key map [menu-bar operate copy]
|
27840
|
1416 '(menu-item "Copy to..." dired-do-copy
|
|
1417 :help "Copy current file or all marked files"))
|
4099
|
1418
|
54533
|
1419 map)
|
|
1420 "Local keymap for `dired-mode' buffers.")
|
35607
|
1421
|
661
|
1422 ;; Dired mode is suitable only for specially formatted data.
|
|
1423 (put 'dired-mode 'mode-class 'special)
|
|
1424
|
723
|
1425 (defun dired-mode (&optional dirname switches)
|
|
1426 "\
|
|
1427 Mode for \"editing\" directory listings.
|
40950
|
1428 In Dired, you are \"editing\" a list of the files in a directory and
|
723
|
1429 \(optionally) its subdirectories, in the format of `ls -lR'.
|
|
1430 Each directory is a page: use \\[backward-page] and \\[forward-page] to move pagewise.
|
|
1431 \"Editing\" means that you can run shell commands on files, visit,
|
|
1432 compress, load or byte-compile them, change their file attributes
|
|
1433 and insert subdirectories into the same buffer. You can \"mark\"
|
|
1434 files for later commands or \"flag\" them for deletion, either file
|
|
1435 by file or all files matching certain criteria.
|
|
1436 You can move using the usual cursor motion commands.\\<dired-mode-map>
|
|
1437 Letters no longer insert themselves. Digits are prefix arguments.
|
|
1438 Instead, type \\[dired-flag-file-deletion] to flag a file for Deletion.
|
|
1439 Type \\[dired-mark] to Mark a file or subdirectory for later commands.
|
|
1440 Most commands operate on the marked files and use the current file
|
|
1441 if no files are marked. Use a numeric prefix argument to operate on
|
|
1442 the next ARG (or previous -ARG if ARG<0) files, or just `1'
|
|
1443 to operate on the current file only. Prefix arguments override marks.
|
|
1444 Mark-using commands display a list of failures afterwards. Type \\[dired-summary]
|
|
1445 to see why something went wrong.
|
|
1446 Type \\[dired-unmark] to Unmark a file or all files of a subdirectory.
|
|
1447 Type \\[dired-unmark-backward] to back up one line and unflag.
|
|
1448 Type \\[dired-do-flagged-delete] to eXecute the deletions requested.
|
|
1449 Type \\[dired-advertised-find-file] to Find the current line's file
|
|
1450 (or dired it in another buffer, if it is a directory).
|
|
1451 Type \\[dired-find-file-other-window] to find file or dired directory in Other window.
|
|
1452 Type \\[dired-maybe-insert-subdir] to Insert a subdirectory in this buffer.
|
|
1453 Type \\[dired-do-rename] to Rename a file or move the marked files to another directory.
|
|
1454 Type \\[dired-do-copy] to Copy files.
|
|
1455 Type \\[dired-sort-toggle-or-edit] to toggle sorting by name/date or change the `ls' switches.
|
|
1456 Type \\[revert-buffer] to read all currently expanded directories again.
|
|
1457 This retains all marks and hides subdirs again that were hidden before.
|
|
1458 SPC and DEL can be used to move down and up by lines.
|
|
1459
|
|
1460 If dired ever gets confused, you can either type \\[revert-buffer] \
|
|
1461 to read the
|
|
1462 directories again, type \\[dired-do-redisplay] \
|
|
1463 to relist a single or the marked files or a
|
|
1464 subdirectory, or type \\[dired-build-subdir-alist] to parse the buffer
|
|
1465 again for the directory tree.
|
|
1466
|
|
1467 Customization variables (rename this buffer and type \\[describe-variable] on each line
|
|
1468 for more info):
|
|
1469
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1470 `dired-listing-switches'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1471 `dired-trivial-filenames'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1472 `dired-shrink-to-fit'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1473 `dired-marker-char'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1474 `dired-del-marker'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1475 `dired-keep-marker-rename'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1476 `dired-keep-marker-copy'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1477 `dired-keep-marker-hardlink'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1478 `dired-keep-marker-symlink'
|
723
|
1479
|
|
1480 Hooks (use \\[describe-variable] to see their documentation):
|
|
1481
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1482 `dired-before-readin-hook'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1483 `dired-after-readin-hook'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1484 `dired-mode-hook'
|
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1485 `dired-load-hook'
|
723
|
1486
|
|
1487 Keybindings:
|
661
|
1488 \\{dired-mode-map}"
|
723
|
1489 ;; Not to be called interactively (e.g. dired-directory will be set
|
|
1490 ;; to default-directory, which is wrong with wildcards).
|
661
|
1491 (kill-all-local-variables)
|
|
1492 (use-local-map dired-mode-map)
|
723
|
1493 (dired-advertise) ; default-directory is already set
|
|
1494 (setq major-mode 'dired-mode
|
|
1495 mode-name "Dired"
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1496 ;; case-fold-search nil
|
723
|
1497 buffer-read-only t
|
|
1498 selective-display t ; for subdirectory hiding
|
27784
|
1499 mode-line-buffer-identification
|
|
1500 (propertized-buffer-identification "%17b"))
|
723
|
1501 (set (make-local-variable 'revert-buffer-function)
|
|
1502 (function dired-revert))
|
54512
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
1503 (set (make-local-variable 'buffer-stale-function)
|
1042cb3d696b
(dired-directory-changed-p, dired-buffer-stale-p): New functions.
Luc Teirlinck <teirllm@auburn.edu>
diff
changeset
|
1504 (function dired-buffer-stale-p))
|
723
|
1505 (set (make-local-variable 'page-delimiter)
|
|
1506 "\n\n")
|
|
1507 (set (make-local-variable 'dired-directory)
|
|
1508 (or dirname default-directory))
|
|
1509 ;; list-buffers uses this to display the dir being edited in this buffer.
|
|
1510 (set (make-local-variable 'list-buffers-directory)
|
52706
|
1511 (expand-file-name (if (listp dired-directory)
|
|
1512 (car dired-directory)
|
|
1513 dired-directory)))
|
723
|
1514 (set (make-local-variable 'dired-actual-switches)
|
|
1515 (or switches dired-listing-switches))
|
54533
|
1516 (set (make-local-variable 'font-lock-defaults)
|
|
1517 '(dired-font-lock-keywords t nil nil beginning-of-line))
|
55154
9752700e4860
(dired-mode): Rename desktop-buffer-misc-data-function to desktop-save-buffer.
Lars Hansen <larsh@soem.dk>
diff
changeset
|
1518 (set (make-local-variable 'desktop-save-buffer)
|
55058
|
1519 'dired-desktop-buffer-misc-data)
|
55937
|
1520 (setq dired-switches-alist nil)
|
723
|
1521 (dired-sort-other dired-actual-switches t)
|
54577
|
1522 (run-mode-hooks 'dired-mode-hook)
|
53789
|
1523 (when (featurep 'x-dnd)
|
|
1524 (make-variable-buffer-local 'x-dnd-test-function)
|
|
1525 (make-variable-buffer-local 'x-dnd-protocol-alist)
|
|
1526 (setq x-dnd-test-function 'dired-dnd-test-function)
|
|
1527 (setq x-dnd-protocol-alist
|
|
1528 (append '(("^file:///" . dired-dnd-handle-local-file)
|
|
1529 ("^file://" . dired-dnd-handle-file)
|
|
1530 ("^file:" . dired-dnd-handle-local-file))
|
|
1531 x-dnd-protocol-alist))))
|
35607
|
1532
|
3591
|
1533 ;; Idiosyncratic dired commands that don't deal with marks.
|
661
|
1534
|
|
1535 (defun dired-summary ()
|
723
|
1536 "Summarize basic Dired commands and show recent Dired errors."
|
661
|
1537 (interactive)
|
723
|
1538 (dired-why)
|
661
|
1539 ;>> this should check the key-bindings and use substitute-command-keys if non-standard
|
|
1540 (message
|
3822
|
1541 "d-elete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, h-elp"))
|
661
|
1542
|
723
|
1543 (defun dired-undo ()
|
|
1544 "Undo in a dired buffer.
|
|
1545 This doesn't recover lost files, it just undoes changes in the buffer itself.
|
55970
|
1546 You can use it to recover marks, killed lines or subdirs."
|
723
|
1547 (interactive)
|
|
1548 (let (buffer-read-only)
|
55970
|
1549 (undo))
|
|
1550 (dired-build-subdir-alist)
|
|
1551 (message "Change in Dired buffer undone.
|
|
1552 Actual changes in files cannot be undone by Emacs."))
|
661
|
1553
|
|
1554 (defun dired-next-line (arg)
|
|
1555 "Move down lines then position at filename.
|
|
1556 Optional prefix ARG says how many lines to move; default is one line."
|
|
1557 (interactive "p")
|
|
1558 (next-line arg)
|
|
1559 (dired-move-to-filename))
|
|
1560
|
|
1561 (defun dired-previous-line (arg)
|
|
1562 "Move up lines then position at filename.
|
|
1563 Optional prefix ARG says how many lines to move; default is one line."
|
|
1564 (interactive "p")
|
|
1565 (previous-line arg)
|
|
1566 (dired-move-to-filename))
|
|
1567
|
723
|
1568 (defun dired-next-dirline (arg &optional opoint)
|
|
1569 "Goto ARG'th next directory file line."
|
|
1570 (interactive "p")
|
|
1571 (or opoint (setq opoint (point)))
|
|
1572 (if (if (> arg 0)
|
|
1573 (re-search-forward dired-re-dir nil t arg)
|
|
1574 (beginning-of-line)
|
|
1575 (re-search-backward dired-re-dir nil t (- arg)))
|
|
1576 (dired-move-to-filename) ; user may type `i' or `f'
|
|
1577 (goto-char opoint)
|
|
1578 (error "No more subdirectories")))
|
|
1579
|
|
1580 (defun dired-prev-dirline (arg)
|
|
1581 "Goto ARG'th previous directory file line."
|
|
1582 (interactive "p")
|
|
1583 (dired-next-dirline (- arg)))
|
|
1584
|
13033
216edf9576ea
(dired-up-directory): Add optional argument `other-window' to obviate
Erik Naggum <erik@naggum.no>
diff
changeset
|
1585 (defun dired-up-directory (&optional other-window)
|
40950
|
1586 "Run Dired on parent directory of current directory.
|
723
|
1587 Find the parent directory either in this buffer or another buffer.
|
|
1588 Creates a buffer if necessary."
|
13033
216edf9576ea
(dired-up-directory): Add optional argument `other-window' to obviate
Erik Naggum <erik@naggum.no>
diff
changeset
|
1589 (interactive "P")
|
723
|
1590 (let* ((dir (dired-current-directory))
|
|
1591 (up (file-name-directory (directory-file-name dir))))
|
|
1592 (or (dired-goto-file (directory-file-name dir))
|
1170
|
1593 ;; Only try dired-goto-subdir if buffer has more than one dir.
|
|
1594 (and (cdr dired-subdir-alist)
|
723
|
1595 (dired-goto-subdir up))
|
|
1596 (progn
|
13033
216edf9576ea
(dired-up-directory): Add optional argument `other-window' to obviate
Erik Naggum <erik@naggum.no>
diff
changeset
|
1597 (if other-window
|
216edf9576ea
(dired-up-directory): Add optional argument `other-window' to obviate
Erik Naggum <erik@naggum.no>
diff
changeset
|
1598 (dired-other-window up)
|
216edf9576ea
(dired-up-directory): Add optional argument `other-window' to obviate
Erik Naggum <erik@naggum.no>
diff
changeset
|
1599 (dired up))
|
723
|
1600 (dired-goto-file dir)))))
|
661
|
1601
|
40950
|
1602 (defun dired-get-file-for-visit ()
|
|
1603 "Get the current line's file name, with an error if file does not exist."
|
17988
|
1604 (interactive)
|
51444
|
1605 ;; We pass t for second arg so that we don't get error for `.' and `..'.
|
|
1606 (let ((raw (dired-get-filename nil t))
|
|
1607 file-name)
|
|
1608 (if (null raw)
|
|
1609 (error "No file on this line"))
|
|
1610 (setq file-name (file-name-sans-versions raw t))
|
16490
|
1611 (if (file-exists-p file-name)
|
40950
|
1612 file-name
|
18824
|
1613 (if (file-symlink-p file-name)
|
|
1614 (error "File is a symlink to a nonexistent target")
|
|
1615 (error "File no longer exists; type `g' to update Dired buffer")))))
|
661
|
1616
|
40950
|
1617 ;; Force `f' rather than `e' in the mode doc:
|
|
1618 (defalias 'dired-advertised-find-file 'dired-find-file)
|
|
1619 (defun dired-find-file ()
|
|
1620 "In Dired, visit the file or directory named on this line."
|
|
1621 (interactive)
|
51498
031a70df49c9
(dired-get-filename): Don't err for . and .. for calls from dired-add-entry.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1622 ;; Bind `find-file-run-dired' so that the command works on directories
|
50831
5565e45852d3
(dired-find-file): Bind find-file-run-dired around the call to find-file.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1623 ;; too, independent of the user's setting.
|
5565e45852d3
(dired-find-file): Bind find-file-run-dired around the call to find-file.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1624 (let ((find-file-run-dired t))
|
5565e45852d3
(dired-find-file): Bind find-file-run-dired around the call to find-file.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1625 (find-file (dired-get-file-for-visit))))
|
40950
|
1626
|
30108
|
1627 (defun dired-find-alternate-file ()
|
40950
|
1628 "In Dired, visit this file or directory instead of the dired buffer."
|
30108
|
1629 (interactive)
|
|
1630 (set-buffer-modified-p nil)
|
40950
|
1631 (find-alternate-file (dired-get-file-for-visit)))
|
46789
|
1632 ;; Don't override the setting from .emacs.
|
46759
|
1633 ;;;###autoload (put 'dired-find-alternate-file 'disabled t)
|
30108
|
1634
|
6594
|
1635 (defun dired-mouse-find-file-other-window (event)
|
40950
|
1636 "In Dired, visit the file or directory name you click on."
|
6594
|
1637 (interactive "e")
|
44764
|
1638 (let (window pos file)
|
6594
|
1639 (save-excursion
|
44764
|
1640 (setq window (posn-window (event-end event))
|
|
1641 pos (posn-point (event-end event)))
|
|
1642 (if (not (windowp window))
|
|
1643 (error "No file chosen"))
|
|
1644 (set-buffer (window-buffer window))
|
|
1645 (goto-char pos)
|
|
1646 (setq file (dired-get-file-for-visit)))
|
52369
|
1647 (if (file-directory-p file)
|
|
1648 (or (and (cdr dired-subdir-alist)
|
|
1649 (dired-goto-subdir file))
|
|
1650 (progn
|
|
1651 (select-window window)
|
|
1652 (dired-other-window file)))
|
59279
|
1653 (select-window window)
|
|
1654 (find-file-other-window (file-name-sans-versions file t)))))
|
44475
|
1655
|
661
|
1656 (defun dired-view-file ()
|
40950
|
1657 "In Dired, examine a file in view mode, returning to dired when done.
|
44475
|
1658 When file is a directory, show it in this buffer if it is inserted.
|
59279
|
1659 Otherwise, display it in another buffer."
|
661
|
1660 (interactive)
|
40950
|
1661 (let ((file (dired-get-file-for-visit)))
|
|
1662 (if (file-directory-p file)
|
|
1663 (or (and (cdr dired-subdir-alist)
|
|
1664 (dired-goto-subdir file))
|
|
1665 (dired file))
|
59279
|
1666 (view-file file))))
|
661
|
1667
|
|
1668 (defun dired-find-file-other-window ()
|
40950
|
1669 "In Dired, visit this file or directory in another window."
|
661
|
1670 (interactive)
|
40950
|
1671 (find-file-other-window (dired-get-file-for-visit)))
|
878
|
1672
|
|
1673 (defun dired-display-file ()
|
40950
|
1674 "In Dired, display this file or directory in another window."
|
878
|
1675 (interactive)
|
40950
|
1676 (display-buffer (find-file-noselect (dired-get-file-for-visit))))
|
35607
|
1677
|
40950
|
1678 ;;; Functions for extracting and manipulating file names in Dired buffers.
|
661
|
1679
|
|
1680 (defun dired-get-filename (&optional localp no-error-if-not-filep)
|
40950
|
1681 "In Dired, return name of file mentioned on this line.
|
661
|
1682 Value returned normally includes the directory name.
|
723
|
1683 Optional arg LOCALP with value `no-dir' means don't include directory
|
51539
|
1684 name in result. A value of `verbatim' means to return the name exactly as
|
|
1685 it occurs in the buffer, and a value of t means construct name relative to
|
|
1686 `default-directory', which still may contain slashes if in a subdirectory.
|
|
1687 Optional arg NO-ERROR-IF-NOT-FILEP means treat `.' and `..' as
|
|
1688 regular filenames and return nil if no filename on this line.
|
|
1689 Otherwise, an error occurs in these cases."
|
26914
|
1690 (let (case-fold-search file p1 p2 already-absolute)
|
723
|
1691 (save-excursion
|
|
1692 (if (setq p1 (dired-move-to-filename (not no-error-if-not-filep)))
|
|
1693 (setq p2 (dired-move-to-end-of-filename no-error-if-not-filep))))
|
|
1694 ;; nil if no file on this line, but no-error-if-not-filep is t:
|
10126
|
1695 (if (setq file (and p1 p2 (buffer-substring p1 p2)))
|
|
1696 (progn
|
|
1697 ;; Get rid of the mouse-face property that file names have.
|
|
1698 (set-text-properties 0 (length file) nil file)
|
|
1699 ;; Unquote names quoted by ls or by dired-insert-directory.
|
|
1700 ;; Using read to unquote is much faster than substituting
|
|
1701 ;; \007 (4 chars) -> ^G (1 char) etc. in a lisp loop.
|
|
1702 (setq file
|
|
1703 (read
|
|
1704 (concat "\""
|
47507
|
1705 ;; Some ls -b don't escape quotes, argh!
|
10126
|
1706 ;; This is not needed for GNU ls, though.
|
|
1707 (or (dired-string-replace-match
|
14387
|
1708 "\\([^\\]\\|\\`\\)\"" file "\\1\\\\\"" nil t)
|
10126
|
1709 file)
|
50197
|
1710 "\"")))
|
|
1711 ;; The above `read' will return a unibyte string if FILE
|
|
1712 ;; contains eight-bit-control/graphic characters.
|
|
1713 (if (and enable-multibyte-characters
|
|
1714 (not (multibyte-string-p file)))
|
|
1715 (setq file (string-to-multibyte file)))))
|
27051
66940eaf5c5c
(dired-get-filename): Don't call file-name-absolute-p with FILE if FILE is nil.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1716 (and file (file-name-absolute-p file)
|
38214
|
1717 ;; A relative file name can start with ~.
|
|
1718 ;; Don't treat it as absolute in this context.
|
|
1719 (not (eq (aref file 0) ?~))
|
26914
|
1720 (setq already-absolute t))
|
|
1721 (cond
|
43131
|
1722 ((null file)
|
|
1723 nil)
|
51498
031a70df49c9
(dired-get-filename): Don't err for . and .. for calls from dired-add-entry.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1724 ((eq localp 'verbatim)
|
031a70df49c9
(dired-get-filename): Don't err for . and .. for calls from dired-add-entry.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1725 file)
|
51444
|
1726 ((and (not no-error-if-not-filep)
|
55862
|
1727 (member file '("." "..")))
|
51444
|
1728 (error "Cannot operate on `.' or `..'"))
|
26914
|
1729 ((and (eq localp 'no-dir) already-absolute)
|
|
1730 (file-name-nondirectory file))
|
43131
|
1731 (already-absolute
|
47181
|
1732 (let ((handler (find-file-name-handler file nil)))
|
|
1733 ;; check for safe-magic property so that we won't
|
|
1734 ;; put /: for names that don't really need them.
|
47488
|
1735 ;; For instance, .gz files when auto-compression-mode is on.
|
47181
|
1736 (if (and handler (not (get handler 'safe-magic)))
|
|
1737 (concat "/:" file)
|
|
1738 file)))
|
43131
|
1739 ((eq localp 'no-dir)
|
26914
|
1740 file)
|
43131
|
1741 ((equal (dired-current-directory) "/")
|
|
1742 (setq file (concat (dired-current-directory localp) file))
|
47181
|
1743 (let ((handler (find-file-name-handler file nil)))
|
|
1744 ;; check for safe-magic property so that we won't
|
|
1745 ;; put /: for names that don't really need them.
|
|
1746 ;; For instance, .gz files when auto-compression-mode is on.
|
|
1747 (if (and handler (not (get handler 'safe-magic)))
|
|
1748 (concat "/:" file)
|
|
1749 file)))
|
26914
|
1750 (t
|
43131
|
1751 (concat (dired-current-directory localp) file)))))
|
723
|
1752
|
10214
|
1753 (defun dired-string-replace-match (regexp string newtext
|
51498
031a70df49c9
(dired-get-filename): Don't err for . and .. for calls from dired-add-entry.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1754 &optional literal global)
|
10214
|
1755 "Replace first match of REGEXP in STRING with NEWTEXT.
|
|
1756 If it does not match, nil is returned instead of the new string.
|
|
1757 Optional arg LITERAL means to take NEWTEXT literally.
|
|
1758 Optional arg GLOBAL means to replace all matches."
|
|
1759 (if global
|
25415
|
1760 (let ((start 0) ret)
|
12906
|
1761 (while (string-match regexp string start)
|
|
1762 (let ((from-end (- (length string) (match-end 0))))
|
25415
|
1763 (setq ret (setq string (replace-match newtext t literal string)))
|
12906
|
1764 (setq start (- (length string) from-end))))
|
25415
|
1765 ret)
|
10214
|
1766 (if (not (string-match regexp string 0))
|
|
1767 nil
|
12906
|
1768 (replace-match newtext t literal string))))
|
10214
|
1769
|
723
|
1770 (defun dired-make-absolute (file &optional dir)
|
49243
|
1771 ;;"Convert FILE (a file name relative to DIR) to an absolute file name."
|
723
|
1772 ;; We can't always use expand-file-name as this would get rid of `.'
|
|
1773 ;; or expand in / instead default-directory if DIR=="".
|
|
1774 ;; This should be good enough for ange-ftp, but might easily be
|
|
1775 ;; redefined (for VMS?).
|
|
1776 ;; It should be reasonably fast, though, as it is called in
|
|
1777 ;; dired-get-filename.
|
|
1778 (concat (or dir default-directory) file))
|
|
1779
|
16794
|
1780 (defun dired-make-relative (file &optional dir ignore)
|
|
1781 "Convert FILE (an absolute file name) to a name relative to DIR.
|
|
1782 If this is impossible, return FILE unchanged.
|
|
1783 DIR must be a directory name, not a file name."
|
723
|
1784 (or dir (setq dir default-directory))
|
5003
28ad14078b0e
(dired-chown-program): Check for irix, not silicon-graphic-unix.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1785 ;; This case comes into play if default-directory is set to
|
28ad14078b0e
(dired-chown-program): Check for irix, not silicon-graphic-unix.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1786 ;; use ~.
|
28ad14078b0e
(dired-chown-program): Check for irix, not silicon-graphic-unix.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1787 (if (and (> (length dir) 0) (= (aref dir 0) ?~))
|
28ad14078b0e
(dired-chown-program): Check for irix, not silicon-graphic-unix.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1788 (setq dir (expand-file-name dir)))
|
723
|
1789 (if (string-match (concat "^" (regexp-quote dir)) file)
|
|
1790 (substring file (match-end 0))
|
56035
|
1791 ;;; (or no-error
|
16794
|
1792 ;;; (error "%s: not in directory tree growing at %s" file dir))
|
|
1793 file))
|
35607
|
1794
|
723
|
1795 ;;; Functions for finding the file name in a dired buffer line.
|
|
1796
|
5483
|
1797 (defvar dired-move-to-filename-regexp
|
20684
|
1798 (let* ((l "\\([A-Za-z]\\|[^\0-\177]\\)")
|
51846
|
1799 (l-or-quote "\\([A-Za-z']\\|[^\0-\177]\\)")
|
20452
|
1800 ;; In some locales, month abbreviations are as short as 2 letters,
|
40818
|
1801 ;; and they can be followed by ".".
|
51846
|
1802 ;; In Breton, a month name can include a quote character.
|
|
1803 (month (concat l-or-quote l-or-quote "+\\.?"))
|
20271
|
1804 (s " ")
|
|
1805 (yyyy "[0-9][0-9][0-9][0-9]")
|
40818
|
1806 (dd "[ 0-3][0-9]")
|
54661
|
1807 (HH:MM "[ 0-2][0-9][:.][0-5][0-9]")
|
37184
|
1808 (seconds "[0-6][0-9]\\([.,][0-9]+\\)?")
|
|
1809 (zone "[-+][0-2][0-9][0-5][0-9]")
|
|
1810 (iso-mm-dd "[01][0-9]-[0-3][0-9]")
|
|
1811 (iso-time (concat HH:MM "\\(:" seconds "\\( ?" zone "\\)?\\)?"))
|
|
1812 (iso (concat "\\(\\(" yyyy "-\\)?" iso-mm-dd "[ T]" iso-time
|
40818
|
1813 "\\|" yyyy "-" iso-mm-dd "\\)"))
|
|
1814 (western (concat "\\(" month s "+" dd "\\|" dd "\\.?" s month "\\)"
|
|
1815 s "+"
|
|
1816 "\\(" HH:MM "\\|" yyyy "\\)"))
|
|
1817 (western-comma (concat month s "+" dd "," s "+" yyyy))
|
|
1818 ;; Japanese MS-Windows ls-lisp has one-digit months, and
|
|
1819 ;; omits the Kanji characters after month and day-of-month.
|
|
1820 (mm "[ 0-1]?[0-9]")
|
34505
|
1821 (japanese
|
40818
|
1822 (concat mm l "?" s dd l "?" s "+"
|
|
1823 "\\(" HH:MM "\\|" yyyy l "?" "\\)")))
|
26120
|
1824 ;; The "[0-9]" below requires the previous column to end in a digit.
|
20452
|
1825 ;; This avoids recognizing `1 may 1997' as a date in the line:
|
|
1826 ;; -r--r--r-- 1 may 1997 1168 Oct 19 16:49 README
|
49625
2c79beda1333
(dired-move-to-filename-regexp): Support "K" suffix on "ls -alh" output.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1827 ;; The "[kKMGTPEZY]?" below supports "ls -alh" output.
|
26120
|
1828 ;; The ".*" below finds the last match if there are multiple matches.
|
|
1829 ;; This avoids recognizing `jservice 10 1024' as a date in the line:
|
24333
03cf9e15c988
(dired-move-to-filename-regexp): Prepend .* so that we find the
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1830 ;; drwxr-xr-x 3 jservice 10 1024 Jul 2 1997 esg-host
|
49625
2c79beda1333
(dired-move-to-filename-regexp): Support "K" suffix on "ls -alh" output.
Juanma Barranquero <lekktu@gmail.com>
diff
changeset
|
1831 (concat ".*[0-9][kKMGTPEZY]?" s
|
40818
|
1832 "\\(" western "\\|" western-comma "\\|" japanese "\\|" iso "\\)"
|
|
1833 s "+"))
|
20452
|
1834 "Regular expression to match up to the file name in a directory listing.
|
20221
|
1835 The default value is designed to recognize dates and times
|
|
1836 regardless of the language.")
|
5483
|
1837
|
16782
|
1838 (defvar dired-permission-flags-regexp
|
|
1839 "\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)"
|
|
1840 "Regular expression to match the permission flags in `ls -l'.")
|
|
1841
|
723
|
1842 ;; Move to first char of filename on this line.
|
|
1843 ;; Returns position (point) or nil if no filename on this line."
|
|
1844 (defun dired-move-to-filename (&optional raise-error eol)
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1845 "Move to the beginning of the filename on the current line.
|
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1846 Return the position of the beginning of the filename, or nil if none found."
|
723
|
1847 ;; This is the UNIX version.
|
47507
|
1848 (or eol (setq eol (line-end-position)))
|
723
|
1849 (beginning-of-line)
|
47488
|
1850 ;; First try assuming `ls --dired' was used.
|
47507
|
1851 (let ((change (next-single-property-change (point) 'dired-filename nil eol)))
|
|
1852 (cond
|
|
1853 ((and change (< change eol))
|
|
1854 (goto-char change))
|
|
1855 ((re-search-forward dired-move-to-filename-regexp eol t)
|
|
1856 (goto-char (match-end 0)))
|
|
1857 ((re-search-forward dired-permission-flags-regexp eol t)
|
|
1858 ;; Ha! There *is* a file. Our regexp-from-hell just failed to find it.
|
57228
|
1859 (if raise-error
|
|
1860 (error "Unrecognized line! Check dired-move-to-filename-regexp"))
|
|
1861 (beginning-of-line)
|
|
1862 nil)
|
47507
|
1863 (raise-error
|
|
1864 (error "No file on this line")))))
|
723
|
1865
|
|
1866 (defun dired-move-to-end-of-filename (&optional no-error)
|
|
1867 ;; Assumes point is at beginning of filename,
|
|
1868 ;; thus the rwx bit re-search-backward below will succeed in *this*
|
|
1869 ;; line if at all. So, it should be called only after
|
|
1870 ;; (dired-move-to-filename t).
|
|
1871 ;; On failure, signals an error (with non-nil NO-ERROR just returns nil).
|
|
1872 ;; This is the UNIX version.
|
47488
|
1873 (if (get-text-property (point) 'dired-filename)
|
|
1874 (goto-char (next-single-property-change (point) 'dired-filename))
|
|
1875 (let (opoint file-type executable symlink hidden case-fold-search used-F eol)
|
|
1876 ;; case-fold-search is nil now, so we can test for capital F:
|
|
1877 (setq used-F (string-match "F" dired-actual-switches)
|
|
1878 opoint (point)
|
|
1879 eol (save-excursion (end-of-line) (point))
|
|
1880 hidden (and selective-display
|
|
1881 (save-excursion (search-forward "\r" eol t))))
|
|
1882 (if hidden
|
|
1883 nil
|
|
1884 (save-excursion ;; Find out what kind of file this is:
|
|
1885 ;; Restrict perm bits to be non-blank,
|
|
1886 ;; otherwise this matches one char to early (looking backward):
|
|
1887 ;; "l---------" (some systems make symlinks that way)
|
|
1888 ;; "----------" (plain file with zero perms)
|
|
1889 (if (re-search-backward
|
|
1890 dired-permission-flags-regexp nil t)
|
|
1891 (setq file-type (char-after (match-beginning 1))
|
|
1892 symlink (eq file-type ?l)
|
|
1893 ;; Only with -F we need to know whether it's an executable
|
|
1894 executable (and
|
|
1895 used-F
|
|
1896 (string-match
|
|
1897 "[xst]" ;; execute bit set anywhere?
|
|
1898 (concat
|
54577
|
1899 (match-string 2)
|
|
1900 (match-string 3)
|
|
1901 (match-string 4)))))
|
47488
|
1902 (or no-error (error "No file on this line"))))
|
|
1903 ;; Move point to end of name:
|
|
1904 (if symlink
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1905 (if (search-forward " -> " eol t)
|
47488
|
1906 (progn
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1907 (forward-char -4)
|
47488
|
1908 (and used-F
|
|
1909 dired-ls-F-marks-symlinks
|
|
1910 (eq (preceding-char) ?@) ;; did ls really mark the link?
|
|
1911 (forward-char -1))))
|
|
1912 (goto-char eol) ;; else not a symbolic link
|
|
1913 ;; ls -lF marks dirs, sockets and executables with exactly one
|
|
1914 ;; trailing character. (Executable bits on symlinks ain't mean
|
|
1915 ;; a thing, even to ls, but we know it's not a symlink.)
|
|
1916 (and used-F
|
|
1917 (or (memq file-type '(?d ?s))
|
|
1918 executable)
|
|
1919 (forward-char -1))))
|
|
1920 (or no-error
|
|
1921 (not (eq opoint (point)))
|
|
1922 (error (if hidden
|
|
1923 (substitute-command-keys
|
|
1924 "File line is hidden, type \\[dired-hide-subdir] to unhide")
|
|
1925 "No file on this line")))
|
|
1926 (if (eq opoint (point))
|
|
1927 nil
|
|
1928 (point)))))
|
723
|
1929
|
35607
|
1930
|
42100
|
1931 ;;; COPY NAMES OF MARKED FILES INTO KILL-RING.
|
|
1932
|
|
1933 (defun dired-copy-filename-as-kill (&optional arg)
|
|
1934 "Copy names of marked (or next ARG) files into the kill ring.
|
|
1935 The names are separated by a space.
|
49243
|
1936 With a zero prefix arg, use the absolute file name of each marked file.
|
|
1937 With \\[universal-argument], use the file name sans directory of each marked file.
|
42100
|
1938
|
|
1939 If on a subdir headerline, use subdirname instead; prefix arg is ignored
|
|
1940 in this case.
|
|
1941
|
|
1942 You can then feed the file name(s) to other commands with \\[yank]."
|
|
1943 (interactive "P")
|
|
1944 (let ((string
|
|
1945 (or (dired-get-subdir)
|
|
1946 (mapconcat (function identity)
|
|
1947 (if arg
|
|
1948 (cond ((zerop (prefix-numeric-value arg))
|
|
1949 (dired-get-marked-files))
|
|
1950 ((integerp arg)
|
|
1951 (dired-get-marked-files 'no-dir arg))
|
|
1952 (t ; else a raw arg
|
|
1953 (dired-get-marked-files t)))
|
|
1954 (dired-get-marked-files 'no-dir))
|
|
1955 " "))))
|
42594
ec991a12a82f
(dired-copy-filename-as-kill): Call kill-append if following a kill command.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1956 (if (eq last-command 'kill-region)
|
ec991a12a82f
(dired-copy-filename-as-kill): Call kill-append if following a kill command.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1957 (kill-append string nil)
|
ec991a12a82f
(dired-copy-filename-as-kill): Call kill-append if following a kill command.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1958 (kill-new string))
|
42100
|
1959 (message "%s" string)))
|
|
1960
|
|
1961
|
723
|
1962 ;; Keeping Dired buffers in sync with the filesystem and with each other
|
|
1963
|
17206
|
1964 (defun dired-buffers-for-dir (dir &optional file)
|
723
|
1965 ;; Return a list of buffers that dired DIR (top level or in-situ subdir).
|
17206
|
1966 ;; If FILE is non-nil, include only those whose wildcard pattern (if any)
|
|
1967 ;; matches FILE.
|
723
|
1968 ;; The list is in reverse order of buffer creation, most recent last.
|
|
1969 ;; As a side effect, killed dired buffers for DIR are removed from
|
|
1970 ;; dired-buffers.
|
|
1971 (setq dir (file-name-as-directory dir))
|
57264
fc40eb786614
(dired-view-command-alist): Use more efficient regexps. Remove dubious args.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
1972 (let ((alist dired-buffers) result elt buf)
|
723
|
1973 (while alist
|
8791
|
1974 (setq elt (car alist)
|
|
1975 buf (cdr elt))
|
|
1976 (if (buffer-name buf)
|
|
1977 (if (dired-in-this-tree dir (car elt))
|
17206
|
1978 (with-current-buffer buf
|
|
1979 (and (assoc dir dired-subdir-alist)
|
|
1980 (or (null file)
|
|
1981 (let ((wildcards
|
|
1982 (file-name-nondirectory dired-directory)))
|
|
1983 (or (= 0 (length wildcards))
|
|
1984 (string-match (dired-glob-regexp wildcards)
|
|
1985 file))))
|
|
1986 (setq result (cons buf result)))))
|
8791
|
1987 ;; else buffer is killed - clean up:
|
|
1988 (setq dired-buffers (delq elt dired-buffers)))
|
723
|
1989 (setq alist (cdr alist)))
|
|
1990 result))
|
|
1991
|
17206
|
1992 (defun dired-glob-regexp (pattern)
|
|
1993 "Convert glob-pattern PATTERN to a regular expression."
|
|
1994 (let ((matched-in-pattern 0) ;; How many chars of PATTERN we've handled.
|
|
1995 regexp)
|
|
1996 (while (string-match "[[?*]" pattern matched-in-pattern)
|
|
1997 (let ((op-end (match-end 0))
|
|
1998 (next-op (aref pattern (match-beginning 0))))
|
|
1999 (setq regexp (concat regexp
|
|
2000 (regexp-quote
|
|
2001 (substring pattern matched-in-pattern
|
|
2002 (match-beginning 0)))))
|
|
2003 (cond ((= next-op ??)
|
|
2004 (setq regexp (concat regexp "."))
|
|
2005 (setq matched-in-pattern op-end))
|
|
2006 ((= next-op ?\[)
|
|
2007 ;; Fails to handle ^ yet ????
|
|
2008 (let* ((set-start (match-beginning 0))
|
|
2009 (set-cont
|
|
2010 (if (= (aref pattern (1+ set-start)) ?^)
|
|
2011 (+ 3 set-start)
|
|
2012 (+ 2 set-start)))
|
|
2013 (set-end (string-match "]" pattern set-cont))
|
|
2014 (set (substring pattern set-start (1+ set-end))))
|
|
2015 (setq regexp (concat regexp set))
|
|
2016 (setq matched-in-pattern (1+ set-end))))
|
|
2017 ((= next-op ?*)
|
|
2018 (setq regexp (concat regexp ".*"))
|
|
2019 (setq matched-in-pattern op-end)))))
|
|
2020 (concat "\\`"
|
|
2021 regexp
|
|
2022 (regexp-quote
|
|
2023 (substring pattern matched-in-pattern))
|
|
2024 "\\'")))
|
|
2025
|
49549
|
2026
|
17206
|
2027
|
723
|
2028 (defun dired-advertise ()
|
|
2029 ;;"Advertise in variable `dired-buffers' that we dired `default-directory'."
|
|
2030 ;; With wildcards we actually advertise too much.
|
8791
|
2031 (let ((expanded-default (expand-file-name default-directory)))
|
|
2032 (if (memq (current-buffer) (dired-buffers-for-dir expanded-default))
|
|
2033 t ; we have already advertised ourselves
|
|
2034 (setq dired-buffers
|
|
2035 (cons (cons expanded-default (current-buffer))
|
|
2036 dired-buffers)))))
|
723
|
2037
|
|
2038 (defun dired-unadvertise (dir)
|
|
2039 ;; Remove DIR from the buffer alist in variable dired-buffers.
|
|
2040 ;; This has the effect of removing any buffer whose main directory is DIR.
|
|
2041 ;; It does not affect buffers in which DIR is a subdir.
|
|
2042 ;; Removing is also done as a side-effect in dired-buffer-for-dir.
|
|
2043 (setq dired-buffers
|
8791
|
2044 (delq (assoc (expand-file-name dir) dired-buffers) dired-buffers)))
|
35607
|
2045
|
723
|
2046 ;; Tree Dired
|
|
2047
|
|
2048 ;;; utility functions
|
|
2049
|
|
2050 (defun dired-in-this-tree (file dir)
|
|
2051 ;;"Is FILE part of the directory tree starting at DIR?"
|
|
2052 (let (case-fold-search)
|
8791
|
2053 (string-match (concat "^" (regexp-quote dir)) file)))
|
723
|
2054
|
|
2055 (defun dired-normalize-subdir (dir)
|
49243
|
2056 ;; Prepend default-directory to DIR if relative file name.
|
|
2057 ;; dired-get-filename must be able to make a valid file name from a
|
723
|
2058 ;; file and its directory DIR.
|
|
2059 (file-name-as-directory
|
|
2060 (if (file-name-absolute-p dir)
|
|
2061 dir
|
|
2062 (expand-file-name dir default-directory))))
|
|
2063
|
|
2064 (defun dired-get-subdir ()
|
|
2065 ;;"Return the subdir name on this line, or nil if not on a headerline."
|
|
2066 ;; Look up in the alist whether this is a headerline.
|
|
2067 (save-excursion
|
|
2068 (let ((cur-dir (dired-current-directory)))
|
|
2069 (beginning-of-line) ; alist stores b-o-l positions
|
|
2070 (and (zerop (- (point)
|
|
2071 (dired-get-subdir-min (assoc cur-dir
|
|
2072 dired-subdir-alist))))
|
|
2073 cur-dir))))
|
|
2074
|
|
2075 ;(defun dired-get-subdir-min (elt)
|
|
2076 ; (cdr elt))
|
|
2077 ;; can't use macro, must be redefinable for other alist format in dired-nstd.
|
2584
|
2078 (defalias 'dired-get-subdir-min 'cdr)
|
723
|
2079
|
|
2080 (defun dired-get-subdir-max (elt)
|
|
2081 (save-excursion
|
|
2082 (goto-char (dired-get-subdir-min elt))
|
|
2083 (dired-subdir-max)))
|
|
2084
|
|
2085 (defun dired-clear-alist ()
|
|
2086 (while dired-subdir-alist
|
|
2087 (set-marker (dired-get-subdir-min (car dired-subdir-alist)) nil)
|
|
2088 (setq dired-subdir-alist (cdr dired-subdir-alist))))
|
|
2089
|
1091
|
2090 (defun dired-subdir-index (dir)
|
|
2091 ;; Return an index into alist for use with nth
|
|
2092 ;; for the sake of subdir moving commands.
|
|
2093 (let (found (index 0) (alist dired-subdir-alist))
|
|
2094 (while alist
|
|
2095 (if (string= dir (car (car alist)))
|
|
2096 (setq alist nil found t)
|
|
2097 (setq alist (cdr alist) index (1+ index))))
|
|
2098 (if found index nil)))
|
|
2099
|
|
2100 (defun dired-next-subdir (arg &optional no-error-if-not-found no-skip)
|
|
2101 "Go to next subdirectory, regardless of level."
|
|
2102 ;; Use 0 arg to go to this directory's header line.
|
|
2103 ;; NO-SKIP prevents moving to end of header line, returning whatever
|
|
2104 ;; position was found in dired-subdir-alist.
|
|
2105 (interactive "p")
|
|
2106 (let ((this-dir (dired-current-directory))
|
|
2107 pos index)
|
|
2108 ;; nth with negative arg does not return nil but the first element
|
|
2109 (setq index (- (dired-subdir-index this-dir) arg))
|
|
2110 (setq pos (if (>= index 0)
|
|
2111 (dired-get-subdir-min (nth index dired-subdir-alist))))
|
|
2112 (if pos
|
|
2113 (progn
|
|
2114 (goto-char pos)
|
|
2115 (or no-skip (skip-chars-forward "^\n\r"))
|
|
2116 (point))
|
|
2117 (if no-error-if-not-found
|
|
2118 nil ; return nil if not found
|
|
2119 (error "%s directory" (if (> arg 0) "Last" "First"))))))
|
|
2120
|
39376
|
2121 (defun dired-build-subdir-alist (&optional switches)
|
723
|
2122 "Build `dired-subdir-alist' by parsing the buffer.
|
39376
|
2123 Returns the new value of the alist.
|
|
2124 If optional arg SWITCHES is non-nil, use its value
|
|
2125 instead of `dired-actual-switches'."
|
723
|
2126 (interactive)
|
|
2127 (dired-clear-alist)
|
|
2128 (save-excursion
|
39376
|
2129 (let* ((count 0)
|
|
2130 (buffer-read-only nil)
|
60097
|
2131 (buffer-undo-list t)
|
39376
|
2132 (switches (or switches dired-actual-switches))
|
|
2133 new-dir-name
|
|
2134 (R-ftp-base-dir-regex
|
|
2135 ;; Used to expand subdirectory names correctly in recursive
|
|
2136 ;; ange-ftp listings.
|
|
2137 (and (string-match "R" switches)
|
|
2138 (string-match "\\`/.*:\\(/.*\\)" default-directory)
|
|
2139 (concat "\\`" (match-string 1 default-directory)))))
|
723
|
2140 (goto-char (point-min))
|
|
2141 (setq dired-subdir-alist nil)
|
7918
|
2142 (while (and (re-search-forward dired-subdir-regexp nil t)
|
|
2143 ;; Avoid taking a file name ending in a colon
|
|
2144 ;; as a subdir name.
|
|
2145 (not (save-excursion
|
|
2146 (goto-char (match-beginning 0))
|
|
2147 (beginning-of-line)
|
|
2148 (forward-char 2)
|
7945
db1785b91d03
(dired-build-subdir-alist): Don't let looking-at destroy the match data.
Karl Heuer <kwzh@gnu.org>
diff
changeset
|
2149 (save-match-data (looking-at dired-re-perms)))))
|
4760
|
2150 (save-excursion
|
|
2151 (goto-char (match-beginning 1))
|
|
2152 (setq new-dir-name
|
30521
|
2153 (buffer-substring-no-properties (point) (match-end 1))
|
|
2154 new-dir-name
|
|
2155 (save-match-data
|
|
2156 (if (and R-ftp-base-dir-regex
|
|
2157 (not (string= new-dir-name default-directory))
|
|
2158 (string-match R-ftp-base-dir-regex new-dir-name))
|
|
2159 (concat default-directory
|
|
2160 (substring new-dir-name (match-end 0)))
|
|
2161 (expand-file-name new-dir-name))))
|
4760
|
2162 (delete-region (point) (match-end 1))
|
|
2163 (insert new-dir-name))
|
723
|
2164 (setq count (1+ count))
|
4760
|
2165 (dired-alist-add-1 new-dir-name
|
|
2166 ;; Place a sub directory boundary between lines.
|
|
2167 (save-excursion
|
|
2168 (goto-char (match-beginning 0))
|
|
2169 (beginning-of-line)
|
|
2170 (point-marker))))
|
55937
|
2171 (if (and (> count 1) (interactive-p))
|
1091
|
2172 (message "Buffer includes %d directories" count))
|
723
|
2173 ;; We don't need to sort it because it is in buffer order per
|
|
2174 ;; constructionem. Return new alist:
|
|
2175 dired-subdir-alist)))
|
|
2176
|
|
2177 (defun dired-alist-add-1 (dir new-marker)
|
|
2178 ;; Add new DIR at NEW-MARKER. Don't sort.
|
|
2179 (setq dired-subdir-alist
|
|
2180 (cons (cons (dired-normalize-subdir dir) new-marker)
|
|
2181 dired-subdir-alist)))
|
|
2182
|
|
2183 (defun dired-goto-next-nontrivial-file ()
|
|
2184 ;; Position point on first nontrivial file after point.
|
|
2185 (dired-goto-next-file);; so there is a file to compare with
|
|
2186 (if (stringp dired-trivial-filenames)
|
|
2187 (while (and (not (eobp))
|
|
2188 (string-match dired-trivial-filenames
|
|
2189 (file-name-nondirectory
|
|
2190 (or (dired-get-filename nil t) ""))))
|
|
2191 (forward-line 1)
|
|
2192 (dired-move-to-filename))))
|
|
2193
|
|
2194 (defun dired-goto-next-file ()
|
|
2195 (let ((max (1- (dired-subdir-max))))
|
|
2196 (while (and (not (dired-move-to-filename)) (< (point) max))
|
|
2197 (forward-line 1))))
|
|
2198
|
|
2199 (defun dired-goto-file (file)
|
|
2200 "Go to file line of FILE in this dired buffer."
|
|
2201 ;; Return value of point on success, else nil.
|
49243
|
2202 ;; FILE must be an absolute file name.
|
723
|
2203 ;; Loses if FILE contains control chars like "\007" for which ls
|
|
2204 ;; either inserts "?" or "\\007" into the buffer, so we won't find
|
|
2205 ;; it in the buffer.
|
|
2206 (interactive
|
|
2207 (prog1 ; let push-mark display its message
|
|
2208 (list (expand-file-name
|
|
2209 (read-file-name "Goto file: "
|
|
2210 (dired-current-directory))))
|
|
2211 (push-mark)))
|
|
2212 (setq file (directory-file-name file)) ; does no harm if no directory
|
|
2213 (let (found case-fold-search dir)
|
|
2214 (setq dir (or (file-name-directory file)
|
48986
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2215 (error "File name `%s' is not absolute" file)))
|
661
|
2216 (save-excursion
|
723
|
2217 ;; The hair here is to get the result of dired-goto-subdir
|
|
2218 ;; without really calling it if we don't have any subdirs.
|
5299
|
2219 (if (if (string= dir (expand-file-name default-directory))
|
723
|
2220 (goto-char (point-min))
|
1170
|
2221 (and (cdr dired-subdir-alist)
|
723
|
2222 (dired-goto-subdir dir)))
|
|
2223 (let ((base (file-name-nondirectory file))
|
48986
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2224 search-string
|
723
|
2225 (boundary (dired-subdir-max)))
|
48986
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2226 (setq search-string
|
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2227 (replace-regexp-in-string "\^m" "\\^m" base nil t))
|
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2228 (setq search-string
|
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2229 (replace-regexp-in-string "\\\\" "\\\\" search-string nil t))
|
723
|
2230 (while (and (not found)
|
|
2231 ;; filenames are preceded by SPC, this makes
|
|
2232 ;; the search faster (e.g. for the filename "-"!).
|
48986
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2233 (search-forward (concat " " search-string)
|
5f0ef23b7e51
(dired-goto-file): Handle \ and ^M quoted by backslash. Fix error message.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2234 boundary 'move))
|
723
|
2235 ;; Match could have BASE just as initial substring or
|
|
2236 ;; or in permission bits or date or
|
|
2237 ;; not be a proper filename at all:
|
|
2238 (if (equal base (dired-get-filename 'no-dir t))
|
|
2239 ;; Must move to filename since an (actually
|
|
2240 ;; correct) match could have been elsewhere on the
|
|
2241 ;; ;; line (e.g. "-" would match somewhere in the
|
|
2242 ;; permission bits).
|
5115
|
2243 (setq found (dired-move-to-filename))
|
|
2244 ;; If this isn't the right line, move forward to avoid
|
|
2245 ;; trying this line again.
|
|
2246 (forward-line 1))))))
|
723
|
2247 (and found
|
|
2248 ;; return value of point (i.e., FOUND):
|
|
2249 (goto-char found))))
|
|
2250
|
|
2251 (defun dired-initial-position (dirname)
|
|
2252 ;; Where point should go in a new listing of DIRNAME.
|
|
2253 ;; Point assumed at beginning of new subdir line.
|
|
2254 ;; You may redefine this function as you wish, e.g. like in dired-x.el.
|
|
2255 (end-of-line)
|
|
2256 (if dired-trivial-filenames (dired-goto-next-nontrivial-file)))
|
35607
|
2257
|
723
|
2258 ;; These are hooks which make tree dired work.
|
|
2259 ;; They are in this file because other parts of dired need to call them.
|
|
2260 ;; But they don't call the rest of tree dired unless there are subdirs loaded.
|
|
2261
|
|
2262 ;; This function is called for each retrieved filename.
|
|
2263 ;; It could stand to be faster, though it's mostly function call
|
|
2264 ;; overhead. Avoiding the function call seems to save about 10% in
|
|
2265 ;; dired-get-filename. Make it a defsubst?
|
|
2266 (defun dired-current-directory (&optional localp)
|
|
2267 "Return the name of the subdirectory to which this line belongs.
|
|
2268 This returns a string with trailing slash, like `default-directory'.
|
|
2269 Optional argument means return a file name relative to `default-directory'."
|
|
2270 (let ((here (point))
|
|
2271 (alist (or dired-subdir-alist
|
|
2272 ;; probably because called in a non-dired buffer
|
|
2273 (error "No subdir-alist in %s" (current-buffer))))
|
|
2274 elt dir)
|
|
2275 (while alist
|
|
2276 (setq elt (car alist)
|
|
2277 dir (car elt)
|
|
2278 ;; use `<=' (not `<') as subdir line is part of subdir
|
|
2279 alist (if (<= (dired-get-subdir-min elt) here)
|
|
2280 nil ; found
|
|
2281 (cdr alist))))
|
|
2282 (if localp
|
|
2283 (dired-make-relative dir default-directory)
|
|
2284 dir)))
|
|
2285
|
|
2286 ;; Subdirs start at the beginning of their header lines and end just
|
|
2287 ;; before the beginning of the next header line (or end of buffer).
|
|
2288
|
|
2289 (defun dired-subdir-max ()
|
|
2290 (save-excursion
|
1170
|
2291 (if (or (null (cdr dired-subdir-alist)) (not (dired-next-subdir 1 t t)))
|
723
|
2292 (point-max)
|
|
2293 (point))))
|
35607
|
2294
|
723
|
2295 ;; Deleting files
|
|
2296
|
25731
|
2297 (defcustom dired-recursive-deletes nil ; Default only delete empty directories.
|
|
2298 "*Decide whether recursive deletes are allowed.
|
42206
|
2299 nil means no recursive deletes.
|
25731
|
2300 `always' means delete recursively without asking. This is DANGEROUS!
|
|
2301 `top' means ask for each directory at top level, but delete its subdirectories
|
|
2302 without asking.
|
|
2303 Anything else means ask for each directory."
|
49068
|
2304 :type '(choice :tag "Delete non-empty directories"
|
|
2305 (const :tag "Yes" always)
|
|
2306 (const :tag "No--only delete empty directories" nil)
|
|
2307 (const :tag "Confirm for each directory" t)
|
|
2308 (const :tag "Confirm for each top directory only" top))
|
25731
|
2309 :group 'dired)
|
|
2310
|
49549
|
2311 ;; Match anything but `.' and `..'.
|
25731
|
2312 (defvar dired-re-no-dot "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")
|
|
2313
|
|
2314 ;; Delete file, possibly delete a directory and all its files.
|
|
2315 ;; This function is usefull outside of dired. One could change it's name
|
|
2316 ;; to e.g. recursive-delete-file and put it somewhere else.
|
|
2317 (defun dired-delete-file (file &optional recursive) "\
|
|
2318 Delete FILE or directory (possibly recursively if optional RECURSIVE is true.)
|
|
2319 RECURSIVE determines what to do with a non-empty directory. If RECURSIVE is:
|
|
2320 Nil, do not delete.
|
|
2321 `always', delete recursively without asking.
|
|
2322 `top', ask for each directory at top level.
|
|
2323 Anything else, ask for each sub-directory."
|
|
2324 (let (files)
|
|
2325 ;; This test is equivalent to
|
|
2326 ;; (and (file-directory-p fn) (not (file-symlink-p fn)))
|
|
2327 ;; but more efficient
|
|
2328 (if (not (eq t (car (file-attributes file))))
|
|
2329 (delete-file file)
|
|
2330 (when (and recursive
|
|
2331 (setq files
|
|
2332 (directory-files file t dired-re-no-dot)) ; Not empty.
|
|
2333 (or (eq recursive 'always)
|
|
2334 (yes-or-no-p (format "Recursive delete of %s "
|
|
2335 (dired-make-relative file)))))
|
|
2336 (if (eq recursive 'top) (setq recursive 'always)) ; Don't ask again.
|
|
2337 (while files ; Recursively delete (possibly asking).
|
|
2338 (dired-delete-file (car files) recursive)
|
|
2339 (setq files (cdr files))))
|
|
2340 (delete-directory file))))
|
|
2341
|
12736
|
2342 (defun dired-do-flagged-delete (&optional nomessage)
|
40950
|
2343 "In Dired, delete the files flagged for deletion.
|
12736
|
2344 If NOMESSAGE is non-nil, we don't display any message
|
|
2345 if there are no flagged files."
|
723
|
2346 (interactive)
|
|
2347 (let* ((dired-marker-char dired-del-marker)
|
|
2348 (regexp (dired-marker-regexp))
|
|
2349 case-fold-search)
|
|
2350 (if (save-excursion (goto-char (point-min))
|
|
2351 (re-search-forward regexp nil t))
|
|
2352 (dired-internal-do-deletions
|
|
2353 ;; this can't move point since ARG is nil
|
|
2354 (dired-map-over-marks (cons (dired-get-filename) (point))
|
|
2355 nil)
|
|
2356 nil)
|
12736
|
2357 (or nomessage
|
|
2358 (message "(No deletions requested)")))))
|
723
|
2359
|
|
2360 (defun dired-do-delete (&optional arg)
|
|
2361 "Delete all marked (or next ARG) files."
|
|
2362 ;; This is more consistent with the file marking feature than
|
|
2363 ;; dired-do-flagged-delete.
|
|
2364 (interactive "P")
|
|
2365 (dired-internal-do-deletions
|
|
2366 ;; this may move point if ARG is an integer
|
|
2367 (dired-map-over-marks (cons (dired-get-filename) (point))
|
|
2368 arg)
|
|
2369 arg))
|
|
2370
|
|
2371 (defvar dired-deletion-confirmer 'yes-or-no-p) ; or y-or-n-p?
|
|
2372
|
|
2373 (defun dired-internal-do-deletions (l arg)
|
|
2374 ;; L is an alist of files to delete, with their buffer positions.
|
|
2375 ;; ARG is the prefix arg.
|
|
2376 ;; Filenames are absolute (VMS needs this for logical search paths).
|
|
2377 ;; (car L) *must* be the *last* (bottommost) file in the dired buffer.
|
|
2378 ;; That way as changes are made in the buffer they do not shift the
|
|
2379 ;; lines still to be changed, so the (point) values in L stay valid.
|
|
2380 ;; Also, for subdirs in natural order, a subdir's files are deleted
|
|
2381 ;; before the subdir itself - the other way around would not work.
|
|
2382 (let ((files (mapcar (function car) l))
|
|
2383 (count (length l))
|
|
2384 (succ 0))
|
|
2385 ;; canonicalize file list for pop up
|
|
2386 (setq files (nreverse (mapcar (function dired-make-relative) files)))
|
|
2387 (if (dired-mark-pop-up
|
|
2388 " *Deletions*" 'delete files dired-deletion-confirmer
|
|
2389 (format "Delete %s " (dired-mark-prompt arg files)))
|
|
2390 (save-excursion
|
|
2391 (let (failures);; files better be in reverse order for this loop!
|
|
2392 (while l
|
|
2393 (goto-char (cdr (car l)))
|
|
2394 (let (buffer-read-only)
|
|
2395 (condition-case err
|
|
2396 (let ((fn (car (car l))))
|
25731
|
2397 (dired-delete-file fn dired-recursive-deletes)
|
723
|
2398 ;; if we get here, removing worked
|
|
2399 (setq succ (1+ succ))
|
|
2400 (message "%s of %s deletions" succ count)
|
43903
|
2401 (dired-fun-in-all-buffers
|
|
2402 (file-name-directory fn) (file-name-nondirectory fn)
|
|
2403 (function dired-delete-entry) fn))
|
723
|
2404 (error;; catch errors from failed deletions
|
|
2405 (dired-log "%s\n" err)
|
|
2406 (setq failures (cons (car (car l)) failures)))))
|
|
2407 (setq l (cdr l)))
|
|
2408 (if (not failures)
|
|
2409 (message "%d deletion%s done" count (dired-plural-s count))
|
|
2410 (dired-log-summary
|
|
2411 (format "%d of %d deletion%s failed"
|
|
2412 (length failures) count
|
|
2413 (dired-plural-s count))
|
|
2414 failures))))
|
|
2415 (message "(No deletions performed)")))
|
|
2416 (dired-move-to-filename))
|
|
2417
|
43903
|
2418 (defun dired-fun-in-all-buffers (directory file fun &rest args)
|
|
2419 ;; In all buffers dired'ing DIRECTORY, run FUN with ARGS.
|
|
2420 ;; If the buffer has a wildcard pattern, check that it matches FILE.
|
|
2421 ;; (FILE does not include a directory component.)
|
|
2422 ;; FILE may be nil, in which case ignore it.
|
|
2423 ;; Return list of buffers where FUN succeeded (i.e., returned non-nil).
|
|
2424 (let (success-list)
|
|
2425 (dolist (buf (dired-buffers-for-dir (expand-file-name directory)
|
|
2426 file))
|
|
2427 (with-current-buffer buf
|
|
2428 (if (apply fun args)
|
|
2429 (setq success-list (cons (buffer-name buf) success-list)))))
|
|
2430 success-list))
|
|
2431
|
49549
|
2432 ;; Delete the entry for FILE from
|
43903
|
2433 (defun dired-delete-entry (file)
|
|
2434 (save-excursion
|
|
2435 (and (dired-goto-file file)
|
|
2436 (let (buffer-read-only)
|
|
2437 (delete-region (progn (beginning-of-line) (point))
|
|
2438 (save-excursion (forward-line 1) (point))))))
|
|
2439 (dired-clean-up-after-deletion file))
|
|
2440
|
723
|
2441 ;; This is a separate function for the sake of dired-x.el.
|
|
2442 (defun dired-clean-up-after-deletion (fn)
|
|
2443 ;; Clean up after a deleted file or directory FN.
|
1170
|
2444 (save-excursion (and (cdr dired-subdir-alist)
|
|
2445 (dired-goto-subdir fn)
|
723
|
2446 (dired-kill-subdir))))
|
35607
|
2447
|
723
|
2448 ;; Confirmation
|
|
2449
|
|
2450 (defun dired-marker-regexp ()
|
|
2451 (concat "^" (regexp-quote (char-to-string dired-marker-char))))
|
|
2452
|
|
2453 (defun dired-plural-s (count)
|
|
2454 (if (= 1 count) "" "s"))
|
|
2455
|
|
2456 (defun dired-mark-prompt (arg files)
|
|
2457 ;; Return a string for use in a prompt, either the current file
|
|
2458 ;; name, or the marker and a count of marked files.
|
|
2459 (let ((count (length files)))
|
|
2460 (if (= count 1)
|
|
2461 (car files)
|
|
2462 ;; more than 1 file:
|
|
2463 (if (integerp arg)
|
|
2464 ;; abs(arg) = count
|
|
2465 ;; Perhaps this is nicer, but it also takes more screen space:
|
|
2466 ;;(format "[%s %d files]" (if (> arg 0) "next" "previous")
|
|
2467 ;; count)
|
|
2468 (format "[next %d files]" arg)
|
|
2469 (format "%c [%d files]" dired-marker-char count)))))
|
|
2470
|
|
2471 (defun dired-pop-to-buffer (buf)
|
|
2472 ;; Pop up buffer BUF.
|
|
2473 ;; If dired-shrink-to-fit is t, make its window fit its contents.
|
|
2474 (if (not dired-shrink-to-fit)
|
|
2475 (pop-to-buffer (get-buffer-create buf))
|
|
2476 ;; let window shrink to fit:
|
|
2477 (let ((window (selected-window))
|
|
2478 target-lines w2)
|
44061
|
2479 (cond ;; if split-height-threshold is enabled, use the largest window
|
723
|
2480 ((and (> (window-height (setq w2 (get-largest-window)))
|
|
2481 split-height-threshold)
|
778
|
2482 (= (frame-width) (window-width w2)))
|
723
|
2483 (setq window w2))
|
|
2484 ;; if the least-recently-used window is big enough, use it
|
|
2485 ((and (> (window-height (setq w2 (get-lru-window)))
|
|
2486 (* 2 window-min-height))
|
778
|
2487 (= (frame-width) (window-width w2)))
|
723
|
2488 (setq window w2)))
|
|
2489 (save-excursion
|
|
2490 (set-buffer buf)
|
|
2491 (goto-char (point-max))
|
|
2492 (skip-chars-backward "\n\r\t ")
|
2466
|
2493 (setq target-lines (count-lines (point-min) (point)))
|
|
2494 ;; Don't forget to count the last line.
|
|
2495 (if (not (bolp))
|
|
2496 (setq target-lines (1+ target-lines))))
|
723
|
2497 (if (<= (window-height window) (* 2 window-min-height))
|
778
|
2498 ;; At this point, every window on the frame is too small to split.
|
723
|
2499 (setq w2 (display-buffer buf))
|
|
2500 (setq w2 (split-window window
|
|
2501 (max window-min-height
|
|
2502 (- (window-height window)
|
|
2503 (1+ (max window-min-height target-lines)))))))
|
|
2504 (set-window-buffer w2 buf)
|
|
2505 (if (< (1- (window-height w2)) target-lines)
|
|
2506 (progn
|
|
2507 (select-window w2)
|
|
2508 (enlarge-window (- target-lines (1- (window-height w2))))))
|
|
2509 (set-window-start w2 1)
|
|
2510 )))
|
661
|
2511
|
723
|
2512 (defvar dired-no-confirm nil
|
17198
|
2513 "A list of symbols for commands dired should not confirm.
|
|
2514 Command symbols are `byte-compile', `chgrp', `chmod', `chown', `compress',
|
54663
|
2515 `copy', `delete', `hardlink', `load', `move', `print', `shell', `symlink',
|
|
2516 `touch' and `uncompress'.")
|
723
|
2517
|
|
2518 (defun dired-mark-pop-up (bufname op-symbol files function &rest args)
|
47544
|
2519 "Return FUNCTION's result on ARGS after showing which files are marked.
|
|
2520 Displays the file names in a buffer named BUFNAME;
|
|
2521 nil gives \" *Marked Files*\".
|
|
2522 This uses function `dired-pop-to-buffer' to do that.
|
|
2523
|
|
2524 FUNCTION should not manipulate files, just read input
|
|
2525 (an argument or confirmation).
|
32149
504f15a7d36d
(dired-mark-pop-up): Turn comment into docstring. Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
2526 The window is not shown if there is just one file or
|
504f15a7d36d
(dired-mark-pop-up): Turn comment into docstring. Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
2527 OP-SYMBOL is a member of the list in `dired-no-confirm'.
|
504f15a7d36d
(dired-mark-pop-up): Turn comment into docstring. Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
2528 FILES is the list of marked files."
|
723
|
2529 (or bufname (setq bufname " *Marked Files*"))
|
17198
|
2530 (if (or (eq dired-no-confirm t)
|
|
2531 (memq op-symbol dired-no-confirm)
|
723
|
2532 (= (length files) 1))
|
|
2533 (apply function args)
|
32149
504f15a7d36d
(dired-mark-pop-up): Turn comment into docstring. Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
2534 (with-current-buffer (get-buffer-create bufname)
|
723
|
2535 (erase-buffer)
|
7609
|
2536 (dired-format-columns-of-files files)
|
38091
|
2537 (remove-text-properties (point-min) (point-max)
|
|
2538 '(mouse-face nil help-echo nil)))
|
723
|
2539 (save-window-excursion
|
|
2540 (dired-pop-to-buffer bufname)
|
|
2541 (apply function args))))
|
|
2542
|
|
2543 (defun dired-format-columns-of-files (files)
|
|
2544 ;; Files should be in forward order for this loop.
|
|
2545 ;; i.e., (car files) = first file in buffer.
|
|
2546 ;; Returns the number of lines used.
|
|
2547 (let* ((maxlen (+ 2 (apply 'max (mapcar 'length files))))
|
|
2548 (width (- (window-width (selected-window)) 2))
|
|
2549 (columns (max 1 (/ width maxlen)))
|
|
2550 (nfiles (length files))
|
|
2551 (rows (+ (/ nfiles columns)
|
|
2552 (if (zerop (% nfiles columns)) 0 1)))
|
|
2553 (i 0)
|
|
2554 (j 0))
|
|
2555 (setq files (nconc (copy-sequence files) ; fill up with empty fns
|
|
2556 (make-list (- (* columns rows) nfiles) "")))
|
|
2557 (setcdr (nthcdr (1- (length files)) files) files) ; make circular
|
|
2558 (while (< j rows)
|
|
2559 (while (< i columns)
|
|
2560 (indent-to (* i maxlen))
|
|
2561 (insert (car files))
|
|
2562 (setq files (nthcdr rows files)
|
|
2563 i (1+ i)))
|
|
2564 (insert "\n")
|
|
2565 (setq i 0
|
|
2566 j (1+ j)
|
|
2567 files (cdr files)))
|
|
2568 rows))
|
35607
|
2569
|
723
|
2570 ;; Commands to mark or flag file(s) at or near current line.
|
|
2571
|
|
2572 (defun dired-repeat-over-lines (arg function)
|
|
2573 ;; This version skips non-file lines.
|
3737
|
2574 (let ((pos (make-marker)))
|
661
|
2575 (beginning-of-line)
|
3737
|
2576 (while (and (> arg 0) (not (eobp)))
|
|
2577 (setq arg (1- arg))
|
|
2578 (beginning-of-line)
|
|
2579 (while (and (not (eobp)) (dired-between-files)) (forward-line 1))
|
|
2580 (save-excursion
|
|
2581 (forward-line 1)
|
|
2582 (move-marker pos (1+ (point))))
|
|
2583 (save-excursion (funcall function))
|
|
2584 ;; Advance to the next line--actually, to the line that *was* next.
|
|
2585 ;; (If FUNCTION inserted some new lines in between, skip them.)
|
|
2586 (goto-char pos))
|
|
2587 (while (and (< arg 0) (not (bobp)))
|
|
2588 (setq arg (1+ arg))
|
|
2589 (forward-line -1)
|
|
2590 (while (and (not (bobp)) (dired-between-files)) (forward-line -1))
|
|
2591 (beginning-of-line)
|
|
2592 (save-excursion (funcall function)))
|
|
2593 (move-marker pos nil)
|
|
2594 (dired-move-to-filename)))
|
723
|
2595
|
|
2596 (defun dired-between-files ()
|
53284
|
2597 ;; This used to be a regexp match of the `total ...' line output by
|
|
2598 ;; ls, which is slightly faster, but that is not very robust; notably,
|
|
2599 ;; it fails for non-english locales.
|
|
2600 (save-excursion (not (dired-move-to-filename))))
|
723
|
2601
|
|
2602 (defun dired-next-marked-file (arg &optional wrap opoint)
|
|
2603 "Move to the next marked file, wrapping around the end of the buffer."
|
|
2604 (interactive "p\np")
|
|
2605 (or opoint (setq opoint (point)));; return to where interactively started
|
|
2606 (if (if (> arg 0)
|
|
2607 (re-search-forward dired-re-mark nil t arg)
|
|
2608 (beginning-of-line)
|
|
2609 (re-search-backward dired-re-mark nil t (- arg)))
|
|
2610 (dired-move-to-filename)
|
|
2611 (if (null wrap)
|
661
|
2612 (progn
|
723
|
2613 (goto-char opoint)
|
|
2614 (error "No next marked file"))
|
|
2615 (message "(Wraparound for next marked file)")
|
|
2616 (goto-char (if (> arg 0) (point-min) (point-max)))
|
|
2617 (dired-next-marked-file arg nil opoint))))
|
|
2618
|
|
2619 (defun dired-prev-marked-file (arg &optional wrap)
|
|
2620 "Move to the previous marked file, wrapping around the end of the buffer."
|
|
2621 (interactive "p\np")
|
|
2622 (dired-next-marked-file (- arg) wrap))
|
|
2623
|
|
2624 (defun dired-file-marker (file)
|
|
2625 ;; Return FILE's marker, or nil if unmarked.
|
|
2626 (save-excursion
|
|
2627 (and (dired-goto-file file)
|
|
2628 (progn
|
|
2629 (beginning-of-line)
|
|
2630 (if (not (equal ?\040 (following-char)))
|
|
2631 (following-char))))))
|
661
|
2632
|
723
|
2633 (defun dired-mark-files-in-region (start end)
|
|
2634 (let (buffer-read-only)
|
|
2635 (if (> start end)
|
|
2636 (error "start > end"))
|
|
2637 (goto-char start) ; assumed at beginning of line
|
|
2638 (while (< (point) end)
|
|
2639 ;; Skip subdir line and following garbage like the `total' line:
|
|
2640 (while (and (< (point) end) (dired-between-files))
|
|
2641 (forward-line 1))
|
|
2642 (if (and (not (looking-at dired-re-dot))
|
|
2643 (dired-get-filename nil t))
|
|
2644 (progn
|
|
2645 (delete-char 1)
|
|
2646 (insert dired-marker-char)))
|
|
2647 (forward-line 1))))
|
|
2648
|
|
2649 (defun dired-mark (arg)
|
|
2650 "Mark the current (or next ARG) files.
|
|
2651 If on a subdir headerline, mark all its files except `.' and `..'.
|
|
2652
|
|
2653 Use \\[dired-unmark-all-files] to remove all marks
|
|
2654 and \\[dired-unmark] on a subdir to remove the marks in
|
|
2655 this subdir."
|
|
2656 (interactive "P")
|
10710
|
2657 (if (dired-get-subdir)
|
723
|
2658 (save-excursion (dired-mark-subdir-files))
|
|
2659 (let (buffer-read-only)
|
|
2660 (dired-repeat-over-lines
|
834
|
2661 (prefix-numeric-value arg)
|
723
|
2662 (function (lambda () (delete-char 1) (insert dired-marker-char)))))))
|
|
2663
|
|
2664 (defun dired-unmark (arg)
|
|
2665 "Unmark the current (or next ARG) files.
|
|
2666 If looking at a subdir, unmark all its files except `.' and `..'."
|
|
2667 (interactive "P")
|
|
2668 (let ((dired-marker-char ?\040))
|
|
2669 (dired-mark arg)))
|
|
2670
|
|
2671 (defun dired-flag-file-deletion (arg)
|
40950
|
2672 "In Dired, flag the current line's file for deletion.
|
723
|
2673 With prefix arg, repeat over several lines.
|
|
2674
|
|
2675 If on a subdir headerline, mark all its files except `.' and `..'."
|
|
2676 (interactive "P")
|
|
2677 (let ((dired-marker-char dired-del-marker))
|
|
2678 (dired-mark arg)))
|
|
2679
|
|
2680 (defun dired-unmark-backward (arg)
|
40950
|
2681 "In Dired, move up lines and remove deletion flag there.
|
723
|
2682 Optional prefix ARG says how many lines to unflag; default is one line."
|
|
2683 (interactive "p")
|
|
2684 (dired-unmark (- arg)))
|
20991
|
2685
|
44212
e87d819f2887
(dired-toggle-marks): Renamed from dired-do-toggle. Bindings changed.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2686 (defun dired-toggle-marks ()
|
e87d819f2887
(dired-toggle-marks): Renamed from dired-do-toggle. Bindings changed.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2687 "Toggle marks: marked files become unmarked, and vice versa.
|
20991
|
2688 Files marked with other flags (such as `D') are not affected.
|
|
2689 `.' and `..' are never toggled.
|
|
2690 As always, hidden subdirs are not affected."
|
|
2691 (interactive)
|
|
2692 (save-excursion
|
|
2693 (goto-char (point-min))
|
|
2694 (let (buffer-read-only)
|
|
2695 (while (not (eobp))
|
|
2696 (or (dired-between-files)
|
|
2697 (looking-at dired-re-dot)
|
|
2698 ;; use subst instead of insdel because it does not move
|
|
2699 ;; the gap and thus should be faster and because
|
|
2700 ;; other characters are left alone automatically
|
|
2701 (apply 'subst-char-in-region
|
|
2702 (point) (1+ (point))
|
|
2703 (if (eq ?\040 (following-char)) ; SPC
|
|
2704 (list ?\040 dired-marker-char)
|
|
2705 (list dired-marker-char ?\040))))
|
|
2706 (forward-line 1)))))
|
35607
|
2707
|
723
|
2708 ;;; Commands to mark or flag files based on their characteristics or names.
|
|
2709
|
1755
|
2710 (defvar dired-regexp-history nil
|
|
2711 "History list of regular expressions used in Dired commands.")
|
|
2712
|
|
2713 (defun dired-read-regexp (prompt)
|
|
2714 (read-from-minibuffer prompt nil nil nil 'dired-regexp-history))
|
723
|
2715
|
|
2716 (defun dired-mark-files-regexp (regexp &optional marker-char)
|
|
2717 "Mark all files matching REGEXP for use in later commands.
|
|
2718 A prefix argument means to unmark them instead.
|
|
2719 `.' and `..' are never marked.
|
|
2720
|
|
2721 REGEXP is an Emacs regexp, not a shell wildcard. Thus, use `\\.o$' for
|
|
2722 object files--just `.o' will mark more than you might think."
|
|
2723 (interactive
|
|
2724 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
|
|
2725 " files (regexp): "))
|
|
2726 (if current-prefix-arg ?\040)))
|
|
2727 (let ((dired-marker-char (or marker-char dired-marker-char)))
|
|
2728 (dired-mark-if
|
|
2729 (and (not (looking-at dired-re-dot))
|
|
2730 (not (eolp)) ; empty line
|
|
2731 (let ((fn (dired-get-filename nil t)))
|
|
2732 (and fn (string-match regexp (file-name-nondirectory fn)))))
|
|
2733 "matching file")))
|
|
2734
|
22206
|
2735 (defun dired-mark-files-containing-regexp (regexp &optional marker-char)
|
|
2736 "Mark all files with contents containing REGEXP for use in later commands.
|
|
2737 A prefix argument means to unmark them instead.
|
|
2738 `.' and `..' are never marked."
|
|
2739 (interactive
|
|
2740 (list (dired-read-regexp (concat (if current-prefix-arg "Unmark" "Mark")
|
|
2741 " files containing (regexp): "))
|
|
2742 (if current-prefix-arg ?\040)))
|
|
2743 (let ((dired-marker-char (or marker-char dired-marker-char)))
|
|
2744 (dired-mark-if
|
|
2745 (and (not (looking-at dired-re-dot))
|
|
2746 (not (eolp)) ; empty line
|
|
2747 (let ((fn (dired-get-filename nil t)))
|
23230
|
2748 (when (and fn (file-readable-p fn)
|
|
2749 (not (file-directory-p fn)))
|
|
2750 (let ((prebuf (get-file-buffer fn)))
|
|
2751 (message "Checking %s" fn)
|
|
2752 ;; For now we do it inside emacs
|
|
2753 ;; Grep might be better if there are a lot of files
|
|
2754 (if prebuf
|
|
2755 (with-current-buffer prebuf
|
|
2756 (save-excursion
|
|
2757 (goto-char (point-min))
|
|
2758 (re-search-forward regexp nil t)))
|
|
2759 (with-temp-buffer
|
|
2760 (insert-file-contents fn)
|
|
2761 (goto-char (point-min))
|
|
2762 (re-search-forward regexp nil t))))
|
23188
|
2763 )))
|
22206
|
2764 "matching file")))
|
|
2765
|
723
|
2766 (defun dired-flag-files-regexp (regexp)
|
40950
|
2767 "In Dired, flag all files containing the specified REGEXP for deletion.
|
723
|
2768 The match is against the non-directory part of the filename. Use `^'
|
|
2769 and `$' to anchor matches. Exclude subdirs by hiding them.
|
|
2770 `.' and `..' are never flagged."
|
|
2771 (interactive (list (dired-read-regexp "Flag for deletion (regexp): ")))
|
|
2772 (dired-mark-files-regexp regexp dired-del-marker))
|
|
2773
|
|
2774 (defun dired-mark-symlinks (unflag-p)
|
|
2775 "Mark all symbolic links.
|
|
2776 With prefix argument, unflag all those files."
|
|
2777 (interactive "P")
|
|
2778 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
|
|
2779 (dired-mark-if (looking-at dired-re-sym) "symbolic link")))
|
|
2780
|
|
2781 (defun dired-mark-directories (unflag-p)
|
|
2782 "Mark all directory file lines except `.' and `..'.
|
|
2783 With prefix argument, unflag all those files."
|
|
2784 (interactive "P")
|
|
2785 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
|
|
2786 (dired-mark-if (and (looking-at dired-re-dir)
|
|
2787 (not (looking-at dired-re-dot)))
|
|
2788 "directory file")))
|
|
2789
|
|
2790 (defun dired-mark-executables (unflag-p)
|
|
2791 "Mark all executable files.
|
|
2792 With prefix argument, unflag all those files."
|
|
2793 (interactive "P")
|
|
2794 (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char)))
|
|
2795 (dired-mark-if (looking-at dired-re-exe) "executable file")))
|
|
2796
|
|
2797 ;; dired-x.el has a dired-mark-sexp interactive command: mark
|
|
2798 ;; files for which PREDICATE returns non-nil.
|
|
2799
|
|
2800 (defun dired-flag-auto-save-files (&optional unflag-p)
|
661
|
2801 "Flag for deletion files whose names suggest they are auto save files.
|
|
2802 A prefix argument says to unflag those files instead."
|
|
2803 (interactive "P")
|
723
|
2804 (let ((dired-marker-char (if unflag-p ?\040 dired-del-marker)))
|
|
2805 (dired-mark-if
|
3633
|
2806 ;; It is less than general to check for # here,
|
3043
|
2807 ;; but it's the only way this runs fast enough.
|
|
2808 (and (save-excursion (end-of-line)
|
3580
|
2809 (or
|
|
2810 (eq (preceding-char) ?#)
|
|
2811 ;; Handle executables in case of -F option.
|
|
2812 ;; We need not worry about the other kinds
|
|
2813 ;; of markings that -F makes, since they won't
|
|
2814 ;; appear on real auto-save files.
|
|
2815 (if (eq (preceding-char) ?*)
|
|
2816 (progn
|
|
2817 (forward-char -1)
|
|
2818 (eq (preceding-char) ?#)))))
|
3043
|
2819 (not (looking-at dired-re-dir))
|
|
2820 (let ((fn (dired-get-filename t t)))
|
|
2821 (if fn (auto-save-file-name-p
|
|
2822 (file-name-nondirectory fn)))))
|
|
2823 "auto save file")))
|
723
|
2824
|
54533
|
2825 (defcustom dired-garbage-files-regexp
|
54548
|
2826 ;; `log' here is dubious, since it's typically used for useful log
|
54533
|
2827 ;; files, not just TeX stuff. -- fx
|
49138
|
2828 (concat (regexp-opt
|
|
2829 '(".log" ".toc" ".dvi" ".bak" ".orig" ".rej" ".aux"))
|
49549
|
2830 "\\'")
|
54533
|
2831 "Regular expression to match \"garbage\" files for `dired-flag-garbage-files'."
|
|
2832 :type 'regexp
|
|
2833 :group 'dired)
|
16825
|
2834
|
|
2835 (defun dired-flag-garbage-files ()
|
19780
91cd68461722
(dired-flag-garbage-files): Move interactive flag across doc string.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2836 "Flag for deletion all files that match `dired-garbage-files-regexp'."
|
16825
|
2837 (interactive)
|
|
2838 (dired-flag-files-regexp dired-garbage-files-regexp))
|
|
2839
|
723
|
2840 (defun dired-flag-backup-files (&optional unflag-p)
|
|
2841 "Flag all backup files (names ending with `~') for deletion.
|
|
2842 With prefix argument, unflag these files."
|
|
2843 (interactive "P")
|
13750
|
2844 (let ((dired-marker-char (if unflag-p ?\ dired-del-marker)))
|
723
|
2845 (dired-mark-if
|
13726
|
2846 ;; Don't call backup-file-name-p unless the last character looks like
|
|
2847 ;; it might be the end of a backup file name. This isn't very general,
|
3043
|
2848 ;; but it's the only way this runs fast enough.
|
|
2849 (and (save-excursion (end-of-line)
|
13726
|
2850 ;; Handle executables in case of -F option.
|
|
2851 ;; We need not worry about the other kinds
|
|
2852 ;; of markings that -F makes, since they won't
|
|
2853 ;; appear on real backup files.
|
|
2854 (if (eq (preceding-char) ?*)
|
|
2855 (forward-char -1))
|
13750
|
2856 (eq (preceding-char) ?~))
|
3043
|
2857 (not (looking-at dired-re-dir))
|
723
|
2858 (let ((fn (dired-get-filename t t)))
|
|
2859 (if fn (backup-file-name-p fn))))
|
|
2860 "backup file")))
|
|
2861
|
910
|
2862 (defun dired-change-marks (&optional old new)
|
|
2863 "Change all OLD marks to NEW marks.
|
|
2864 OLD and NEW are both characters used to mark files."
|
|
2865 (interactive
|
|
2866 (let* ((cursor-in-echo-area t)
|
|
2867 (old (progn (message "Change (old mark): ") (read-char)))
|
|
2868 (new (progn (message "Change %c marks to (new mark): " old)
|
|
2869 (read-char))))
|
|
2870 (list old new)))
|
3478
|
2871 (if (or (eq old ?\r) (eq new ?\r))
|
|
2872 (ding)
|
|
2873 (let ((string (format "\n%c" old))
|
|
2874 (buffer-read-only))
|
|
2875 (save-excursion
|
|
2876 (goto-char (point-min))
|
|
2877 (while (search-forward string nil t)
|
12211
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2878 (if (if (= old ?\ )
|
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2879 (save-match-data
|
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2880 (dired-get-filename 'no-dir t))
|
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2881 t)
|
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2882 (subst-char-in-region (match-beginning 0)
|
472729271c30
(dired-change-marks): If OLD is a space, don't act on non-file lines.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2883 (match-end 0) old new)))))))
|
910
|
2884
|
18160
|
2885 (defun dired-unmark-all-marks ()
|
4169
|
2886 "Remove all marks from all files in the Dired buffer."
|
|
2887 (interactive)
|
|
2888 (dired-unmark-all-files ?\r))
|
|
2889
|
3102
|
2890 (defun dired-unmark-all-files (mark &optional arg)
|
3524
|
2891 "Remove a specific mark (or any mark) from every file.
|
49549
|
2892 After this command, type the mark character to remove,
|
3524
|
2893 or type RET to remove all marks.
|
2458
|
2894 With prefix arg, query for each marked file.
|
723
|
2895 Type \\[help-command] at that time for help."
|
3524
|
2896 (interactive "cRemove marks (RET means all): \nP")
|
|
2897 (save-excursion
|
|
2898 (let* ((count 0)
|
|
2899 buffer-read-only case-fold-search query
|
|
2900 (string (format "\n%c" mark))
|
|
2901 (help-form "\
|
3102
|
2902 Type SPC or `y' to unmark one file, DEL or `n' to skip to next,
|
|
2903 `!' to unmark all remaining files with no more questions."))
|
3524
|
2904 (goto-char (point-min))
|
|
2905 (while (if (eq mark ?\r)
|
|
2906 (re-search-forward dired-re-mark nil t)
|
|
2907 (search-forward string nil t))
|
|
2908 (if (or (not arg)
|
51444
|
2909 (let ((file (dired-get-filename t t)))
|
|
2910 (and file
|
|
2911 (dired-query 'query "Unmark file `%s'? "
|
|
2912 file))))
|
3524
|
2913 (progn (subst-char-in-region (1- (point)) (point)
|
|
2914 (preceding-char) ?\ )
|
|
2915 (setq count (1+ count)))))
|
|
2916 (message (if (= count 1) "1 mark removed"
|
|
2917 "%d marks removed")
|
|
2918 count))))
|
35607
|
2919
|
723
|
2920 ;; Logging failures operating on files, and showing the results.
|
661
|
2921
|
723
|
2922 (defvar dired-log-buffer "*Dired log*")
|
661
|
2923
|
723
|
2924 (defun dired-why ()
|
|
2925 "Pop up a buffer with error log output from Dired.
|
|
2926 A group of errors from a single command ends with a formfeed.
|
|
2927 Thus, use \\[backward-page] to find the beginning of a group of errors."
|
661
|
2928 (interactive)
|
723
|
2929 (if (get-buffer dired-log-buffer)
|
|
2930 (let ((owindow (selected-window))
|
|
2931 (window (display-buffer (get-buffer dired-log-buffer))))
|
|
2932 (unwind-protect
|
910
|
2933 (progn
|
723
|
2934 (select-window window)
|
|
2935 (goto-char (point-max))
|
47488
|
2936 (forward-line -1)
|
|
2937 (backward-page 1)
|
|
2938 (recenter 0))
|
723
|
2939 (select-window owindow)))))
|
|
2940
|
|
2941 (defun dired-log (log &rest args)
|
|
2942 ;; Log a message or the contents of a buffer.
|
|
2943 ;; If LOG is a string and there are more args, it is formatted with
|
|
2944 ;; those ARGS. Usually the LOG string ends with a \n.
|
49549
|
2945 ;; End each bunch of errors with (dired-log t):
|
47488
|
2946 ;; this inserts the current time and buffer at the start of the page,
|
|
2947 ;; and \f (formfeed) at the end.
|
723
|
2948 (let ((obuf (current-buffer)))
|
47488
|
2949 (with-current-buffer (get-buffer-create dired-log-buffer)
|
|
2950 (goto-char (point-max))
|
|
2951 (let ((inhibit-read-only t))
|
|
2952 (cond ((stringp log)
|
|
2953 (insert (if args
|
|
2954 (apply (function format) log args)
|
|
2955 log)))
|
|
2956 ((bufferp log)
|
|
2957 (insert-buffer log))
|
|
2958 ((eq t log)
|
|
2959 (backward-page 1)
|
|
2960 (unless (bolp)
|
|
2961 (insert "\n"))
|
|
2962 (insert (current-time-string)
|
|
2963 "\tBuffer `" (buffer-name obuf) "'\n")
|
|
2964 (goto-char (point-max))
|
|
2965 (insert "\f\n")))))))
|
723
|
2966
|
|
2967 (defun dired-log-summary (string failures)
|
47488
|
2968 (if (= (length failures) 1)
|
|
2969 (message "%s"
|
|
2970 (with-current-buffer dired-log-buffer
|
|
2971 (goto-char (point-max))
|
|
2972 (backward-page 1)
|
|
2973 (if (eolp) (forward-line 1))
|
|
2974 (buffer-substring (point) (point-max))))
|
|
2975 (message (if failures "%s--type ? for details (%s)"
|
|
2976 "%s--type ? for details")
|
|
2977 string failures))
|
723
|
2978 ;; Log a summary describing a bunch of errors.
|
47488
|
2979 (dired-log (concat "\n" string "\n"))
|
723
|
2980 (dired-log t))
|
35607
|
2981
|
723
|
2982 ;;; Sorting
|
|
2983
|
|
2984 ;; Most ls can only sort by name or by date (with -t), nothing else.
|
|
2985 ;; GNU ls sorts on size with -S, on extension with -X, and unsorted with -U.
|
|
2986 ;; So anything that does not contain these is sort "by name".
|
|
2987
|
|
2988 (defvar dired-ls-sorting-switches "SXU"
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
2989 "String of `ls' switches \(single letters\) except \"t\" that influence sorting.
|
52973
|
2990
|
|
2991 This indicates to Dired which option switches to watch out for because they
|
|
2992 will change the sorting order behavior of `ls'.
|
|
2993
|
|
2994 To change the default sorting order \(e.g. add a `-v' option\), see the
|
|
2995 variable `dired-listing-switches'. To temporarily override the listing
|
|
2996 format, use `\\[universal-argument] \\[dired]'.")
|
723
|
2997
|
|
2998 (defvar dired-sort-by-date-regexp
|
|
2999 (concat "^-[^" dired-ls-sorting-switches
|
|
3000 "]*t[^" dired-ls-sorting-switches "]*$")
|
|
3001 "Regexp recognized by dired to set `by date' mode.")
|
|
3002
|
|
3003 (defvar dired-sort-by-name-regexp
|
|
3004 (concat "^-[^t" dired-ls-sorting-switches "]+$")
|
|
3005 "Regexp recognized by dired to set `by name' mode.")
|
|
3006
|
48491
|
3007 (defvar dired-sort-inhibit nil
|
|
3008 "Non-nil means the Dired sort command is disabled.
|
|
3009 The idea is to set this buffer-locally in special Dired buffers.")
|
|
3010
|
723
|
3011 (defun dired-sort-set-modeline ()
|
|
3012 ;; Set modeline display according to dired-actual-switches.
|
|
3013 ;; Modeline display of "by name" or "by date" guarantees the user a
|
|
3014 ;; match with the corresponding regexps. Non-matching switches are
|
|
3015 ;; shown literally.
|
4394
|
3016 (setq mode-name
|
723
|
3017 (let (case-fold-search)
|
|
3018 (cond ((string-match dired-sort-by-name-regexp dired-actual-switches)
|
4394
|
3019 "Dired by name")
|
723
|
3020 ((string-match dired-sort-by-date-regexp dired-actual-switches)
|
4394
|
3021 "Dired by date")
|
723
|
3022 (t
|
4394
|
3023 (concat "Dired " dired-actual-switches)))))
|
11587
|
3024 (force-mode-line-update))
|
661
|
3025
|
723
|
3026 (defun dired-sort-toggle-or-edit (&optional arg)
|
|
3027 "Toggle between sort by date/name and refresh the dired buffer.
|
|
3028 With a prefix argument you can edit the current listing switches instead."
|
|
3029 (interactive "P")
|
48491
|
3030 (when dired-sort-inhibit
|
|
3031 (error "Cannot sort this Dired buffer"))
|
723
|
3032 (if arg
|
|
3033 (dired-sort-other
|
|
3034 (read-string "ls switches (must contain -l): " dired-actual-switches))
|
|
3035 (dired-sort-toggle)))
|
|
3036
|
|
3037 (defun dired-sort-toggle ()
|
|
3038 ;; Toggle between sort by date/name. Reverts the buffer.
|
|
3039 (setq dired-actual-switches
|
|
3040 (let (case-fold-search)
|
21833
|
3041 (if (string-match " " dired-actual-switches)
|
|
3042 ;; New toggle scheme: add/remove a trailing " -t"
|
|
3043 (if (string-match " -t\\'" dired-actual-switches)
|
47507
|
3044 (substring dired-actual-switches 0 (match-beginning 0))
|
21833
|
3045 (concat dired-actual-switches " -t"))
|
|
3046 ;; old toggle scheme: look for some 't' switch and add/remove it
|
|
3047 (concat
|
|
3048 "-l"
|
35607
|
3049 (dired-replace-in-string (concat "[-lt"
|
|
3050 dired-ls-sorting-switches "]")
|
|
3051 ""
|
|
3052 dired-actual-switches)
|
21833
|
3053 (if (string-match (concat "[t" dired-ls-sorting-switches "]")
|
|
3054 dired-actual-switches)
|
|
3055 ""
|
|
3056 "t")))))
|
723
|
3057 (dired-sort-set-modeline)
|
|
3058 (revert-buffer))
|
|
3059
|
35607
|
3060 ;; Some user code loads dired especially for this.
|
42690
|
3061 ;; Don't do that--use replace-regexp-in-string instead.
|
35607
|
3062 (defun dired-replace-in-string (regexp newtext string)
|
|
3063 ;; Replace REGEXP with NEWTEXT everywhere in STRING and return result.
|
|
3064 ;; NEWTEXT is taken literally---no \\DIGIT escapes will be recognized.
|
|
3065 (let ((result "") (start 0) mb me)
|
|
3066 (while (string-match regexp string start)
|
|
3067 (setq mb (match-beginning 0)
|
|
3068 me (match-end 0)
|
|
3069 result (concat result (substring string start mb) newtext)
|
|
3070 start me))
|
|
3071 (concat result (substring string start))))
|
|
3072
|
723
|
3073 (defun dired-sort-other (switches &optional no-revert)
|
54577
|
3074 "Specify new ls SWITCHES for current dired buffer.
|
|
3075 Values matching `dired-sort-by-date-regexp' or `dired-sort-by-name-regexp'
|
|
3076 set the minor mode accordingly, others appear literally in the mode line.
|
|
3077 With optional second arg NO-REVERT, don't refresh the listing afterwards."
|
30414
|
3078 (dired-sort-R-check switches)
|
723
|
3079 (setq dired-actual-switches switches)
|
13010
06f8e805121d
(dired-internal-noselect): Set dired-directory when refreshing a buffer
André Spiegel <spiegel@gnu.org>
diff
changeset
|
3080 (if (eq major-mode 'dired-mode) (dired-sort-set-modeline))
|
723
|
3081 (or no-revert (revert-buffer)))
|
30414
|
3082
|
|
3083 (make-variable-buffer-local
|
|
3084 (defvar dired-subdir-alist-pre-R nil
|
|
3085 "Value of `dired-subdir-alist' before -R switch added."))
|
|
3086
|
|
3087 (defun dired-sort-R-check (switches)
|
|
3088 "Additional processing of -R in ls option string SWITCHES.
|
|
3089 Saves `dired-subdir-alist' when R is set and restores saved value
|
|
3090 minus any directories explicitly deleted when R is cleared.
|
|
3091 To be called first in body of `dired-sort-other', etc."
|
|
3092 (cond
|
|
3093 ((and (string-match "R" switches)
|
|
3094 (not (string-match "R" dired-actual-switches)))
|
|
3095 ;; Adding -R to ls switches -- save `dired-subdir-alist':
|
|
3096 (setq dired-subdir-alist-pre-R dired-subdir-alist))
|
|
3097 ((and (string-match "R" dired-actual-switches)
|
|
3098 (not (string-match "R" switches)))
|
|
3099 ;; Deleting -R from ls switches -- revert to pre-R subdirs
|
|
3100 ;; that are still present:
|
|
3101 (setq dired-subdir-alist
|
|
3102 (if dired-subdir-alist-pre-R
|
|
3103 (let (subdirs)
|
|
3104 (while dired-subdir-alist-pre-R
|
|
3105 (if (assoc (caar dired-subdir-alist-pre-R)
|
|
3106 dired-subdir-alist)
|
|
3107 ;; subdir still present...
|
|
3108 (setq subdirs
|
|
3109 (cons (car dired-subdir-alist-pre-R)
|
|
3110 subdirs)))
|
|
3111 (setq dired-subdir-alist-pre-R
|
|
3112 (cdr dired-subdir-alist-pre-R)))
|
|
3113 (reverse subdirs))
|
|
3114 ;; No pre-R subdir alist, so revert to main directory
|
|
3115 ;; listing:
|
|
3116 (list (car (reverse dired-subdir-alist))))))))
|
35607
|
3117
|
53789
|
3118
|
|
3119 ;;;; Drag and drop support
|
|
3120
|
58426
|
3121 (defcustom dired-recursive-copies nil
|
|
3122 "*Decide whether recursive copies are allowed.
|
|
3123 nil means no recursive copies.
|
|
3124 `always' means copy recursively without asking.
|
|
3125 `top' means ask for each directory at top level.
|
|
3126 Anything else means ask for each directory."
|
|
3127 :type '(choice :tag "Copy directories"
|
|
3128 (const :tag "No recursive copies" nil)
|
|
3129 (const :tag "Ask for each directory" t)
|
|
3130 (const :tag "Ask for each top directory only" top)
|
|
3131 (const :tag "Copy directories without asking" always))
|
|
3132 :group 'dired)
|
|
3133
|
53789
|
3134 (defun dired-dnd-test-function (window action types)
|
|
3135 "The test function for drag and drop into dired buffers.
|
|
3136 WINDOW is where the mouse is when this function is called. It may be a frame
|
|
3137 if the mouse is over the menu bar, scroll bar or tool bar.
|
|
3138 ACTION is the suggested action from the source, and TYPES are the
|
|
3139 types the drop data can have. This function only accepts drops with
|
|
3140 types in `x-dnd-known-types'. It returns the action suggested by the source."
|
|
3141 (let ((type (x-dnd-choose-type types)))
|
|
3142 (if type
|
|
3143 (cons action type)
|
|
3144 nil)))
|
|
3145
|
|
3146 (defun dired-dnd-popup-notice ()
|
55937
|
3147 (x-popup-dialog
|
53789
|
3148 t
|
55937
|
3149 '("Recursive copies not enabled.\nSee variable dired-recursive-copies."
|
53789
|
3150 ("Ok" . nil))))
|
|
3151
|
|
3152
|
|
3153 (defun dired-dnd-do-ask-action (uri)
|
|
3154 ;; No need to get actions and descriptions from the source,
|
|
3155 ;; we only have three actions anyway.
|
55937
|
3156 (let ((action (x-popup-menu
|
53789
|
3157 t
|
|
3158 (list "What action?"
|
|
3159 (cons ""
|
|
3160 '(("Copy here" . copy)
|
|
3161 ("Move here" . move)
|
|
3162 ("Link here" . link)
|
|
3163 "--"
|
|
3164 ("Cancel" . nil)))))))
|
|
3165 (if action
|
|
3166 (dired-dnd-handle-local-file uri action)
|
|
3167 nil)))
|
|
3168
|
|
3169 (defun dired-dnd-handle-local-file (uri action)
|
|
3170 "Copy, move or link a file to the dired directory.
|
|
3171 URI is the file to handle, ACTION is one of copy, move, link or ask.
|
|
3172 Ask means pop up a menu for the user to select one of copy, move or link."
|
|
3173 (require 'dired-aux)
|
|
3174 (let* ((from (x-dnd-get-local-file-name uri t))
|
|
3175 (to (if from (concat (dired-current-directory)
|
|
3176 (file-name-nondirectory from))
|
|
3177 nil)))
|
|
3178 (if from
|
|
3179 (cond ((or (eq action 'copy)
|
|
3180 (eq action 'private)) ; Treat private as copy.
|
|
3181
|
|
3182 ;; If copying a directory and dired-recursive-copies is nil,
|
|
3183 ;; dired-copy-file silently fails. Pop up a notice.
|
|
3184 (if (and (file-directory-p from)
|
|
3185 (not dired-recursive-copies))
|
|
3186 (dired-dnd-popup-notice)
|
|
3187 (progn
|
|
3188 (dired-copy-file from to 1)
|
|
3189 (dired-relist-entry to)
|
|
3190 action)))
|
|
3191
|
|
3192 ((eq action 'move)
|
|
3193 (dired-rename-file from to 1)
|
|
3194 (dired-relist-entry to)
|
|
3195 action)
|
|
3196
|
|
3197 ((eq action 'link)
|
|
3198 (make-symbolic-link from to 1)
|
|
3199 (dired-relist-entry to)
|
|
3200 action)
|
|
3201
|
|
3202 ((eq action 'ask)
|
|
3203 (dired-dnd-do-ask-action uri))
|
|
3204
|
|
3205 (t nil)))))
|
|
3206
|
|
3207 (defun dired-dnd-handle-file (uri action)
|
|
3208 "Copy, move or link a file to the dired directory if it is a local file.
|
|
3209 URI is the file to handle. If the hostname in the URI isn't local, do nothing.
|
|
3210 ACTION is one of copy, move, link or ask.
|
|
3211 Ask means pop up a menu for the user to select one of copy, move or link."
|
|
3212 (let ((local-file (x-dnd-get-local-file-uri uri)))
|
|
3213 (if local-file (dired-dnd-handle-local-file local-file action)
|
|
3214 nil)))
|
55058
|
3215
|
|
3216
|
|
3217 ;;;; Desktop support
|
|
3218
|
|
3219 (eval-when-compile (require 'desktop))
|
|
3220
|
|
3221 (defun dired-desktop-buffer-misc-data (desktop-dirname)
|
|
3222 "Auxiliary information to be saved in desktop file."
|
|
3223 (cons
|
|
3224 ;; Value of `dired-directory'.
|
|
3225 (if (consp dired-directory)
|
|
3226 ;; Directory name followed by list of files.
|
|
3227 (cons (desktop-file-name (car dired-directory) desktop-dirname)
|
|
3228 (cdr dired-directory))
|
|
3229 ;; Directory name, optionally with with shell wildcard.
|
|
3230 (desktop-file-name dired-directory desktop-dirname))
|
|
3231 ;; Subdirectories in `dired-subdir-alist'.
|
|
3232 (cdr
|
|
3233 (nreverse
|
|
3234 (mapcar
|
|
3235 (function (lambda (f) (desktop-file-name (car f) desktop-dirname)))
|
|
3236 dired-subdir-alist)))))
|
|
3237
|
|
3238 ;;;###autoload
|
|
3239 (defun dired-restore-desktop-buffer (desktop-buffer-file-name
|
|
3240 desktop-buffer-name
|
|
3241 desktop-buffer-misc)
|
|
3242 "Restore a dired buffer specified in a desktop file."
|
|
3243 ;; First element of `desktop-buffer-misc' is the value of `dired-directory'.
|
|
3244 ;; This value is a directory name, optionally with with shell wildcard or
|
|
3245 ;; a directory name followed by list of files.
|
|
3246 (let* ((dired-dir (car desktop-buffer-misc))
|
|
3247 (dir (if (consp dired-dir) (car dired-dir) dired-dir)))
|
|
3248 (if (file-directory-p (file-name-directory dir))
|
|
3249 (progn
|
|
3250 (dired dired-dir)
|
|
3251 ;; The following elements of `desktop-buffer-misc' are the keys
|
|
3252 ;; from `dired-subdir-alist'.
|
|
3253 (mapcar 'dired-maybe-insert-subdir (cdr desktop-buffer-misc))
|
|
3254 (current-buffer))
|
|
3255 (message "Desktop: Directory %s no longer exists." dir)
|
|
3256 (when desktop-missing-file-warning (sit-for 1))
|
|
3257 nil)))
|
53789
|
3258
|
|
3259
|
723
|
3260 (if (eq system-type 'vax-vms)
|
|
3261 (load "dired-vms"))
|
661
|
3262
|
4888
|
3263 (provide 'dired)
|
|
3264
|
723
|
3265 (run-hooks 'dired-load-hook) ; for your customizations
|
661
|
3266
|
58412
b9a1c1b8d195
(dired-align-file): Don't assume line starts with spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
3267 ;; arch-tag: e1af7a8f-691c-41a0-aac1-ddd4d3c87517
|
834
|
3268 ;;; dired.el ends here
|