X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/b00214166057e71bc7a732a56395dd28f7d261f3..ca088b04376178d1305ff9d0866c20263f4a79bf:/lisp/dabbrev.el diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el index 202cb9edf7..5dea989211 100644 --- a/lisp/dabbrev.el +++ b/lisp/dabbrev.el @@ -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