X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/7be1c708c5abc7dea388d45454bd19bff07b7943..77c7bcb1157b405bde1227b20ef5f7ce9a90e689:/lisp/replace.el diff --git a/lisp/replace.el b/lisp/replace.el index fb98a714df..3373ee8e51 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -1,6 +1,6 @@ ;;; replace.el --- replace commands for Emacs -;; Copyright (C) 1985-1987, 1992, 1994, 1996-1997, 2000-2011 +;; Copyright (C) 1985-1987, 1992, 1994, 1996-1997, 2000-2012 ;; Free Software Foundation, Inc. ;; Maintainer: FSF @@ -763,45 +763,47 @@ a previously found match." (defvar occur-menu-map (let ((map (make-sparse-keymap))) - (define-key map [next-error-follow-minor-mode] - `(menu-item ,(purecopy "Auto Occurrence Display") + (bindings--define-key map [next-error-follow-minor-mode] + '(menu-item "Auto Occurrence Display" next-error-follow-minor-mode - :help ,(purecopy - "Display another occurrence when moving the cursor") + :help "Display another occurrence when moving the cursor" :button (:toggle . (and (boundp 'next-error-follow-minor-mode) next-error-follow-minor-mode)))) - (define-key map [separator-1] menu-bar-separator) - (define-key map [kill-this-buffer] - `(menu-item ,(purecopy "Kill Occur Buffer") kill-this-buffer - :help ,(purecopy "Kill the current *Occur* buffer"))) - (define-key map [quit-window] - `(menu-item ,(purecopy "Quit Occur Window") quit-window - :help ,(purecopy "Quit the current *Occur* buffer. Bury it, and maybe delete the selected frame"))) - (define-key map [revert-buffer] - `(menu-item ,(purecopy "Revert Occur Buffer") revert-buffer - :help ,(purecopy "Replace the text in the *Occur* buffer with the results of rerunning occur"))) - (define-key map [clone-buffer] - `(menu-item ,(purecopy "Clone Occur Buffer") clone-buffer - :help ,(purecopy "Create and return a twin copy of the current *Occur* buffer"))) - (define-key map [occur-rename-buffer] - `(menu-item ,(purecopy "Rename Occur Buffer") occur-rename-buffer - :help ,(purecopy "Rename the current *Occur* buffer to *Occur: original-buffer-name*."))) - (define-key map [separator-2] menu-bar-separator) - (define-key map [occur-mode-goto-occurrence-other-window] - `(menu-item ,(purecopy "Go To Occurrence Other Window") occur-mode-goto-occurrence-other-window - :help ,(purecopy "Go to the occurrence the current line describes, in another window"))) - (define-key map [occur-mode-goto-occurrence] - `(menu-item ,(purecopy "Go To Occurrence") occur-mode-goto-occurrence - :help ,(purecopy "Go to the occurrence the current line describes"))) - (define-key map [occur-mode-display-occurrence] - `(menu-item ,(purecopy "Display Occurrence") occur-mode-display-occurrence - :help ,(purecopy "Display in another window the occurrence the current line describes"))) - (define-key map [occur-next] - `(menu-item ,(purecopy "Move to Next Match") occur-next - :help ,(purecopy "Move to the Nth (default 1) next match in an Occur mode buffer"))) - (define-key map [occur-prev] - `(menu-item ,(purecopy "Move to Previous Match") occur-prev - :help ,(purecopy "Move to the Nth (default 1) previous match in an Occur mode buffer"))) + (bindings--define-key map [separator-1] menu-bar-separator) + (bindings--define-key map [kill-this-buffer] + '(menu-item "Kill Occur Buffer" kill-this-buffer + :help "Kill the current *Occur* buffer")) + (bindings--define-key map [quit-window] + '(menu-item "Quit Occur Window" quit-window + :help "Quit the current *Occur* buffer. Bury it, and maybe delete the selected frame")) + (bindings--define-key map [revert-buffer] + '(menu-item "Revert Occur Buffer" revert-buffer + :help "Replace the text in the *Occur* buffer with the results of rerunning occur")) + (bindings--define-key map [clone-buffer] + '(menu-item "Clone Occur Buffer" clone-buffer + :help "Create and return a twin copy of the current *Occur* buffer")) + (bindings--define-key map [occur-rename-buffer] + '(menu-item "Rename Occur Buffer" occur-rename-buffer + :help "Rename the current *Occur* buffer to *Occur: original-buffer-name*.")) + (bindings--define-key map [occur-edit-buffer] + '(menu-item "Edit Occur Buffer" occur-edit-mode + :help "Edit the *Occur* buffer and apply changes to the original buffers.")) + (bindings--define-key map [separator-2] menu-bar-separator) + (bindings--define-key map [occur-mode-goto-occurrence-other-window] + '(menu-item "Go To Occurrence Other Window" occur-mode-goto-occurrence-other-window + :help "Go to the occurrence the current line describes, in another window")) + (bindings--define-key map [occur-mode-goto-occurrence] + '(menu-item "Go To Occurrence" occur-mode-goto-occurrence + :help "Go to the occurrence the current line describes")) + (bindings--define-key map [occur-mode-display-occurrence] + '(menu-item "Display Occurrence" occur-mode-display-occurrence + :help "Display in another window the occurrence the current line describes")) + (bindings--define-key map [occur-next] + '(menu-item "Move to Next Match" occur-next + :help "Move to the Nth (default 1) next match in an Occur mode buffer")) + (bindings--define-key map [occur-prev] + '(menu-item "Move to Previous Match" occur-prev + :help "Move to the Nth (default 1) previous match in an Occur mode buffer")) map) "Menu keymap for `occur-mode'.") @@ -810,7 +812,7 @@ a previously found match." ;; We use this alternative name, so we can use \\[occur-mode-mouse-goto]. (define-key map [mouse-2] 'occur-mode-mouse-goto) (define-key map "\C-c\C-c" 'occur-mode-goto-occurrence) - (define-key map "\C-x\C-q" 'occur-edit-mode) + (define-key map "e" 'occur-edit-mode) (define-key map "\C-m" 'occur-mode-goto-occurrence) (define-key map "o" 'occur-mode-goto-occurrence-other-window) (define-key map "\C-o" 'occur-mode-display-occurrence) @@ -819,13 +821,15 @@ a previously found match." (define-key map "r" 'occur-rename-buffer) (define-key map "c" 'clone-buffer) (define-key map "\C-c\C-f" 'next-error-follow-minor-mode) - (define-key map [menu-bar occur] (cons (purecopy "Occur") occur-menu-map)) + (bindings--define-key map [menu-bar occur] (cons "Occur" occur-menu-map)) map) "Keymap for `occur-mode'.") (defvar occur-revert-arguments nil "Arguments to pass to `occur-1' to revert an Occur mode buffer. See `occur-revert-function'.") +(make-variable-buffer-local 'occur-revert-arguments) +(put 'occur-revert-arguments 'permanent-local t) (defcustom occur-mode-hook '(turn-on-font-lock) "Hook run when entering Occur mode." @@ -853,8 +857,6 @@ Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it. \\{occur-mode-map}" (set (make-local-variable 'revert-buffer-function) 'occur-revert-function) - (make-local-variable 'occur-revert-arguments) - (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) (setq next-error-function 'occur-next-error)) @@ -864,10 +866,10 @@ Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it. (let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) (define-key map [mouse-2] 'occur-mode-mouse-goto) - (define-key map "\C-c\C-c" 'occur-mode-goto-occurrence) - (define-key map "\C-x\C-q" 'occur-mode) + (define-key map "\C-c\C-c" 'occur-cease-edit) + (define-key map "\C-o" 'occur-mode-display-occurrence) (define-key map "\C-c\C-f" 'next-error-follow-minor-mode) - (define-key map [menu-bar occur] (cons (purecopy "Occur") occur-menu-map)) + (bindings--define-key map [menu-bar occur] (cons "Occur" occur-menu-map)) map) "Keymap for `occur-edit-mode'.") @@ -876,42 +878,58 @@ Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it. In this mode, changes to the *Occur* buffer are also applied to the originating buffer. -To return to ordinary Occur mode, use \\[occur-mode]." +To return to ordinary Occur mode, use \\[occur-cease-edit]." (setq buffer-read-only nil) - (add-hook 'after-change-functions 'occur-after-change-function nil t)) + (add-hook 'after-change-functions 'occur-after-change-function nil t) + (message (substitute-command-keys + "Editing: Type \\[occur-cease-edit] to return to Occur mode."))) + +(defun occur-cease-edit () + "Switch from Occur Edit mode to Occur mode." + (interactive) + (when (derived-mode-p 'occur-edit-mode) + (occur-mode) + (message "Switching to Occur mode."))) (defun occur-after-change-function (beg end length) (save-excursion (goto-char beg) - (let* ((m (get-text-property (line-beginning-position) 'occur-target)) + (let* ((line-beg (line-beginning-position)) + (m (get-text-property line-beg 'occur-target)) (buf (marker-buffer m)) - (col (current-column))) - (when (= length 0) - ;; Apply occur-target property to inserted (e.g. yanked) text. - (put-text-property beg end 'occur-target m) - ;; Did we insert a newline? Occur Edit mode can't create new - ;; Occur entries; just discard everything after the newline. - (save-excursion - (and (search-forward "\n" end t) - (delete-region (1- (point)) end)))) - (let ((line (- (line-number-at-pos) - (line-number-at-pos (window-start)))) - (readonly (with-current-buffer buf buffer-read-only)) - (win (or (get-buffer-window buf) - (display-buffer buf t))) - (text (save-excursion - (forward-line 0) - (search-forward ":" nil t) - (setq col (- col (current-column))) - (buffer-substring-no-properties (point) (line-end-position))))) - (with-selected-window win - (goto-char m) - (recenter line) - (if readonly - (message "Buffer `%s' is read only." buf) - (delete-region (line-beginning-position) (line-end-position)) - (insert text)) - (move-to-column col)))))) + col) + (when (and (get-text-property line-beg 'occur-prefix) + (not (get-text-property end 'occur-prefix))) + (when (= length 0) + ;; Apply occur-target property to inserted (e.g. yanked) text. + (put-text-property beg end 'occur-target m) + ;; Did we insert a newline? Occur Edit mode can't create new + ;; Occur entries; just discard everything after the newline. + (save-excursion + (and (search-forward "\n" end t) + (delete-region (1- (point)) end)))) + (let* ((line (- (line-number-at-pos) + (line-number-at-pos (window-start)))) + (readonly (with-current-buffer buf buffer-read-only)) + (win (or (get-buffer-window buf) + (display-buffer buf + '(nil (inhibit-same-window . t) + (inhibit-switch-frame . t))))) + (line-end (line-end-position)) + (text (save-excursion + (goto-char (next-single-property-change + line-beg 'occur-prefix nil + line-end)) + (setq col (- (point) line-beg)) + (buffer-substring-no-properties (point) line-end)))) + (with-selected-window win + (goto-char m) + (recenter line) + (if readonly + (message "Buffer `%s' is read only." buf) + (delete-region (line-beginning-position) (line-end-position)) + (insert text)) + (move-to-column col))))))) (defun occur-revert-function (_ignore1 _ignore2) @@ -928,7 +946,7 @@ To return to ordinary Occur mode, use \\[occur-mode]." (defalias 'occur-mode-mouse-goto 'occur-mode-goto-occurrence) (defun occur-mode-goto-occurrence (&optional event) - "Go to the occurrence the current line describes." + "Go to the occurrence on the current line." (interactive (list last-nonmenu-event)) (let ((pos (if (null event) @@ -939,9 +957,7 @@ To return to ordinary Occur mode, use \\[occur-mode]." (with-current-buffer (window-buffer (posn-window (event-end event))) (save-excursion (goto-char (posn-point (event-end event))) - (occur-mode-find-occurrence))))) - same-window-buffer-names - same-window-regexps) + (occur-mode-find-occurrence)))))) (pop-to-buffer (marker-buffer pos)) (goto-char pos) (run-hooks 'occur-mode-find-occurrence-hook))) @@ -958,11 +974,8 @@ To return to ordinary Occur mode, use \\[occur-mode]." "Display in another window the occurrence the current line describes." (interactive) (let ((pos (occur-mode-find-occurrence)) - window - ;; Bind these to ensure `display-buffer' puts it in another window. - same-window-buffer-names - same-window-regexps) - (setq window (display-buffer (marker-buffer pos))) + window) + (setq window (display-buffer (marker-buffer pos) t)) ;; This is the way to set point in the proper window. (save-selected-window (select-window window) @@ -1129,8 +1142,8 @@ contain \\& and \\N which convention follows `replace-match'. For example, providing \"defun\\s +\\(\\S +\\)\" for REGEXP and \"\\1\" for NLINES collects all the function names in a lisp program. When there is no parenthesized subexpressions in REGEXP -the entire match is collected. In any case the searched buffers -are not modified." +the entire match is collected. In any case the searched buffer +is not modified." (interactive (occur-read-primary-args)) (occur-1 regexp nlines (list (current-buffer)))) @@ -1216,7 +1229,7 @@ See also `multi-occur'." (with-current-buffer occur-buf (if (stringp nlines) - (fundamental-mode) ;; This is for collect opeartion. + (fundamental-mode) ;; This is for collect operation. (occur-mode)) (let ((inhibit-read-only t) ;; Don't generate undo entries for creation of the initial contents. @@ -1341,9 +1354,12 @@ See also `multi-occur'." (when prefix-face `(font-lock-face prefix-face)) `(occur-prefix t mouse-face (highlight) - occur-target ,marker follow-link t - read-only t - help-echo "mouse-2: go to this occurrence")))) + ;; Allow insertion of text at + ;; the end of the prefix (for + ;; Occur Edit mode). + front-sticky t rear-nonsticky t + occur-target ,marker follow-link t + help-echo "mouse-2: go to this occurrence")))) (match-str ;; We don't put `mouse-face' on the newline, ;; because that loses. And don't put it @@ -1579,8 +1595,8 @@ E to edit the replacement string" "Keymap that defines the responses to questions in `query-replace'. The \"bindings\" in this map are not commands; they are answers. The valid answers include `act', `skip', `act-and-show', -`exit', `act-and-exit', `edit', `delete-and-edit', `recenter', -`automatic', `backup', `exit-prefix', and `help'.") +`exit', `act-and-exit', `edit', `edit-replacement', `delete-and-edit', +`recenter', `automatic', `backup', `exit-prefix', `quit', and `help'.") (defvar multi-query-replace-map (let ((map (make-sparse-keymap))) @@ -1651,7 +1667,7 @@ with the `noescape' argument set. t t))) (defun replace-loop-through-replacements (data count) - ;; DATA is a vector contaning the following values: + ;; DATA is a vector containing the following values: ;; 0 next-rotate-count ;; 1 repeat-count ;; 2 next-replacement @@ -2101,13 +2117,13 @@ make, or the user didn't cancel the call." (if query-replace-lazy-highlight (let ((isearch-string string) (isearch-regexp regexp) + ;; Set isearch-word to nil because word-replace is regexp-based, + ;; so `isearch-search-fun' should not use `word-search-forward'. + (isearch-word nil) (search-whitespace-regexp nil) (isearch-case-fold-search case-fold) (isearch-forward t) (isearch-error nil)) - ;; Set isearch-word to nil because word-replace is regexp-based, - ;; so `isearch-search-fun' should not use `word-search-forward'. - (if (and isearch-word isearch-regexp) (setq isearch-word nil)) (isearch-lazy-highlight-new-loop range-beg range-end)))) (defun replace-dehighlight ()