(pc-select-selection-keys-only, pc-selection-mode): Fix spellings in docstrings.
[bpt/emacs.git] / lisp / dabbrev.el
index 202cb9e..5dea989 100644 (file)
@@ -1,6 +1,6 @@
 ;;; dabbrev.el --- dynamic abbreviation package
 
-;; Copyright (C) 1985, 86, 92, 94, 96, 1997, 2000, 2001
+;; Copyright (C) 1985, 86, 92, 94, 96, 1997, 2000, 01, 03, 2004
 ;;   Free Software Foundation, Inc.
 
 ;; Author: Don Morrison
@@ -168,7 +168,7 @@ This variable has an effect only when the value of
                 (const :tag "based on `case-replace'" case-replace)
                 (other :tag "on" t))
   :group 'dabbrev
-  :version "21.4")
+  :version "22.1")
 
 (defcustom dabbrev-case-replace 'case-replace
   "*Whether dabbrev applies the abbreviations's case pattern to the expansion.
@@ -282,7 +282,8 @@ A mode setting this variable should make it buffer local."
   "If non-nil, a list of buffers which dabbrev should search.
 If this variable is non-nil, dabbrev will only look in these buffers.
 It will not even look in the current buffer if it is not a member of
-this list.")
+this list."
+  :group 'dabbrev)
 
 ;;----------------------------------------------------------------
 ;; Internal variables
@@ -357,11 +358,9 @@ this list.")
 ;; Exported functions
 ;;----------------------------------------------------------------
 
-;;;###autoload
-(define-key esc-map "/" 'dabbrev-expand)
+;;;###autoload (define-key esc-map "/" 'dabbrev-expand)
 ;;;??? Do we want this?
-;;;###autoload
-(define-key esc-map [?\C-/] 'dabbrev-completion)
+;;;###autoload (define-key esc-map [?\C-/] 'dabbrev-completion)
 
 ;;;###autoload
 (defun dabbrev-completion (&optional arg)
@@ -518,25 +517,27 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion]."
              ;; The "abbrev" to expand is just the space.
              (setq abbrev " ")
              (save-excursion
-               (if dabbrev--last-buffer
-                   (set-buffer dabbrev--last-buffer))
-               ;; Find the end of the last "expansion" word.
-               (if (or (eq dabbrev--last-direction 1)
-                       (and (eq dabbrev--last-direction 0)
-                            (< dabbrev--last-expansion-location (point))))
-                   (setq dabbrev--last-expansion-location
-                         (+ dabbrev--last-expansion-location
-                            (length dabbrev--last-expansion))))
-               (goto-char dabbrev--last-expansion-location)
-               ;; Take the following word, with intermediate separators,
-               ;; as our expansion this time.
-               (re-search-forward
-                (concat "\\(\\(" dabbrev--abbrev-char-regexp "\\)+\\)"))
-               (setq expansion (buffer-substring-no-properties
-                                dabbrev--last-expansion-location (point)))
-
-               ;; Record the end of this expansion, in case we repeat this.
-               (setq dabbrev--last-expansion-location (point)))
+               (save-restriction
+                 (widen)
+                 (if dabbrev--last-buffer
+                     (set-buffer dabbrev--last-buffer))
+                 ;; Find the end of the last "expansion" word.
+                 (if (or (eq dabbrev--last-direction 1)
+                         (and (eq dabbrev--last-direction 0)
+                              (< dabbrev--last-expansion-location (point))))
+                     (setq dabbrev--last-expansion-location
+                           (+ dabbrev--last-expansion-location
+                              (length dabbrev--last-expansion))))
+                 (goto-char dabbrev--last-expansion-location)
+                 ;; Take the following word, with intermediate separators,
+                 ;; as our expansion this time.
+                 (re-search-forward
+                  (concat "\\(?:" dabbrev--abbrev-char-regexp "\\)+"))
+                 (setq expansion (buffer-substring-no-properties
+                                  dabbrev--last-expansion-location (point)))
+
+                 ;; Record the end of this expansion, in case we repeat this.
+                 (setq dabbrev--last-expansion-location (point))))
              ;; Indicate that dabbrev--last-expansion-location is
              ;; at the end of the expansion.
              (setq dabbrev--last-direction -1))
@@ -795,10 +796,7 @@ of the start of the occurrence."
        ;; Walk through the buffers till we find a match.
        (let (expansion)
         (while (and (not expansion) dabbrev--friend-buffer-list)
-          (setq dabbrev--last-buffer
-                (car dabbrev--friend-buffer-list))
-          (setq dabbrev--friend-buffer-list
-                (cdr dabbrev--friend-buffer-list))
+          (setq dabbrev--last-buffer (pop dabbrev--friend-buffer-list))
           (set-buffer dabbrev--last-buffer)
           (dabbrev--scanning-message)
           (setq dabbrev--last-expansion-location (point-min))
@@ -853,7 +851,8 @@ of the start of the occurrence."
 
 (defun dabbrev--safe-replace-match (string &optional fixedcase literal)
   (if (eq major-mode 'picture-mode)
-      (picture-replace-match string fixedcase literal)
+      (with-no-warnings
+       (picture-replace-match string fixedcase literal))
     (replace-match string fixedcase literal)))
 
 ;;;----------------------------------------------------------------
@@ -892,23 +891,28 @@ to record whether we upcased the expansion, downcased it, or did neither."
     ;; matches the start of the expansion,
     ;; copy the expansion's case
     ;; instead of downcasing all the rest.
-    ;; Treat a one-capital-letter abbrev as "not all upper case",
-    ;; so as to force preservation of the expansion's pattern
-    ;; if the expansion starts with a capital letter.
-    (let ((expansion-rest (substring expansion 1)))
-      (if (and (not (and (or (string= expansion-rest (downcase expansion-rest))
-                            (string= expansion-rest (upcase expansion-rest)))
-                        (or (string= abbrev (downcase abbrev))
-                            (and (string= abbrev (upcase abbrev))
-                                 (> (length abbrev) 1)))))
-              (string= abbrev
-                       (substring expansion 0 (length abbrev))))
+    ;;
+    ;; Treat a one-capital-letter (possibly with preceding non-letter
+    ;; characters) abbrev as "not all upper case", so as to force
+    ;; preservation of the expansion's pattern if the expansion starts
+    ;; with a capital letter.
+    (let ((expansion-rest (substring expansion 1))
+         (first-letter-position (string-match "[[:alpha:]]" abbrev)))
+      (if (or (null first-letter-position)
+             (and (not (and (or (string= expansion-rest (downcase expansion-rest))
+                                (string= expansion-rest (upcase expansion-rest)))
+                            (or (string= abbrev (downcase abbrev))
+                                (and (string= abbrev (upcase abbrev))
+                                     (> (- (length abbrev) first-letter-position)
+                                        1)))))
+                  (string= abbrev
+                           (substring expansion 0 (length abbrev)))))
          (setq use-case-replace nil)))
 
     ;; If the abbrev and the expansion are both all-lower-case
     ;; then don't do any conversion.  The conversion would be a no-op
     ;; for this replacement, but it would carry forward to subsequent words.
-    ;; The goal of this is to preven that carrying forward.
+    ;; The goal of this is to prevent that carrying forward.
     (if (and (string= expansion (downcase expansion))
             (string= abbrev (downcase abbrev)))
        (setq use-case-replace nil))
@@ -1001,8 +1005,7 @@ Leaves point at the location of the start of the expansion."
              nil
            ;; We have a truly valid match.  Find the end.
            (re-search-forward pattern2)
-           (setq found-string (buffer-substring-no-properties
-                               (match-beginning 0) (match-end 0)))
+           (setq found-string (match-string-no-properties 0))
            (setq result found-string)
            (and ignore-case (setq found-string (downcase found-string)))
            ;; Ignore this match if it's already in the table.
@@ -1011,9 +1014,7 @@ Leaves point at the location of the start of the expansion."
                 (string= found-string table-string))
                (setq found-string nil)))
          ;; Prepare to continue searching.
-         (if reverse
-             (goto-char (match-beginning 0))
-           (goto-char (match-end 0))))
+         (goto-char (if reverse (match-beginning 0) (match-end 0))))
        ;; If we found something, use it.
        (when found-string
          ;; Put it into `dabbrev--last-table'
@@ -1029,4 +1030,5 @@ Leaves point at the location of the start of the expansion."
 
 (provide 'dabbrev)
 
+;;; arch-tag: 29e58596-f080-4306-a409-70296cf9d46f
 ;;; dabbrev.el ends here