summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2011-07-08 10:42:36 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2011-07-08 10:42:36 -0400
commit856b2f11d8373374d9ddf7e89f6512b39e4071e3 (patch)
tree782a4b069af15cfe8a2bbc4b26115069f2cf51b5
parentafae1d6821cbc2bf97c27fe99ec75ca9d40fd458 (diff)
downloademacs-856b2f11d8373374d9ddf7e89f6512b39e4071e3.tar.gz
* lisp/abbrev.el (expand-abbrev): Try to preserve point.
Fixes: debbugs:5805
-rw-r--r--lisp/ChangeLog4
-rw-r--r--lisp/abbrev.el35
2 files changed, 26 insertions, 13 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 0c912db74d9..4a9dd27b840 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,7 @@
+2011-07-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * abbrev.el (expand-abbrev): Try to preserve point (bug#5805).
+
2011-07-08 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-sh-handle-start-file-process): Use a
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index 2122f43bbad..3795dd46010 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -814,19 +814,28 @@ Returns the abbrev symbol, if expansion took place."
(destructuring-bind (&optional sym name wordstart wordend)
(abbrev--before-point)
(when sym
- (unless (or ;; executing-kbd-macro
- noninteractive
- (window-minibuffer-p (selected-window)))
- ;; Add an undo boundary, in case we are doing this for
- ;; a self-inserting command which has avoided making one so far.
- (undo-boundary))
- ;; Now sym is the abbrev symbol.
- (setq last-abbrev-text name)
- (setq last-abbrev sym)
- (setq last-abbrev-location wordstart)
- ;; If this abbrev has an expansion, delete the abbrev
- ;; and insert the expansion.
- (abbrev-insert sym name wordstart wordend)))))
+ (let ((startpos (copy-marker (point) t))
+ (endmark (copy-marker wordend t)))
+ (unless (or ;; executing-kbd-macro
+ noninteractive
+ (window-minibuffer-p (selected-window)))
+ ;; Add an undo boundary, in case we are doing this for
+ ;; a self-inserting command which has avoided making one so far.
+ (undo-boundary))
+ ;; Now sym is the abbrev symbol.
+ (setq last-abbrev-text name)
+ (setq last-abbrev sym)
+ (setq last-abbrev-location wordstart)
+ ;; If this abbrev has an expansion, delete the abbrev
+ ;; and insert the expansion.
+ (prog1
+ (abbrev-insert sym name wordstart wordend)
+ ;; Yuck!! If expand-abbrev is called with point slightly
+ ;; further than the end of the abbrev, move point back to
+ ;; where it started.
+ (if (and (> startpos endmark)
+ (= (point) endmark)) ;Obey skeletons that move point.
+ (goto-char startpos))))))))
(defun unexpand-abbrev ()
"Undo the expansion of the last abbrev that expanded.