* lisp/replace.el (occur-mode-map): Rebind occur-edit-mode to "e".

(occur-edit-mode-map): Bind C-c C-c to occur-cease-edit and C-o to
occur-mode-display-occurrence.
(occur-edit-mode): Add usage message.
(occur-cease-edit): New command.
(occur-after-change-function): Use text properties to find the
position of the prefix text.
(occur-engine): Set stickiness of prefix text properties.

Fixes: debbugs:8463
This commit is contained in:
Chong Yidong 2011-09-17 17:28:17 -04:00
parent b8f0a954b8
commit 8c0f49f09c
4 changed files with 68 additions and 39 deletions

View file

@ -814,7 +814,7 @@ They are superseded by shift-select-mode enabled by default in 23.1.
* New Modes and Packages in Emacs 24.1
** Occur Edit mode applies edits made in *Occur* buffers to the
original buffers. It is bound to C-x C-q in Occur mode.
original buffers. It is bound to "e" in Occur mode.
** New global minor modes electric-pair-mode, electric-indent-mode,
and electric-layout-mode.

View file

@ -1,3 +1,14 @@
2011-09-17 Chong Yidong <cyd@stupidchicken.com>
* replace.el (occur-mode-map): Rebind occur-edit-mode to "e" (Bug#8463).
(occur-edit-mode-map): Bind C-c C-c to occur-cease-edit and C-o to
occur-mode-display-occurrence.
(occur-edit-mode): Add usage message.
(occur-cease-edit): New command.
(occur-after-change-function): Use text properties to find the
position of the prefix text.
(occur-engine): Set stickiness of prefix text properties.
2011-09-17 Glenn Morris <rgm@gnu.org>
* progmodes/etags.el (complete-tag):

View file

@ -632,9 +632,10 @@ an alist of attribute/value pairs."
(setq record (cons (list name value)
record))
(forward-line 1))
(push (if withdn
(cons dn (nreverse record))
(nreverse record)) result)
(cond (withdn
(push (cons dn (nreverse record)) result))
(record
(push (nreverse record) result)))
(setq record nil)
(skip-chars-forward " \t\n")
(message "Parsing results... %d" numres)

View file

@ -810,7 +810,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)
@ -864,8 +864,8 @@ 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))
map)
@ -878,40 +878,54 @@ the originating buffer.
To return to ordinary Occur mode, use \\[occur-mode]."
(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 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)
@ -1336,9 +1350,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