X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/84eb0351d8be4811897c8cf62a69757ff5d14001..4cddca3070934602b0156a5cc260c633f210599c:/lisp/wdired.el diff --git a/lisp/wdired.el b/lisp/wdired.el index 11ef25d4ea..5183b5639c 100644 --- a/lisp/wdired.el +++ b/lisp/wdired.el @@ -1,6 +1,6 @@ ;;; wdired.el --- Rename files editing their names in dired buffers -;; Copyright (C) 2004-2011 Free Software Foundation, Inc. +;; Copyright (C) 2004-2012 Free Software Foundation, Inc. ;; Filename: wdired.el ;; Author: Juan León Lahoz García @@ -32,7 +32,7 @@ ;; the files in a "dired" buffer? Now you can do this. All the power ;; of Emacs commands are available to renaming files! ;; -;; This package provides a function that makes the filenames of a a +;; This package provides a function that makes the filenames of a ;; dired buffer editable, by changing the buffer mode (which inhibits ;; all of the commands of dired mode). Here you can edit the names of ;; one or more files and directories, and when you press C-c C-c, the @@ -58,39 +58,13 @@ ;; ;; - To mark files for deletion, by deleting their whole filename. -;;; Installation: - -;; Add this file (byte-compiling it is recommended) to your load-path. -;; Then add one of these set of lines (or similar ones) to your config: -;; -;; This is the easy way: -;; -;; (require 'wdired) -;; (define-key dired-mode-map "r" 'wdired-change-to-wdired-mode) -;; -;; This is the recommended way for faster Emacs startup time and lower -;; memory consumption: -;; -;; (autoload 'wdired-change-to-wdired-mode "wdired") -;; (eval-after-load "dired" -;; '(lambda () -;; (define-key dired-mode-map "r" 'wdired-change-to-wdired-mode) -;; (define-key dired-mode-map -;; [menu-bar immediate wdired-change-to-wdired-mode] -;; '("Edit File Names" . wdired-change-to-wdired-mode)))) -;; -;; Type "M-x customize-group RET wdired" if you want to make changes -;; to the default behavior. - ;;; Usage: -;; Then, you can start editing the names of the files by typing "r" -;; (or whatever key you choose, or M-x wdired-change-to-wdired-mode). -;; Use C-c C-c when finished or C-c C-k to abort. You can use also the -;; menu options: in dired mode, "Edit File Names" under "Immediate". -;; While editing the names, a new submenu "WDired" is available at top -;; level. You can customize the behavior of this package from this -;; menu. +;; You can edit the names of the files by typing C-x C-q or by +;; executing M-x wdired-change-to-wdired-mode. Use C-c C-c when +;; finished or C-c C-k to abort. While editing filenames, a new +;; submenu "WDired" is available at top level. You can customize the +;; behavior of this package from this menu. ;;; Change Log: @@ -101,7 +75,6 @@ (defvar dired-backup-overwrite) ; Only in Emacs 20.x this is a custom var -(eval-when-compile (require 'cl)) (require 'dired) (autoload 'dired-do-create-files-regexp "dired-aux") @@ -167,6 +140,20 @@ program `dired-chmod-program', which must exist." (other :tag "Bits freely editable" advanced)) :group 'wdired) +(defcustom wdired-keep-marker-rename t + ;; Use t as default so that renamed files "take their markers with them". + "Controls marking of files renamed in WDired. +If t, files keep their previous marks when they are renamed. +If a character, renamed files (whether previously marked or not) +are afterward marked with that character. +This option affects only files renamed by `wdired-finish-edit'. +See `dired-keep-marker-rename' if you want to do the same for files +renamed by `dired-do-rename' and `dired-do-rename-regexp'." + :type '(choice (const :tag "Keep" t) + (character :tag "Mark" :value ?R)) + :version "24.3" + :group 'wdired) + (defvar wdired-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-x\C-s" 'wdired-finish-edit) @@ -207,17 +194,24 @@ program `dired-chmod-program', which must exist." (defvar wdired-col-perm) ;; Column where the permission bits start (defvar wdired-old-content) (defvar wdired-old-point) - +(defvar wdired-old-marks) (defun wdired-mode () - "\\File Names Editing mode. + "Writable Dired (WDired) mode. +\\ +In WDired mode, you can edit the names of the files in the +buffer, the target of the links, and the permission bits of the +files. + +Type \\[wdired-finish-edit] to exit WDired mode, returning to +Dired mode, and make your edits \"take effect\" by modifying the +file and directory names, link targets, and/or file permissions +on disk. If you delete the filename of a file, it is flagged for +deletion in the Dired buffer. -Press \\[wdired-finish-edit] to make the changes to take effect -and exit. To abort the edit, use \\[wdired-abort-changes]. +Type \\[wdired-abort-changes] to abort your edits and exit WDired mode. -In this mode you can edit the names of the files, the target of -the links and the permission bits of the files. You can use -\\[customize-group] RET wdired to customize WDired behavior. +Type \\[customize-group] RET wdired to customize WDired behavior. The only editable texts in a WDired buffer are filenames, symbolic link targets, and filenames permission." @@ -228,20 +222,25 @@ symbolic link targets, and filenames permission." ;;;###autoload (defun wdired-change-to-wdired-mode () - "Put a dired buffer in a mode in which filenames are editable. + "Put a Dired buffer in Writable Dired (WDired) mode. \\ -This mode allows the user to change the names of the files, and after -typing \\[wdired-finish-edit] Emacs renames the files and directories -in disk. +In WDired mode, you can edit the names of the files in the +buffer, the target of the links, and the permission bits of the +files. After typing \\[wdired-finish-edit], Emacs modifies the files and +directories to reflect your edits. See `wdired-mode'." (interactive) - (or (eq major-mode 'dired-mode) - (error "Not a Dired buffer")) + (unless (eq major-mode 'dired-mode) + (error "Not a Dired buffer")) (set (make-local-variable 'wdired-old-content) (buffer-substring (point-min) (point-max))) + (set (make-local-variable 'wdired-old-marks) + (dired-remember-marks (point-min) (point-max))) (set (make-local-variable 'wdired-old-point) (point)) (set (make-local-variable 'query-replace-skip-read-only) t) + (set (make-local-variable 'isearch-filter-predicate) + 'wdired-isearch-filter-read-only) (use-local-map wdired-mode-map) (force-mode-line-update) (setq buffer-read-only nil) @@ -267,6 +266,11 @@ See `wdired-mode'." "Press \\[wdired-finish-edit] when finished \ or \\[wdired-abort-changes] to abort changes"))) +(defun wdired-isearch-filter-read-only (beg end) + "Skip matches that have a read-only property." + (and (isearch-filter-visible beg end) + (not (text-property-not-all (min beg end) (max beg end) + 'read-only nil)))) ;; Protect the buffer so only the filenames can be changed, and put ;; properties so filenames (old and new) can be easily found. @@ -395,6 +399,15 @@ non-nil means return old filename." (setq changes t) (if (not file-new) ;empty filename! (push file-old files-deleted) + (when wdired-keep-marker-rename + (let ((mark (cond ((integerp wdired-keep-marker-rename) + wdired-keep-marker-rename) + (wdired-keep-marker-rename + (cdr (assoc file-old wdired-old-marks))) + (t nil)))) + (when mark + (push (cons (substitute-in-file-name file-new) mark) + wdired-old-marks)))) (push (cons file-old (substitute-in-file-name file-new)) files-renamed)))) (forward-line -1))) @@ -412,7 +425,9 @@ non-nil means return old filename." (= (length files-renamed) 1)) (setq dired-directory (cdr (car files-renamed)))) ;; Re-sort the buffer. - (revert-buffer)) + (revert-buffer) + (let ((inhibit-read-only t)) + (dired-mark-remembered wdired-old-marks))) (let ((inhibit-read-only t)) (remove-text-properties (point-min) (point-max) '(old-name nil end-name nil old-link nil @@ -540,7 +555,7 @@ and proceed depending on the answer." (interactive) (customize-apropos "wdired" 'groups)) -(defun wdired-revert (&optional arg noconfirm) +(defun wdired-revert (&optional _arg _noconfirm) "Discard changes in the buffer and update it based on changes on disk. Optional arguments are ignored." (wdired-change-to-dired-mode) @@ -648,7 +663,7 @@ If OLD, return the old target. If MOVE, move point before it." (if (< arg 0) (funcall command arg) (while (> arg 0) - (condition-case err + (condition-case nil (progn (funcall command 1) (setq arg (1- arg)))