From: Chong Yidong Date: Sat, 17 Sep 2011 21:28:17 +0000 (-0400) Subject: * lisp/replace.el (occur-mode-map): Rebind occur-edit-mode to "e". X-Git-Tag: emacs-pretest-24.0.90~104^2~6 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=8c0f49f09c3079730870957c31422204f93eec28;p=emacs.git * 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 --- diff --git a/etc/NEWS b/etc/NEWS index 9f5595a6341..f61adebe2a0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -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. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cf549a936fb..74ba03e0246 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2011-09-17 Chong Yidong + + * 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 * progmodes/etags.el (complete-tag): diff --git a/lisp/net/ldap.el b/lisp/net/ldap.el index a45cc5500c2..1fa57dbfe3e 100644 --- a/lisp/net/ldap.el +++ b/lisp/net/ldap.el @@ -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) diff --git a/lisp/replace.el b/lisp/replace.el index 70175cf205c..455e1a511e8 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -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