2012-03-12 13:03:10 +00:00
|
|
|
;;; dabbrev.el --- dynamic abbreviation package -*- lexical-binding: t -*-
|
1996-01-14 07:34:30 +00:00
|
|
|
|
2024-01-02 01:47:10 +00:00
|
|
|
;; Copyright (C) 1985-1986, 1992, 1994, 1996-1997, 2000-2024 Free
|
2013-01-01 09:11:05 +00:00
|
|
|
;; Software Foundation, Inc.
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Author: Don Morrison
|
2009-01-15 03:18:21 +00:00
|
|
|
;; Lars Lindberg
|
|
|
|
;; (according to ack.texi)
|
2019-05-25 20:43:06 +00:00
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Created: 16 Mars 1992
|
1995-05-15 23:16:08 +00:00
|
|
|
;; Lindberg's last update version: 5.7
|
1998-05-26 09:23:23 +00:00
|
|
|
;; Keywords: abbrev expand completion convenience
|
1992-07-22 04:22:42 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 08:06:51 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1991-05-13 21:21:58 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 08:06:51 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
1996-01-14 07:34:30 +00:00
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
1991-05-13 21:21:58 +00:00
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
1996-01-14 07:34:30 +00:00
|
|
|
|
1991-05-13 21:21:58 +00:00
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 22:52:52 +00:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1992-07-16 21:47:34 +00:00
|
|
|
;;; Commentary:
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; The purpose with this package is to let you write just a few
|
|
|
|
;; characters of words you've written earlier to be able to expand
|
|
|
|
;; them.
|
|
|
|
;;
|
|
|
|
;; To expand a word, just put the point right after the word and press
|
|
|
|
;; M-/ (dabbrev-expand) or M-C-/ (dabbrev-completion).
|
|
|
|
;;
|
|
|
|
;; Check out the customizable variables below to learn about all the
|
|
|
|
;; features of this package.
|
|
|
|
|
|
|
|
;;; Hints and tips for major modes writers:
|
|
|
|
|
|
|
|
;; Recommended values C/Lisp etc text
|
|
|
|
;; dabbrev-case-fold-search nil t
|
|
|
|
;; dabbrev-case-replace nil t
|
|
|
|
;;
|
|
|
|
;; Set the variables you want special for your mode like this:
|
2020-12-09 08:44:38 +00:00
|
|
|
;; (setq-local dabbrev-case-replace nil)
|
1996-01-05 22:21:28 +00:00
|
|
|
;; Then you don't interfere with other modes.
|
1994-12-24 01:26:51 +00:00
|
|
|
;;
|
|
|
|
;; If your mode handles buffers that refers to other buffers
|
|
|
|
;; (i.e. compilation-mode, gud-mode), then try to set
|
|
|
|
;; `dabbrev-select-buffers-function' or `dabbrev-friend-buffer-function'
|
|
|
|
;; to a function that point out those buffers.
|
|
|
|
|
|
|
|
;; Same goes for major-modes that are connected to other modes. There
|
|
|
|
;; are for instance a number of mail-modes. One for reading, one for
|
|
|
|
;; creating a new mail etc. Maybe those should be connected.
|
|
|
|
|
|
|
|
;; Example for GNUS (when we write a reply, we want dabbrev to look in
|
|
|
|
;; the article for expansion):
|
2020-12-09 08:44:38 +00:00
|
|
|
;; (setq-local dabbrev-friend-buffer-function
|
|
|
|
;; (lambda (buffer)
|
|
|
|
;; (with-current-buffer buffer
|
|
|
|
;; (memq major-mode '(news-reply-mode gnus-article-mode)))))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
;; Known bugs and limitations.
|
|
|
|
;; - Possible to do several levels of `dabbrev-completion' in the
|
|
|
|
;; minibuffer.
|
|
|
|
;; - dabbrev-completion doesn't handle resetting the globals variables
|
|
|
|
;; right. It resets them after finding the abbrev.
|
|
|
|
|
|
|
|
;; Future enhancements
|
|
|
|
;; - Check the tags-files? Like tags-complete?
|
|
|
|
;; - Add the possibility of searching both forward and backward to
|
|
|
|
;; the nearest expansion.
|
1994-12-24 01:30:55 +00:00
|
|
|
;; - Check the kill-ring when everything else fails. (Maybe something
|
|
|
|
;; for hippie-expand?). [Bng] <boris@cs.rochester.edu>
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1995-05-15 23:16:08 +00:00
|
|
|
;;; These people gave suggestions:
|
1994-12-24 01:26:51 +00:00
|
|
|
;; [hymie] Hyman Rosen <marks!hymie@jyacc.jyacc.com>
|
|
|
|
;; [burgett] Steve Burgett <burgett@bizet.eecs.berkeley.edu>
|
|
|
|
;; [jules] Julian Gosnell <jules@x.co.uk>
|
2019-05-26 07:58:28 +00:00
|
|
|
;; [kifer] Michael Kifer <kifer@cs.stonybrook.edu>
|
1994-12-24 01:26:51 +00:00
|
|
|
;; [ake] Ake Stenhoff <extaksf@aom.ericsson.se>
|
|
|
|
;; [alon] Alon Albert <al%imercury@uunet.uu.net>
|
|
|
|
;; [tromey] Tom Tromey <tromey@busco.lanl.gov>
|
|
|
|
;; [Rolf] Rolf Schreiber <rolf@mathematik.uni-stuttgart.de>
|
|
|
|
;; [Petri] Petri Raitio <per@tekla.fi>
|
1998-01-09 22:12:10 +00:00
|
|
|
;; [ejb] Jay Berkenbilt <ejb@ql.org>
|
1994-12-24 01:26:51 +00:00
|
|
|
;; [hawley] Bob Hawley <rth1@quartet.mt.att.com>
|
|
|
|
;; ... and to all the people who have participated in the beta tests.
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1992-07-16 21:47:34 +00:00
|
|
|
;;; Code:
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;----------------------------------------------------------------
|
|
|
|
;; Customization variables
|
|
|
|
;;----------------------------------------------------------------
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defgroup dabbrev nil
|
2005-07-04 01:51:25 +00:00
|
|
|
"Dynamic Abbreviations."
|
1997-04-12 03:18:33 +00:00
|
|
|
:tag "Dynamic Abbreviations"
|
1998-05-26 09:23:23 +00:00
|
|
|
:group 'abbrev
|
|
|
|
:group 'convenience)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-backward-only nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"If non-nil, `dabbrev-expand' only looks backwards."
|
1997-04-12 03:18:33 +00:00
|
|
|
:type 'boolean
|
|
|
|
:group 'dabbrev)
|
|
|
|
|
|
|
|
(defcustom dabbrev-limit nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"Limits region searched by `dabbrev-expand' to this many chars away."
|
1997-04-12 03:18:33 +00:00
|
|
|
:type '(choice (const :tag "off" nil)
|
|
|
|
integer)
|
|
|
|
:group 'dabbrev)
|
|
|
|
|
|
|
|
(defcustom dabbrev-abbrev-skip-leading-regexp nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"Regexp for skipping leading characters of an abbreviation.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
Example: Set this to \"\\\\$\" for programming languages
|
|
|
|
in which variable names may appear with or without a leading `$'.
|
2015-09-17 23:08:20 +00:00
|
|
|
\(For example, in Makefiles.)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
Set this to nil if no characters should be skipped."
|
|
|
|
:type '(choice regexp
|
|
|
|
(const :tag "off" nil))
|
|
|
|
:group 'dabbrev)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
2007-05-10 14:46:52 +00:00
|
|
|
(defcustom dabbrev-eliminate-newlines t
|
2008-12-03 05:48:14 +00:00
|
|
|
"Non-nil means dabbrev should not insert newlines.
|
2001-04-26 19:44:30 +00:00
|
|
|
Instead it converts them to spaces."
|
|
|
|
:type 'boolean
|
|
|
|
:group 'dabbrev)
|
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-case-fold-search 'case-fold-search
|
2008-12-03 05:48:14 +00:00
|
|
|
"Control whether dabbrev searches should ignore case.
|
1994-12-24 01:30:55 +00:00
|
|
|
A value of nil means case is significant.
|
1997-05-10 00:33:28 +00:00
|
|
|
A value of `case-fold-search' means case is significant
|
|
|
|
if `case-fold-search' is nil.
|
|
|
|
Any other non-nil version means case is not significant."
|
|
|
|
:type '(choice (const :tag "off" nil)
|
1998-06-24 08:54:53 +00:00
|
|
|
(const :tag "like search" case-fold-search)
|
|
|
|
(other :tag "on" t))
|
1997-04-12 03:18:33 +00:00
|
|
|
:group 'dabbrev)
|
2009-08-26 03:07:25 +00:00
|
|
|
;;;###autoload(put 'dabbrev-case-fold-search 'risky-local-variable t)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-upcase-means-case-search nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"The significance of an uppercase character in an abbreviation.
|
2007-05-16 13:13:20 +00:00
|
|
|
A nil value means case fold search when searching for possible expansions;
|
2002-05-14 19:45:16 +00:00
|
|
|
non-nil means case sensitive search.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
This variable has an effect only when the value of
|
1997-05-10 00:33:28 +00:00
|
|
|
`dabbrev-case-fold-search' says to ignore case."
|
1997-04-12 03:18:33 +00:00
|
|
|
:type 'boolean
|
|
|
|
:group 'dabbrev)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
2002-05-14 19:45:16 +00:00
|
|
|
(defcustom dabbrev-case-distinction 'case-replace
|
2008-12-03 05:48:14 +00:00
|
|
|
"Whether dabbrev treats expansions as the same if they differ in case.
|
2002-05-14 19:45:16 +00:00
|
|
|
|
|
|
|
A value of nil means treat them as different.
|
|
|
|
A value of `case-replace' means distinguish them if `case-replace' is nil.
|
|
|
|
Any other non-nil value means to treat them as the same.
|
|
|
|
|
|
|
|
This variable has an effect only when the value of
|
|
|
|
`dabbrev-case-fold-search' specifies to ignore case."
|
|
|
|
:type '(choice (const :tag "off" nil)
|
|
|
|
(const :tag "based on `case-replace'" case-replace)
|
|
|
|
(other :tag "on" t))
|
|
|
|
:group 'dabbrev
|
2005-02-09 15:50:47 +00:00
|
|
|
:version "22.1")
|
2002-05-14 19:45:16 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-case-replace 'case-replace
|
2008-12-03 05:48:14 +00:00
|
|
|
"Whether dabbrev applies the abbreviations's case pattern to the expansion.
|
2002-05-14 19:45:16 +00:00
|
|
|
|
|
|
|
A value of nil means preserve the expansion's case pattern.
|
|
|
|
A value of `case-replace' means preserve it if `case-replace' is nil.
|
|
|
|
Any other non-nil value means modify the expansion
|
|
|
|
by applying the abbreviation's case pattern to it.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
This variable has an effect only when the value of
|
1997-05-10 00:33:28 +00:00
|
|
|
`dabbrev-case-fold-search' specifies to ignore case."
|
|
|
|
:type '(choice (const :tag "off" nil)
|
2002-05-14 19:45:16 +00:00
|
|
|
(const :tag "based on `case-replace'" case-replace)
|
1998-06-24 08:54:53 +00:00
|
|
|
(other :tag "on" t))
|
1997-04-12 03:18:33 +00:00
|
|
|
:group 'dabbrev)
|
2009-08-26 03:07:25 +00:00
|
|
|
;;;###autoload(put 'dabbrev-case-replace 'risky-local-variable t)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-abbrev-char-regexp nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"Regexp to recognize a character in an abbreviation or expansion.
|
1994-12-24 01:30:55 +00:00
|
|
|
This regexp will be surrounded with \\\\( ... \\\\) when actually used.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
Set this variable to \"\\\\sw\" if you want ordinary words or
|
2017-03-24 14:47:19 +00:00
|
|
|
\"\\\\sw\\\\|\\\\s_\" if you want symbols (including characters
|
|
|
|
whose syntax is \"symbol\" as well as those whose syntax is
|
|
|
|
\"word\"). The abbreviation is from point to the start of the
|
|
|
|
previous sequence of characters matching this variable.
|
|
|
|
|
|
|
|
The default value of nil is equivalent to \"\\\\sw\\\\|\\\\s_\".
|
|
|
|
|
|
|
|
For instance, suppose the current buffer is in `c-mode'. If this
|
|
|
|
variable is nil or \"\\\\sw\\\\|\\\\s_\", then expanding
|
|
|
|
`debug_print_in_' looks for a symbol starting with
|
|
|
|
`debug_print_in_'. If you set this variable to \"\\\\sw\", that
|
|
|
|
expansion looks for a word prefixed with `in_' (e.g., it would
|
|
|
|
match `in_range', but not `in_close_range'). If expanding
|
|
|
|
`debug_print_in' it would look for a word starting with
|
|
|
|
`in' (e.g. `integer')."
|
1997-04-12 03:18:33 +00:00
|
|
|
:type '(choice (const nil)
|
|
|
|
regexp)
|
|
|
|
:group 'dabbrev)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-check-all-buffers t
|
2008-12-03 05:48:14 +00:00
|
|
|
"Non-nil means dabbrev package should search *all* buffers.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1995-05-15 23:16:08 +00:00
|
|
|
Dabbrev always searches the current buffer first. Then, if
|
|
|
|
`dabbrev-check-other-buffers' says so, it searches the buffers
|
|
|
|
designated by `dabbrev-select-buffers-function'.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1995-05-15 23:16:08 +00:00
|
|
|
Then, if `dabbrev-check-all-buffers' is non-nil, dabbrev searches
|
2000-04-03 19:23:35 +00:00
|
|
|
all the other buffers, except those named in `dabbrev-ignored-buffer-names',
|
2018-09-11 18:43:41 +00:00
|
|
|
or matched by `dabbrev-ignored-buffer-regexps'."
|
1997-04-12 03:18:33 +00:00
|
|
|
:type 'boolean
|
|
|
|
:group 'dabbrev)
|
1995-05-15 23:16:08 +00:00
|
|
|
|
1998-06-25 01:16:56 +00:00
|
|
|
(defcustom dabbrev-ignored-buffer-names '("*Messages*" "*Buffer List*")
|
2008-12-03 05:48:14 +00:00
|
|
|
"List of buffer names that dabbrev should not check.
|
2022-05-07 11:19:49 +00:00
|
|
|
See also `dabbrev-ignored-buffer-regexps' and
|
|
|
|
`dabbrev-ignored-buffer-modes'."
|
1998-01-09 22:12:10 +00:00
|
|
|
:type '(repeat (string :tag "Buffer name"))
|
1998-04-20 02:34:53 +00:00
|
|
|
:group 'dabbrev
|
|
|
|
:version "20.3")
|
1998-01-09 22:12:10 +00:00
|
|
|
|
2001-02-06 12:04:19 +00:00
|
|
|
(defcustom dabbrev-ignored-buffer-regexps nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"List of regexps matching names of buffers that dabbrev should not check.
|
2022-05-07 11:19:49 +00:00
|
|
|
See also `dabbrev-ignored-buffer-names' and
|
|
|
|
`dabbrev-ignored-buffer-modes'."
|
2000-04-03 19:23:35 +00:00
|
|
|
:type '(repeat regexp)
|
|
|
|
:group 'dabbrev
|
|
|
|
:version "21.1")
|
|
|
|
|
2022-05-07 12:35:15 +00:00
|
|
|
(defcustom dabbrev-ignored-buffer-modes '(archive-mode image-mode)
|
2022-05-07 11:19:49 +00:00
|
|
|
"Inhibit looking for abbreviations in buffers derived from these modes.
|
|
|
|
See also `dabbrev-ignored-buffer-names' and
|
|
|
|
`dabbrev-ignored-buffer-regexps'."
|
|
|
|
:type '(repeat symbol)
|
|
|
|
:version "29.1")
|
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-check-other-buffers t
|
2019-05-23 06:58:55 +00:00
|
|
|
"Should \\[dabbrev-expand] look in other buffers?
|
1995-05-15 23:16:08 +00:00
|
|
|
nil: Don't look in other buffers.
|
|
|
|
t: Also look for expansions in the buffers pointed out by
|
|
|
|
`dabbrev-select-buffers-function'.
|
|
|
|
Anything else: When we can't find any more expansions in
|
|
|
|
the current buffer, then ask the user whether to look in other
|
|
|
|
buffers too.
|
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
The default value is t."
|
|
|
|
:type '(choice (const :tag "off" nil)
|
|
|
|
(const :tag "on" t)
|
1998-06-24 08:54:53 +00:00
|
|
|
(other :tag "ask" other))
|
1997-04-12 03:18:33 +00:00
|
|
|
:group 'dabbrev)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
;; I guess setting this to a function that selects all C- or C++-
|
|
|
|
;; mode buffers would be a good choice for a debugging buffer,
|
|
|
|
;; when debugging C- or C++-code.
|
|
|
|
(defvar dabbrev-select-buffers-function 'dabbrev--select-buffers
|
|
|
|
"A function that selects buffers that should be searched by dabbrev.
|
|
|
|
The function should take no arguments and return a list of buffers to
|
2001-05-05 22:31:30 +00:00
|
|
|
search for expansions. See the source of `dabbrev--select-buffers'
|
|
|
|
for an example.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
A mode setting this variable should make it buffer local.")
|
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-friend-buffer-function 'dabbrev--same-major-mode-p
|
2008-12-03 05:48:14 +00:00
|
|
|
"A function to decide whether dabbrev should search OTHER-BUFFER.
|
1994-12-24 01:26:51 +00:00
|
|
|
The function should take one argument, OTHER-BUFFER, and return
|
|
|
|
non-nil if that buffer should be searched. Have a look at
|
|
|
|
`dabbrev--same-major-mode-p' for an example.
|
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
The value of `dabbrev-friend-buffer-function' has an effect only if
|
|
|
|
the value of `dabbrev-select-buffers-function' uses it. The function
|
|
|
|
`dabbrev--select-buffers' is one function you can use here.
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
A mode setting this variable should make it buffer local."
|
|
|
|
:type 'function
|
|
|
|
:group 'dabbrev)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1997-04-12 03:18:33 +00:00
|
|
|
(defcustom dabbrev-search-these-buffers-only nil
|
1994-12-24 01:30:55 +00:00
|
|
|
"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
|
2005-05-19 19:06:19 +00:00
|
|
|
this list."
|
2013-12-28 08:21:33 +00:00
|
|
|
:type '(choice (const nil) (repeat :tag "List of buffers" string))
|
2005-05-19 19:06:19 +00:00
|
|
|
:group 'dabbrev)
|
1992-07-16 21:47:34 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;----------------------------------------------------------------
|
|
|
|
;; Internal variables
|
|
|
|
;;----------------------------------------------------------------
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Table of expansions seen so far
|
|
|
|
(defvar dabbrev--last-table nil)
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Last string we tried to expand.
|
|
|
|
(defvar dabbrev--last-abbreviation nil)
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Location last abbreviation began
|
|
|
|
(defvar dabbrev--last-abbrev-location nil)
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Direction of last dabbrevs search
|
|
|
|
(defvar dabbrev--last-direction 0)
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Last expansion of an abbreviation.
|
|
|
|
(defvar dabbrev--last-expansion nil)
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Location the last expansion was found.
|
|
|
|
(defvar dabbrev--last-expansion-location nil)
|
|
|
|
|
|
|
|
;; The list of remaining buffers with the same mode as current buffer.
|
|
|
|
(defvar dabbrev--friend-buffer-list nil)
|
|
|
|
|
2001-06-20 11:03:58 +00:00
|
|
|
;; The buffer we looked in last, not counting the current buffer.
|
1994-12-24 01:26:51 +00:00
|
|
|
(defvar dabbrev--last-buffer nil)
|
|
|
|
|
|
|
|
;; The buffer we found the expansion last time.
|
|
|
|
(defvar dabbrev--last-buffer-found nil)
|
|
|
|
|
2000-12-15 11:51:04 +00:00
|
|
|
;; If non-nil, a function to use when copying successive words.
|
|
|
|
;; It should be `upcase' or `downcase'.
|
1996-08-07 18:27:20 +00:00
|
|
|
(defvar dabbrev--last-case-pattern nil)
|
|
|
|
|
1995-05-15 23:16:08 +00:00
|
|
|
;; Same as dabbrev-check-other-buffers, but is set for every expand.
|
|
|
|
(defvar dabbrev--check-other-buffers dabbrev-check-other-buffers)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
2019-12-05 13:14:00 +00:00
|
|
|
;; Same as dabbrev-check-all-buffers, but is set for every expand.
|
|
|
|
(defvar dabbrev--check-all-buffers dabbrev-check-all-buffers)
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; The regexp for recognizing a character in an abbreviation.
|
|
|
|
(defvar dabbrev--abbrev-char-regexp nil)
|
|
|
|
|
2018-06-19 03:41:25 +00:00
|
|
|
;; The progress reporter for buffer-scanning progress.
|
|
|
|
(defvar dabbrev--progress-reporter nil)
|
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;----------------------------------------------------------------
|
|
|
|
;; Macros
|
|
|
|
;;----------------------------------------------------------------
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defsubst dabbrev--minibuffer-origin ()
|
2009-11-25 05:31:05 +00:00
|
|
|
"Get the buffer from which mini-buffer."
|
|
|
|
(window-buffer (minibuffer-selected-window)))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
;; Make a list of some of the elements of LIST.
|
|
|
|
;; Check each element of LIST, storing it temporarily in the
|
|
|
|
;; variable ELEMENT, and include it in the result
|
|
|
|
;; if CONDITION evaluates non-nil.
|
|
|
|
(defmacro dabbrev-filter-elements (element list condition)
|
1999-11-15 18:59:00 +00:00
|
|
|
`(let (dabbrev-result dabbrev-tail ,element)
|
|
|
|
(setq dabbrev-tail ,list)
|
|
|
|
(while dabbrev-tail
|
|
|
|
(setq ,element (car dabbrev-tail))
|
|
|
|
(if ,condition
|
|
|
|
(setq dabbrev-result (cons ,element dabbrev-result)))
|
|
|
|
(setq dabbrev-tail (cdr dabbrev-tail)))
|
|
|
|
(nreverse dabbrev-result)))
|
1994-12-24 01:30:55 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;----------------------------------------------------------------
|
|
|
|
;; Exported functions
|
|
|
|
;;----------------------------------------------------------------
|
1994-12-24 01:26:51 +00:00
|
|
|
|
2003-08-02 22:06:12 +00:00
|
|
|
;;;###autoload (define-key esc-map "/" 'dabbrev-expand)
|
2009-11-25 05:31:05 +00:00
|
|
|
;;??? Do we want this?
|
2003-08-02 22:06:12 +00:00
|
|
|
;;;###autoload (define-key esc-map [?\C-/] 'dabbrev-completion)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
2012-05-04 19:17:01 +00:00
|
|
|
(defun dabbrev--ignore-case-p (abbrev)
|
|
|
|
(and (if (eq dabbrev-case-fold-search 'case-fold-search)
|
|
|
|
case-fold-search
|
|
|
|
dabbrev-case-fold-search)
|
|
|
|
(or (not dabbrev-upcase-means-case-search)
|
|
|
|
(string= abbrev (downcase abbrev)))))
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defun dabbrev-completion (&optional arg)
|
|
|
|
"Completion on current word.
|
|
|
|
Like \\[dabbrev-expand] but finds all expansions in the current buffer
|
|
|
|
and presents suggestions for completion.
|
|
|
|
|
2009-11-25 05:31:05 +00:00
|
|
|
With a prefix argument ARG, it searches all buffers accepted by the
|
1994-12-24 01:30:55 +00:00
|
|
|
function pointed out by `dabbrev-friend-buffer-function' to find the
|
1994-12-24 01:35:28 +00:00
|
|
|
completions.
|
|
|
|
|
2010-08-01 03:19:23 +00:00
|
|
|
If the prefix argument is 16 (which comes from \\[universal-argument] \\[universal-argument]),
|
2005-11-27 23:54:40 +00:00
|
|
|
then it searches *all* buffers."
|
1994-12-24 01:26:51 +00:00
|
|
|
(interactive "*P")
|
1995-05-15 23:16:08 +00:00
|
|
|
(dabbrev--reset-global-variables)
|
2022-05-07 14:21:26 +00:00
|
|
|
(setq dabbrev--check-other-buffers (and arg t))
|
|
|
|
(setq dabbrev--check-all-buffers
|
|
|
|
(and arg (= (prefix-numeric-value arg) 16)))
|
|
|
|
(let ((completion-at-point-functions '(dabbrev-capf)))
|
|
|
|
(completion-at-point)))
|
|
|
|
|
|
|
|
(defun dabbrev-capf ()
|
|
|
|
"Dabbrev completion function for `completion-at-point-functions'."
|
2019-12-05 13:14:00 +00:00
|
|
|
(let* ((abbrev (dabbrev--abbrev-at-point))
|
2009-11-25 05:31:05 +00:00
|
|
|
(beg (progn (search-backward abbrev) (point)))
|
|
|
|
(end (progn (search-forward abbrev) (point)))
|
2012-05-04 19:17:01 +00:00
|
|
|
(ignore-case-p (dabbrev--ignore-case-p abbrev))
|
2012-03-12 20:07:45 +00:00
|
|
|
(list 'uninitialized)
|
2012-03-12 13:03:10 +00:00
|
|
|
(table
|
2012-03-12 20:07:45 +00:00
|
|
|
(lambda (s p a)
|
|
|
|
(if (eq a 'metadata)
|
|
|
|
`(metadata (cycle-sort-function . ,#'identity)
|
|
|
|
(category . dabbrev))
|
|
|
|
(when (eq list 'uninitialized)
|
|
|
|
(save-excursion
|
|
|
|
;;--------------------------------
|
|
|
|
;; New abbreviation to expand.
|
|
|
|
;;--------------------------------
|
|
|
|
(setq dabbrev--last-abbreviation abbrev)
|
|
|
|
;; Find all expansion
|
|
|
|
(let ((completion-list
|
|
|
|
(dabbrev--find-all-expansions abbrev ignore-case-p))
|
|
|
|
(completion-ignore-case ignore-case-p))
|
|
|
|
(or (consp completion-list)
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "No dynamic expansion for \"%s\" found%s"
|
|
|
|
abbrev
|
|
|
|
(if dabbrev--check-other-buffers
|
|
|
|
"" " in this-buffer")))
|
2012-03-12 20:07:45 +00:00
|
|
|
(setq list
|
|
|
|
(cond
|
|
|
|
((not (and ignore-case-p dabbrev-case-replace))
|
|
|
|
completion-list)
|
|
|
|
((string= abbrev (upcase abbrev))
|
|
|
|
(mapcar #'upcase completion-list))
|
|
|
|
((string= (substring abbrev 0 1)
|
|
|
|
(upcase (substring abbrev 0 1)))
|
|
|
|
(mapcar #'capitalize completion-list))
|
|
|
|
(t
|
|
|
|
(mapcar #'downcase completion-list)))))))
|
|
|
|
(complete-with-action a list s p)))))
|
2022-05-07 14:21:26 +00:00
|
|
|
(list beg end table)))
|
1991-05-13 21:21:58 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun dabbrev-expand (arg)
|
|
|
|
"Expand previous word \"dynamically\".
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
Expands to the most recent, preceding word for which this is a prefix.
|
|
|
|
If no suitable preceding word is found, words following point are
|
|
|
|
considered. If still no suitable word is found, then look in the
|
|
|
|
buffers accepted by the function pointed out by variable
|
2016-11-07 17:34:51 +00:00
|
|
|
`dabbrev-friend-buffer-function', if `dabbrev-check-other-buffers'
|
|
|
|
says so. Then, if `dabbrev-check-all-buffers' is non-nil, look in
|
|
|
|
all the other buffers, subject to constraints specified
|
2018-09-11 18:43:41 +00:00
|
|
|
by `dabbrev-ignored-buffer-names' and `dabbrev-ignored-buffer-regexps'.
|
1991-05-13 21:21:58 +00:00
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
A positive prefix argument, N, says to take the Nth backward *distinct*
|
1994-12-24 01:26:51 +00:00
|
|
|
possibility. A negative argument says search forward.
|
1991-05-13 21:21:58 +00:00
|
|
|
|
|
|
|
If the cursor has not moved from the end of the previous expansion and
|
|
|
|
no argument is given, replace the previously-made expansion
|
1994-12-24 01:26:51 +00:00
|
|
|
with the next possible expansion not yet tried.
|
|
|
|
|
|
|
|
The variable `dabbrev-backward-only' may be used to limit the
|
|
|
|
direction of search to backward if set non-nil.
|
|
|
|
|
1994-12-24 01:30:55 +00:00
|
|
|
See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion]."
|
1991-05-13 21:21:58 +00:00
|
|
|
(interactive "*P")
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
;; There are three possible sources of the expansion, which we need to
|
|
|
|
;; check in a specific order:
|
|
|
|
(let ((buf (cond ((window-minibuffer-p)
|
|
|
|
;; If we invoked dabbrev-expand in the minibuffer,
|
|
|
|
;; this is the buffer from which we entered the
|
|
|
|
;; minibuffer.
|
|
|
|
(window-buffer (get-mru-window)))
|
|
|
|
;; Otherwise, if we found the expansion in another
|
|
|
|
;; buffer, use that buffer for further expansions.
|
|
|
|
(dabbrev--last-buffer-found dabbrev--last-buffer-found)
|
|
|
|
;; Otherwise, use the buffer where we invoked
|
|
|
|
;; dabbrev-expand.
|
|
|
|
(t (current-buffer))))
|
|
|
|
abbrev record-case-pattern expansion old direction
|
|
|
|
(orig-point (point)))
|
1991-05-13 21:21:58 +00:00
|
|
|
;; abbrev -- the abbrev to expand
|
|
|
|
;; expansion -- the expansion found (eventually) or nil until then
|
|
|
|
;; old -- the text currently in the buffer
|
|
|
|
;; (the abbrev, or the previously-made expansion)
|
|
|
|
(save-excursion
|
|
|
|
(if (and (null arg)
|
1995-05-15 23:16:08 +00:00
|
|
|
(markerp dabbrev--last-abbrev-location)
|
|
|
|
(marker-position dabbrev--last-abbrev-location)
|
1994-12-24 01:26:51 +00:00
|
|
|
(or (eq last-command this-command)
|
Do not call to `selected-window' where it is assumed by default.
Affected functions are `window-minibuffer-p', `window-dedicated-p',
`window-hscroll', `window-width', `window-height', `window-buffer',
`window-frame', `window-start', `window-point', `next-window'
and `window-display-table'.
* abbrev.el (abbrev--default-expand):
* bs.el (bs--show-with-configuration):
* buff-menu.el (Buffer-menu-mouse-select):
* calc/calc.el (calc):
* calendar/calendar.el (calendar-generate-window):
* calendar/diary-lib.el (diary-simple-display, diary-show-all-entries)
(diary-make-entry):
* comint.el (send-invisible, comint-dynamic-complete-filename)
(comint-dynamic-simple-complete, comint-dynamic-list-completions):
* completion.el (complete):
* dabbrev.el (dabbrev-expand, dabbrev--make-friend-buffer-list):
* disp-table.el (describe-current-display-table):
* doc-view.el (doc-view-insert-image):
* ebuff-menu.el (Electric-buffer-menu-mouse-select):
* ehelp.el (with-electric-help):
* emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* emacs-lisp/edebug.el (edebug-two-window-p, edebug-pop-to-buffer):
* emacs-lisp/helper.el (Helper-help-scroller):
* emulation/cua-base.el (cua--post-command-handler-1):
* eshell/esh-mode.el (eshell-output-filter):
* ffap.el (ffap-gnus-wrapper):
* help-macro.el (make-help-screen):
* hilit-chg.el (highlight-compare-buffers):
* hippie-exp.el (hippie-expand, try-expand-dabbrev-visible):
* hl-line.el (global-hl-line-highlight):
* icomplete.el (icomplete-simple-completing-p):
* isearch.el (isearch-done):
* jit-lock.el (jit-lock-stealth-fontify):
* mail/rmailsum.el (rmail-summary-scroll-msg-up):
* lisp/mouse-drag.el (mouse-drag-should-do-col-scrolling):
* mpc.el (mpc-tagbrowser, mpc):
* net/rcirc.el (rcirc-any-buffer):
* play/gomoku.el (gomoku-max-width, gomoku-max-height):
* play/landmark.el (landmark-max-width, landmark-max-height):
* play/zone.el (zone):
* progmodes/compile.el (compilation-goto-locus):
* progmodes/ebrowse.el (ebrowse-view/find-file-and-search-pattern):
* progmodes/etags.el (find-tag-other-window):
* progmodes/fortran.el (fortran-column-ruler):
* progmodes/gdb-mi.el (gdb-mouse-toggle-breakpoint-fringe):
* progmodes/verilog-mode.el (verilog-point-text):
* reposition.el (reposition-window):
* rot13.el (toggle-rot13-mode):
* server.el (server-switch-buffer):
* shell.el (shell-dynamic-complete-command)
(shell-dynamic-complete-environment-variable):
* simple.el (insert-buffer, set-selective-display)
(delete-completion-window):
* speedbar.el (speedbar-timer-fn, speedbar-center-buffer-smartly)
(speedbar-recenter):
* startup.el (fancy-splash-head):
* textmodes/ispell.el (ispell-command-loop):
* textmodes/makeinfo.el (makeinfo-compilation-sentinel-region):
* tutorial.el (help-with-tutorial):
* vc/add-log.el (add-change-log-entry):
* vc/compare-w.el (compare-windows):
* vc/ediff-help.el (ediff-indent-help-message):
* vc/ediff-util.el (ediff-setup-control-buffer, ediff-position-region):
* vc/ediff-wind.el (ediff-skip-unsuitable-frames)
(ediff-setup-control-frame):
* vc/emerge.el (emerge-position-region):
* vc/pcvs-util.el (cvs-bury-buffer):
* window.el (walk-windows, mouse-autoselect-window-select):
* winner.el (winner-set-conf, winner-undo): Related users changed.
2013-08-05 14:26:57 +00:00
|
|
|
(and (window-minibuffer-p)
|
1994-12-24 01:26:51 +00:00
|
|
|
(= dabbrev--last-abbrev-location
|
|
|
|
(point)))))
|
1994-12-24 01:30:55 +00:00
|
|
|
;; Find a different expansion for the same abbrev as last time.
|
1994-12-24 01:26:51 +00:00
|
|
|
(progn
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
(setq dabbrev--last-buffer-found nil)
|
1994-12-24 01:26:51 +00:00
|
|
|
(setq abbrev dabbrev--last-abbreviation)
|
|
|
|
(setq old dabbrev--last-expansion)
|
|
|
|
(setq direction dabbrev--last-direction))
|
1995-05-29 06:22:40 +00:00
|
|
|
;; If the user inserts a space after expanding
|
|
|
|
;; and then asks to expand again, always fetch the next word.
|
2005-07-04 01:51:25 +00:00
|
|
|
(if (and (eq (preceding-char) ?\s)
|
1995-05-29 06:22:40 +00:00
|
|
|
(markerp dabbrev--last-abbrev-location)
|
|
|
|
(marker-position dabbrev--last-abbrev-location)
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
;; Comparing with point only makes sense in the buffer
|
|
|
|
;; where we called dabbrev-expand, but if that differs
|
|
|
|
;; from the buffer containing the expansion, we want to
|
|
|
|
;; get the next word in the latter buffer, so we skip
|
|
|
|
;; the comparison.
|
|
|
|
(if (eq buf (current-buffer))
|
|
|
|
(= (point) (1+ dabbrev--last-abbrev-location))
|
|
|
|
t))
|
1996-08-07 18:27:20 +00:00
|
|
|
(progn
|
1995-05-29 06:22:40 +00:00
|
|
|
;; The "abbrev" to expand is just the space.
|
|
|
|
(setq abbrev " ")
|
|
|
|
(save-excursion
|
2004-11-16 17:08:39 +00:00
|
|
|
(save-restriction
|
|
|
|
(widen)
|
2024-05-25 07:33:07 +00:00
|
|
|
(if (buffer-live-p dabbrev--last-buffer)
|
2004-11-16 17:08:39 +00:00
|
|
|
(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))))
|
1995-05-29 06:22:40 +00:00
|
|
|
;; Indicate that dabbrev--last-expansion-location is
|
|
|
|
;; at the end of the expansion.
|
|
|
|
(setq dabbrev--last-direction -1))
|
|
|
|
|
|
|
|
;; We have a different abbrev to expand.
|
|
|
|
(dabbrev--reset-global-variables)
|
|
|
|
(setq direction (if (null arg)
|
|
|
|
(if dabbrev-backward-only 1 0)
|
|
|
|
(prefix-numeric-value arg)))
|
|
|
|
(setq abbrev (dabbrev--abbrev-at-point))
|
1996-08-07 18:27:20 +00:00
|
|
|
(setq record-case-pattern t)
|
1995-05-29 06:22:40 +00:00
|
|
|
(setq old nil)))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
;;--------------------------------
|
|
|
|
;; Find the expansion
|
|
|
|
;;--------------------------------
|
1995-05-29 06:22:40 +00:00
|
|
|
(or expansion
|
|
|
|
(setq expansion
|
2012-03-12 13:03:10 +00:00
|
|
|
(dabbrev--find-expansion
|
|
|
|
abbrev direction
|
2012-05-04 19:17:01 +00:00
|
|
|
(dabbrev--ignore-case-p abbrev)))))
|
1994-12-24 01:26:51 +00:00
|
|
|
(cond
|
|
|
|
((not expansion)
|
|
|
|
(dabbrev--reset-global-variables)
|
|
|
|
(if old
|
|
|
|
(save-excursion
|
1995-07-30 07:08:49 +00:00
|
|
|
(setq buffer-undo-list (cons orig-point buffer-undo-list))
|
1995-10-20 20:30:22 +00:00
|
|
|
;; Put back the original abbrev with its original case pattern.
|
|
|
|
(search-backward old)
|
|
|
|
(insert abbrev)
|
|
|
|
(delete-region (point) (+ (point) (length old)))))
|
2012-05-11 17:31:30 +00:00
|
|
|
(user-error "No%s dynamic expansion for `%s' found"
|
|
|
|
(if old " further" "") abbrev))
|
1994-12-24 01:26:51 +00:00
|
|
|
(t
|
2000-05-29 16:17:48 +00:00
|
|
|
(if (not (or (eq dabbrev--last-buffer dabbrev--last-buffer-found)
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
;; If we are in the minibuffer and an expansion has
|
|
|
|
;; been found but dabbrev--last-buffer-found is not
|
|
|
|
;; yet set, we need to set it now.
|
|
|
|
(and dabbrev--last-buffer-found
|
|
|
|
(minibuffer-window-active-p (selected-window)))))
|
1991-05-13 21:21:58 +00:00
|
|
|
(progn
|
2022-05-10 03:09:15 +00:00
|
|
|
(when (buffer-name dabbrev--last-buffer)
|
|
|
|
(message "Expansion found in `%s'"
|
|
|
|
(buffer-name dabbrev--last-buffer)))
|
1994-12-24 01:26:51 +00:00
|
|
|
(setq dabbrev--last-buffer-found dabbrev--last-buffer))
|
|
|
|
(message nil))
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
;; To get correct further expansions we have to be sure to use the
|
|
|
|
;; buffer containing the already found expansions.
|
|
|
|
(when dabbrev--last-buffer-found
|
|
|
|
(setq buf dabbrev--last-buffer-found))
|
|
|
|
;; If the buffer where we called dabbrev-expand differs from the
|
|
|
|
;; buffer containing the expansion, make sure copy-marker is
|
|
|
|
;; called in the latter buffer.
|
|
|
|
(with-current-buffer buf
|
|
|
|
(if (and (or (eq (current-buffer) dabbrev--last-buffer)
|
|
|
|
(null dabbrev--last-buffer)
|
|
|
|
(buffer-live-p dabbrev--last-buffer))
|
|
|
|
(numberp dabbrev--last-expansion-location)
|
|
|
|
(and (> dabbrev--last-expansion-location (point))))
|
|
|
|
(setq dabbrev--last-expansion-location
|
|
|
|
(copy-marker dabbrev--last-expansion-location))))
|
1991-05-13 21:21:58 +00:00
|
|
|
;; Success: stick it in and return.
|
1995-07-30 07:08:49 +00:00
|
|
|
(setq buffer-undo-list (cons orig-point buffer-undo-list))
|
2016-03-02 17:20:47 +00:00
|
|
|
(setq expansion (dabbrev--substitute-expansion old abbrev expansion
|
|
|
|
record-case-pattern))
|
1996-08-07 18:27:20 +00:00
|
|
|
|
Fix bugs in dabbrev-expand (bug#74090)
* lisp/dabbrev.el (dabbrev-expand): Use the buffer where the
expansion was found when setting the internal variables used to
determine the next expansion or a replacement expansion.
* test/lisp/dabbrev-tests.el (ert-x): Require for
'ert-with-temp-directory', 'ert-resource-directory' and
'ert-resource-file'.
(with-dabbrev-test): New macro.
(dabbrev-expand-test-same-buffer-{1,2,3,4})
(dabbrev-expand-test-other-buffer-{1,2,3,4})
(dabbrev-expand-test-minibuffer-{1,2,3,4}): New tests.
* test/lisp/dabbrev-resources/dabbrev-expand.el:
* test/lisp/dabbrev-resources/INSTALL_BEGIN: New test resources.
2024-10-31 09:46:27 +00:00
|
|
|
;; Save state for re-expand (making sure it's the state of the
|
|
|
|
;; buffer containing the already found expansions).
|
|
|
|
(with-current-buffer buf
|
|
|
|
(setq dabbrev--last-expansion expansion)
|
|
|
|
(setq dabbrev--last-abbreviation abbrev)
|
|
|
|
(setq dabbrev--last-abbrev-location (point-marker)))))))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;----------------------------------------------------------------
|
|
|
|
;; Local functions
|
|
|
|
;;----------------------------------------------------------------
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defun dabbrev--same-major-mode-p (other-buffer)
|
2009-11-25 05:31:05 +00:00
|
|
|
"Check if OTHER-BUFFER has the same major mode as current buffer."
|
1994-12-24 01:30:55 +00:00
|
|
|
(eq major-mode
|
* x-dnd.el (x-dnd-maybe-call-test-function):
* window.el (split-window-vertically):
* whitespace.el (whitespace-help-on):
* vc-rcs.el (vc-rcs-consult-headers):
* userlock.el (ask-user-about-lock-help)
(ask-user-about-supersession-help):
* type-break.el (type-break-force-mode-line-update):
* time-stamp.el (time-stamp-conv-warn):
* terminal.el (te-set-output-log, te-more-break, te-filter)
(te-sentinel,terminal-emulator):
* term.el (make-term, term-exec, term-sentinel, term-read-input-ring)
(term-write-input-ring, term-check-source, term-start-output-log):
(term-display-buffer-line, term-dynamic-list-completions):
(term-ansi-make-term, serial-term):
* subr.el (selective-display):
* strokes.el (strokes-xpm-to-compressed-string, strokes-decode-buffer)
(strokes-encode-buffer, strokes-xpm-for-compressed-string):
* speedbar.el (speedbar-buffers-tail-notes, speedbar-buffers-item-info)
(speedbar-reconfigure-keymaps, speedbar-add-localized-speedbar-support)
(speedbar-remove-localized-speedbar-support)
(speedbar-set-mode-line-format, speedbar-create-tag-hierarchy)
(speedbar-update-special-contents, speedbar-buffer-buttons-engine)
(speedbar-buffers-line-directory):
* simple.el (shell-command-on-region, append-to-buffer)
(prepend-to-buffer):
* shadowfile.el (shadow-save-todo-file):
* scroll-bar.el (scroll-bar-set-window-start, scroll-bar-drag-1)
(scroll-bar-maybe-set-window-start):
* sb-image.el (speedbar-image-dump):
* saveplace.el (save-place-alist-to-file, save-places-to-alist)
(load-save-place-alist-from-file):
* ps-samp.el (ps-print-message-from-summary):
* ps-print.el (ps-flush-output, ps-insert-file, ps-get-boundingbox)
(ps-background-image, ps-begin-job, ps-do-despool):
* ps-bdf.el (bdf-find-file, bdf-read-font-info):
* printing.el (pr-interface, pr-ps-file-print, pr-find-buffer-visiting)
(pr-ps-message-from-summary, pr-lpr-message-from-summary):
(pr-call-process, pr-file-list, pr-interface-save):
* novice.el (disabled-command-function)
(enable-command, disable-command):
* mouse.el (mouse-buffer-menu-alist):
* mouse-copy.el (mouse-kill-preserving-secondary):
* macros.el (kbd-macro-query):
* ledit.el (ledit-go-to-lisp, ledit-go-to-liszt):
* informat.el (batch-info-validate):
* ido.el (ido-copy-current-word, ido-initiate-auto-merge):
* hippie-exp.el (try-expand-dabbrev-visible):
* help-mode.el (help-make-xrefs):
* help-fns.el (describe-variable):
* generic-x.el (bat-generic-mode-run-as-comint):
* finder.el (finder-mouse-select):
* find-dired.el (find-dired-sentinel):
* filesets.el (filesets-file-close):
* files.el (list-directory):
* faces.el (list-faces-display, describe-face):
* facemenu.el (list-colors-display):
* ezimage.el (ezimage-image-association-dump, ezimage-image-dump):
* epg.el (epg--process-filter, epg-cancel):
* epa.el (epa--marked-keys, epa--select-keys, epa-display-info)
(epa--read-signature-type):
* emerge.el (emerge-copy-as-kill-A, emerge-copy-as-kill-B)
(emerge-file-names):
* ehelp.el (electric-helpify):
* ediff.el (ediff-regions-wordwise, ediff-regions-linewise):
* ediff-vers.el (rcs-ediff-view-revision):
* ediff-util.el (ediff-setup):
* ediff-mult.el (ediff-append-custom-diff):
* ediff-diff.el (ediff-exec-process, ediff-process-sentinel)
(ediff-wordify):
* echistory.el (Electric-command-history-redo-expression):
* dos-w32.el (find-file-not-found-set-buffer-file-coding-system):
* disp-table.el (describe-display-table):
* dired.el (dired-find-buffer-nocreate):
* dired-aux.el (dired-rename-subdir, dired-dwim-target-directory):
* dabbrev.el (dabbrev--same-major-mode-p):
* chistory.el (list-command-history):
* apropos.el (apropos-documentation):
* allout.el (allout-obtain-passphrase):
(allout-copy-exposed-to-buffer):
(allout-verify-passphrase): Use with-current-buffer.
2009-11-13 22:19:45 +00:00
|
|
|
(with-current-buffer other-buffer
|
1994-12-24 01:30:55 +00:00
|
|
|
major-mode)))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defun dabbrev--goto-start-of-abbrev ()
|
2021-09-22 18:26:40 +00:00
|
|
|
"Back over all abbrev type characters then move forward over all skip characters."
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Move backwards over abbrev chars
|
|
|
|
(save-match-data
|
2003-06-03 11:07:23 +00:00
|
|
|
(when (> (point) (minibuffer-prompt-end))
|
|
|
|
(forward-char -1)
|
|
|
|
(while (and (looking-at dabbrev--abbrev-char-regexp)
|
|
|
|
(> (point) (minibuffer-prompt-end))
|
|
|
|
(not (= (point) (field-beginning (point) nil
|
|
|
|
(1- (point))))))
|
|
|
|
(forward-char -1))
|
|
|
|
(or (looking-at dabbrev--abbrev-char-regexp)
|
|
|
|
(forward-char 1)))
|
1994-12-24 01:26:51 +00:00
|
|
|
(and dabbrev-abbrev-skip-leading-regexp
|
|
|
|
(while (looking-at dabbrev-abbrev-skip-leading-regexp)
|
|
|
|
(forward-char 1)))))
|
|
|
|
|
|
|
|
(defun dabbrev--abbrev-at-point ()
|
2009-11-25 05:31:05 +00:00
|
|
|
"Extract the symbol at point to serve as abbreviation."
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Check for error
|
1995-05-29 06:22:40 +00:00
|
|
|
(if (bobp)
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "No possible abbreviation preceding point"))
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Return abbrev at point
|
|
|
|
(save-excursion
|
1995-05-29 06:22:40 +00:00
|
|
|
;; Record the end of the abbreviation.
|
1994-12-24 01:26:51 +00:00
|
|
|
(setq dabbrev--last-abbrev-location (point))
|
1995-05-29 06:22:40 +00:00
|
|
|
;; If we aren't right after an abbreviation,
|
|
|
|
;; move point back to just after one.
|
|
|
|
;; This is so the user can get successive words
|
|
|
|
;; by typing the punctuation followed by M-/.
|
|
|
|
(save-match-data
|
|
|
|
(if (save-excursion
|
|
|
|
(forward-char -1)
|
2009-11-25 05:31:05 +00:00
|
|
|
(not (looking-at (or dabbrev-abbrev-char-regexp
|
|
|
|
"\\sw\\|\\s_"))))
|
1995-05-29 06:22:40 +00:00
|
|
|
(if (re-search-backward (or dabbrev-abbrev-char-regexp
|
|
|
|
"\\sw\\|\\s_")
|
|
|
|
nil t)
|
|
|
|
(forward-char 1)
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "No possible abbreviation preceding point"))))
|
1995-05-29 06:22:40 +00:00
|
|
|
;; Now find the beginning of that one.
|
|
|
|
(dabbrev--goto-start-of-abbrev)
|
1997-05-19 01:01:25 +00:00
|
|
|
(buffer-substring-no-properties
|
|
|
|
dabbrev--last-abbrev-location (point))))
|
1999-11-15 18:59:00 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
(defun dabbrev--reset-global-variables ()
|
2009-11-25 05:31:05 +00:00
|
|
|
"Initialize all global variables."
|
1994-12-24 01:26:51 +00:00
|
|
|
(setq dabbrev--last-table nil
|
|
|
|
dabbrev--last-abbreviation nil
|
|
|
|
dabbrev--last-abbrev-location nil
|
|
|
|
dabbrev--last-direction nil
|
|
|
|
dabbrev--last-expansion nil
|
|
|
|
dabbrev--last-expansion-location nil
|
|
|
|
dabbrev--friend-buffer-list nil
|
|
|
|
dabbrev--last-buffer nil
|
|
|
|
dabbrev--last-buffer-found nil
|
|
|
|
dabbrev--abbrev-char-regexp (or dabbrev-abbrev-char-regexp
|
|
|
|
"\\sw\\|\\s_")
|
2019-12-05 13:14:00 +00:00
|
|
|
dabbrev--check-other-buffers dabbrev-check-other-buffers
|
|
|
|
dabbrev--check-all-buffers dabbrev-check-all-buffers))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defun dabbrev--select-buffers ()
|
2001-06-20 11:03:58 +00:00
|
|
|
"Return a list of other buffers to search for a possible abbrev.
|
|
|
|
The current buffer is not included in the list.
|
|
|
|
|
2022-05-07 11:19:49 +00:00
|
|
|
This function makes a list of all the buffers returned by
|
|
|
|
`buffer-list', then discards buffers whose names match
|
|
|
|
`dabbrev-ignored-buffer-names' or
|
|
|
|
`dabbrev-ignored-buffer-regexps', and major modes that match
|
|
|
|
`dabbrev-ignored-buffer-modes'. It also discards buffers for
|
|
|
|
which `dabbrev-friend-buffer-function', if it is bound, returns
|
|
|
|
nil when called with the buffer as argument. It returns the list
|
|
|
|
of the buffers that are not discarded."
|
2001-06-20 11:03:58 +00:00
|
|
|
(dabbrev-filter-elements
|
2022-05-07 11:19:49 +00:00
|
|
|
buffer (dabbrev--filter-buffer-modes)
|
2001-06-20 11:03:58 +00:00
|
|
|
(and (not (eq (current-buffer) buffer))
|
|
|
|
(not (dabbrev--ignore-buffer-p buffer))
|
|
|
|
(boundp 'dabbrev-friend-buffer-function)
|
2001-06-21 07:42:04 +00:00
|
|
|
(funcall dabbrev-friend-buffer-function buffer))))
|
1994-12-24 01:30:55 +00:00
|
|
|
|
2022-05-07 11:19:49 +00:00
|
|
|
(defun dabbrev--filter-buffer-modes ()
|
|
|
|
(seq-filter (lambda (buffer)
|
|
|
|
(not (apply
|
|
|
|
#'provided-mode-derived-p
|
|
|
|
(buffer-local-value 'major-mode buffer)
|
|
|
|
dabbrev-ignored-buffer-modes)))
|
|
|
|
(buffer-list)))
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
(defun dabbrev--try-find (abbrev reverse n ignore-case)
|
2001-04-26 19:44:30 +00:00
|
|
|
"Search for ABBREV, backwards if REVERSE, N times.
|
|
|
|
If IGNORE-CASE is non-nil, ignore case while searching.
|
|
|
|
Return the expansion found, and save the location of the start
|
|
|
|
of the expansion in `dabbrev--last-expansion-location'."
|
1994-12-24 01:26:51 +00:00
|
|
|
(save-excursion
|
1995-05-15 23:16:08 +00:00
|
|
|
(save-restriction
|
|
|
|
(widen)
|
|
|
|
(let ((expansion nil))
|
|
|
|
(and dabbrev--last-expansion-location
|
|
|
|
(goto-char dabbrev--last-expansion-location))
|
|
|
|
(let ((case-fold-search ignore-case)
|
|
|
|
(count n))
|
|
|
|
(while (and (> count 0)
|
2012-03-12 13:03:10 +00:00
|
|
|
(setq expansion (dabbrev--search
|
|
|
|
abbrev reverse
|
|
|
|
(and ignore-case
|
|
|
|
(if (eq dabbrev-case-distinction
|
|
|
|
'case-replace)
|
|
|
|
case-replace
|
|
|
|
dabbrev-case-distinction)))))
|
1995-05-15 23:16:08 +00:00
|
|
|
(setq count (1- count))))
|
|
|
|
(and expansion
|
|
|
|
(setq dabbrev--last-expansion-location (point)))
|
|
|
|
expansion))))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defun dabbrev--find-all-expansions (abbrev ignore-case)
|
2001-04-26 19:44:30 +00:00
|
|
|
"Return a list of all possible expansions of ABBREV.
|
|
|
|
If IGNORE-CASE is non-nil, accept matches which differ in case."
|
1994-12-24 01:26:51 +00:00
|
|
|
(let ((all-expansions nil)
|
|
|
|
expansion)
|
|
|
|
(save-excursion
|
|
|
|
(goto-char (point-min))
|
|
|
|
(while (setq expansion (dabbrev--find-expansion abbrev -1 ignore-case))
|
1995-05-15 23:16:08 +00:00
|
|
|
(setq all-expansions (cons expansion all-expansions))))
|
1994-12-24 01:26:51 +00:00
|
|
|
all-expansions))
|
|
|
|
|
2001-04-27 15:28:38 +00:00
|
|
|
(defun dabbrev--ignore-buffer-p (buffer)
|
|
|
|
"Return non-nil if BUFFER should be ignored by dabbrev."
|
|
|
|
(let ((bn (buffer-name buffer)))
|
|
|
|
(or (member bn dabbrev-ignored-buffer-names)
|
|
|
|
(let ((tail dabbrev-ignored-buffer-regexps)
|
|
|
|
(match nil))
|
|
|
|
(while (and tail (not match))
|
|
|
|
(setq match (string-match (car tail) bn)
|
|
|
|
tail (cdr tail)))
|
|
|
|
match))))
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
(defun dabbrev--find-expansion (abbrev direction ignore-case)
|
2001-04-26 19:44:30 +00:00
|
|
|
"Find one occurrence of ABBREV, and return the expansion.
|
|
|
|
DIRECTION > 0 means look that many times backwards.
|
|
|
|
DIRECTION < 0 means look that many times forward.
|
|
|
|
DIRECTION = 0 means try both backward and forward.
|
|
|
|
IGNORE-CASE non-nil means ignore case when searching.
|
|
|
|
This sets `dabbrev--last-direction' to 1 or -1 according
|
|
|
|
to the direction in which the occurrence was actually found.
|
2003-02-04 11:26:42 +00:00
|
|
|
It sets `dabbrev--last-expansion-location' to the location
|
2001-04-26 19:44:30 +00:00
|
|
|
of the start of the occurrence."
|
2001-06-20 11:03:58 +00:00
|
|
|
(save-excursion
|
|
|
|
;; If we were scanning something other than the current buffer,
|
|
|
|
;; continue scanning there.
|
2024-05-25 07:33:07 +00:00
|
|
|
(when (buffer-live-p dabbrev--last-buffer)
|
2007-08-22 19:47:53 +00:00
|
|
|
(set-buffer dabbrev--last-buffer))
|
2001-06-20 11:03:58 +00:00
|
|
|
(or
|
|
|
|
;; ------------------------------------------
|
|
|
|
;; Look backward in current buffer.
|
|
|
|
;; ------------------------------------------
|
|
|
|
(and (not dabbrev-search-these-buffers-only)
|
|
|
|
(>= direction 0)
|
|
|
|
(setq dabbrev--last-direction (min 1 direction))
|
|
|
|
(dabbrev--try-find abbrev t
|
|
|
|
(max 1 direction)
|
|
|
|
ignore-case))
|
|
|
|
;; ------------------------------------------
|
|
|
|
;; Look forward in current buffer
|
|
|
|
;; or whatever buffer we were last scanning.
|
|
|
|
;; ------------------------------------------
|
|
|
|
(and (or (not dabbrev-search-these-buffers-only)
|
2024-05-25 07:33:07 +00:00
|
|
|
(buffer-live-p dabbrev--last-buffer))
|
2001-06-20 11:03:58 +00:00
|
|
|
(<= direction 0)
|
|
|
|
(setq dabbrev--last-direction -1)
|
|
|
|
(dabbrev--try-find abbrev nil
|
|
|
|
(max 1 (- direction))
|
|
|
|
ignore-case))
|
|
|
|
;; ------------------------------------------
|
|
|
|
;; Look in other buffers.
|
|
|
|
;; Always start at (point-min) and look forward.
|
|
|
|
;; ------------------------------------------
|
|
|
|
(progn
|
|
|
|
(setq dabbrev--last-direction -1)
|
2024-05-25 07:33:07 +00:00
|
|
|
(unless (buffer-live-p dabbrev--last-buffer)
|
2001-06-20 11:03:58 +00:00
|
|
|
;; If we have just now begun to search other buffers,
|
|
|
|
;; determine which other buffers we should check.
|
|
|
|
;; Put that list in dabbrev--friend-buffer-list.
|
2007-08-22 19:47:53 +00:00
|
|
|
(unless dabbrev--friend-buffer-list
|
|
|
|
(setq dabbrev--friend-buffer-list
|
2018-06-19 03:41:25 +00:00
|
|
|
(dabbrev--make-friend-buffer-list))
|
|
|
|
(setq dabbrev--progress-reporter
|
|
|
|
(make-progress-reporter
|
|
|
|
"Scanning for dabbrevs..."
|
|
|
|
(- (length dabbrev--friend-buffer-list)) 0 0 1 1.5))))
|
2022-05-10 03:09:15 +00:00
|
|
|
(let ((file-name (buffer-file-name))
|
|
|
|
file-name-buffer)
|
|
|
|
(unwind-protect
|
|
|
|
(progn
|
|
|
|
;; Include the file name components into the abbrev
|
|
|
|
;; list (because if you have a file name "foobar", it's
|
|
|
|
;; somewhat likely that you'll be talking about foobar
|
|
|
|
;; stuff in the file itself).
|
|
|
|
(when file-name
|
|
|
|
(setq file-name-buffer (generate-new-buffer " *abbrev-file*"))
|
|
|
|
(with-current-buffer file-name-buffer
|
|
|
|
(dolist (part (file-name-split file-name))
|
|
|
|
(insert part "\n")))
|
|
|
|
(setq dabbrev--friend-buffer-list
|
|
|
|
(append dabbrev--friend-buffer-list
|
|
|
|
(list file-name-buffer))))
|
|
|
|
;; Walk through the buffers till we find a match.
|
|
|
|
(let (expansion)
|
|
|
|
(while (and (not expansion) dabbrev--friend-buffer-list)
|
|
|
|
(setq dabbrev--last-buffer
|
|
|
|
(pop dabbrev--friend-buffer-list))
|
|
|
|
(set-buffer dabbrev--last-buffer)
|
|
|
|
(progress-reporter-update
|
|
|
|
dabbrev--progress-reporter
|
|
|
|
(- (length dabbrev--friend-buffer-list)))
|
|
|
|
(setq dabbrev--last-expansion-location (point-min))
|
|
|
|
(setq expansion (dabbrev--try-find
|
|
|
|
abbrev nil 1 ignore-case)))
|
|
|
|
(progress-reporter-done dabbrev--progress-reporter)
|
|
|
|
expansion))
|
|
|
|
(when (buffer-live-p file-name-buffer)
|
2022-05-13 12:29:48 +00:00
|
|
|
(kill-buffer file-name-buffer))
|
|
|
|
(setq dabbrev--friend-buffer-list
|
|
|
|
(seq-filter #'buffer-live-p
|
|
|
|
dabbrev--friend-buffer-list))))))))
|
2001-06-20 11:03:58 +00:00
|
|
|
|
|
|
|
;; Compute the list of buffers to scan.
|
|
|
|
;; If dabbrev-search-these-buffers-only, then the current buffer
|
|
|
|
;; is included in this list if it should be searched.
|
|
|
|
;; Otherwise, the current buffer is searched first specially.,
|
|
|
|
;; and it is not included in this list.
|
|
|
|
(defun dabbrev--make-friend-buffer-list ()
|
|
|
|
(let ((list (mapcar (function get-buffer)
|
|
|
|
dabbrev-search-these-buffers-only)))
|
|
|
|
(when (and (null dabbrev-search-these-buffers-only)
|
|
|
|
dabbrev--check-other-buffers
|
|
|
|
(or (eq dabbrev--check-other-buffers t)
|
|
|
|
(setq dabbrev--check-other-buffers
|
|
|
|
(y-or-n-p "Scan other buffers also? "))))
|
|
|
|
(setq list (funcall dabbrev-select-buffers-function))
|
|
|
|
;; If dabbrev-check-all-buffers, tack on all the other
|
|
|
|
;; buffers at the end of the list, except those which are
|
|
|
|
;; specifically to be ignored.
|
2019-12-05 13:14:00 +00:00
|
|
|
(if dabbrev--check-all-buffers
|
2001-06-20 11:03:58 +00:00
|
|
|
(setq list
|
|
|
|
(append list
|
2000-12-15 11:51:04 +00:00
|
|
|
(dabbrev-filter-elements
|
2022-05-07 11:19:49 +00:00
|
|
|
buffer (dabbrev--filter-buffer-modes)
|
2001-06-20 11:03:58 +00:00
|
|
|
(and (not (memq buffer list))
|
|
|
|
(not (dabbrev--ignore-buffer-p buffer)))))))
|
|
|
|
;; Remove the current buffer.
|
|
|
|
(setq list (delq (current-buffer) list)))
|
|
|
|
;; Move buffers in the list that are visible on the screen
|
|
|
|
;; to the front of the list, but don't add anything to the list.
|
|
|
|
(if list
|
|
|
|
(walk-windows (lambda (w)
|
|
|
|
(unless (eq w (selected-window))
|
|
|
|
(if (memq (window-buffer w) list)
|
|
|
|
(setq list
|
|
|
|
(cons (window-buffer w)
|
|
|
|
(delq (window-buffer w)
|
|
|
|
list))))))))
|
|
|
|
;; In a minibuffer, search the buffer it was activated from,
|
|
|
|
;; first after the minibuffer itself. Unless we aren't supposed
|
|
|
|
;; to search the current buffer either.
|
Do not call to `selected-window' where it is assumed by default.
Affected functions are `window-minibuffer-p', `window-dedicated-p',
`window-hscroll', `window-width', `window-height', `window-buffer',
`window-frame', `window-start', `window-point', `next-window'
and `window-display-table'.
* abbrev.el (abbrev--default-expand):
* bs.el (bs--show-with-configuration):
* buff-menu.el (Buffer-menu-mouse-select):
* calc/calc.el (calc):
* calendar/calendar.el (calendar-generate-window):
* calendar/diary-lib.el (diary-simple-display, diary-show-all-entries)
(diary-make-entry):
* comint.el (send-invisible, comint-dynamic-complete-filename)
(comint-dynamic-simple-complete, comint-dynamic-list-completions):
* completion.el (complete):
* dabbrev.el (dabbrev-expand, dabbrev--make-friend-buffer-list):
* disp-table.el (describe-current-display-table):
* doc-view.el (doc-view-insert-image):
* ebuff-menu.el (Electric-buffer-menu-mouse-select):
* ehelp.el (with-electric-help):
* emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* emacs-lisp/edebug.el (edebug-two-window-p, edebug-pop-to-buffer):
* emacs-lisp/helper.el (Helper-help-scroller):
* emulation/cua-base.el (cua--post-command-handler-1):
* eshell/esh-mode.el (eshell-output-filter):
* ffap.el (ffap-gnus-wrapper):
* help-macro.el (make-help-screen):
* hilit-chg.el (highlight-compare-buffers):
* hippie-exp.el (hippie-expand, try-expand-dabbrev-visible):
* hl-line.el (global-hl-line-highlight):
* icomplete.el (icomplete-simple-completing-p):
* isearch.el (isearch-done):
* jit-lock.el (jit-lock-stealth-fontify):
* mail/rmailsum.el (rmail-summary-scroll-msg-up):
* lisp/mouse-drag.el (mouse-drag-should-do-col-scrolling):
* mpc.el (mpc-tagbrowser, mpc):
* net/rcirc.el (rcirc-any-buffer):
* play/gomoku.el (gomoku-max-width, gomoku-max-height):
* play/landmark.el (landmark-max-width, landmark-max-height):
* play/zone.el (zone):
* progmodes/compile.el (compilation-goto-locus):
* progmodes/ebrowse.el (ebrowse-view/find-file-and-search-pattern):
* progmodes/etags.el (find-tag-other-window):
* progmodes/fortran.el (fortran-column-ruler):
* progmodes/gdb-mi.el (gdb-mouse-toggle-breakpoint-fringe):
* progmodes/verilog-mode.el (verilog-point-text):
* reposition.el (reposition-window):
* rot13.el (toggle-rot13-mode):
* server.el (server-switch-buffer):
* shell.el (shell-dynamic-complete-command)
(shell-dynamic-complete-environment-variable):
* simple.el (insert-buffer, set-selective-display)
(delete-completion-window):
* speedbar.el (speedbar-timer-fn, speedbar-center-buffer-smartly)
(speedbar-recenter):
* startup.el (fancy-splash-head):
* textmodes/ispell.el (ispell-command-loop):
* textmodes/makeinfo.el (makeinfo-compilation-sentinel-region):
* tutorial.el (help-with-tutorial):
* vc/add-log.el (add-change-log-entry):
* vc/compare-w.el (compare-windows):
* vc/ediff-help.el (ediff-indent-help-message):
* vc/ediff-util.el (ediff-setup-control-buffer, ediff-position-region):
* vc/ediff-wind.el (ediff-skip-unsuitable-frames)
(ediff-setup-control-frame):
* vc/emerge.el (emerge-position-region):
* vc/pcvs-util.el (cvs-bury-buffer):
* window.el (walk-windows, mouse-autoselect-window-select):
* winner.el (winner-set-conf, winner-undo): Related users changed.
2013-08-05 14:26:57 +00:00
|
|
|
(if (and (window-minibuffer-p)
|
2001-06-20 11:03:58 +00:00
|
|
|
(not dabbrev-search-these-buffers-only))
|
|
|
|
(setq list
|
|
|
|
(cons (dabbrev--minibuffer-origin)
|
|
|
|
(delq (dabbrev--minibuffer-origin) list))))
|
|
|
|
list))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
(defun dabbrev--safe-replace-match (string &optional fixedcase literal)
|
|
|
|
(if (eq major-mode 'picture-mode)
|
2003-08-17 00:16:25 +00:00
|
|
|
(with-no-warnings
|
|
|
|
(picture-replace-match string fixedcase literal))
|
1994-12-24 01:26:51 +00:00
|
|
|
(replace-match string fixedcase literal)))
|
|
|
|
|
|
|
|
;;;----------------------------------------------------------------
|
2000-12-15 11:51:04 +00:00
|
|
|
(defun dabbrev--substitute-expansion (old abbrev expansion record-case-pattern)
|
|
|
|
"Replace OLD with EXPANSION in the buffer.
|
|
|
|
OLD is text currently in the buffer, perhaps the abbreviation
|
|
|
|
or perhaps another expansion that was tried previously.
|
|
|
|
ABBREV is the abbreviation we are expanding.
|
|
|
|
It is \" \" if we are copying subsequent words.
|
|
|
|
EXPANSION is the expansion substring to be used this time.
|
|
|
|
RECORD-CASE-PATTERN, if non-nil, means set `dabbrev--last-case-pattern'
|
|
|
|
to record whether we upcased the expansion, downcased it, or did neither."
|
1994-12-24 01:26:51 +00:00
|
|
|
;;(undo-boundary)
|
2012-03-12 13:03:10 +00:00
|
|
|
(let ((use-case-replace
|
2012-05-04 19:17:01 +00:00
|
|
|
(and (dabbrev--ignore-case-p abbrev)
|
2012-03-12 13:03:10 +00:00
|
|
|
(if (eq dabbrev-case-replace 'case-replace)
|
|
|
|
case-replace
|
|
|
|
dabbrev-case-replace))))
|
2000-12-15 11:51:04 +00:00
|
|
|
|
|
|
|
;; If we upcased or downcased the original expansion,
|
|
|
|
;; do likewise for the subsequent words when we copy them.
|
2001-04-26 19:44:30 +00:00
|
|
|
;; Don't do any of the usual case processing, though.
|
|
|
|
(when (equal abbrev " ")
|
|
|
|
(if dabbrev--last-case-pattern
|
|
|
|
(setq expansion
|
|
|
|
(funcall dabbrev--last-case-pattern expansion)))
|
|
|
|
(setq use-case-replace nil))
|
2000-12-15 11:51:04 +00:00
|
|
|
|
1997-03-30 19:06:27 +00:00
|
|
|
;; If the expansion has mixed case
|
|
|
|
;; and it is not simply a capitalized word,
|
|
|
|
;; or if the abbrev has mixed case,
|
|
|
|
;; and if the given abbrev's case pattern
|
1996-07-21 23:45:15 +00:00
|
|
|
;; matches the start of the expansion,
|
|
|
|
;; copy the expansion's case
|
|
|
|
;; instead of downcasing all the rest.
|
2004-04-21 19:22:52 +00:00
|
|
|
;;
|
|
|
|
;; 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)
|
2012-03-12 13:03:10 +00:00
|
|
|
(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)))))
|
2004-04-21 19:22:52 +00:00
|
|
|
(string= abbrev
|
|
|
|
(substring expansion 0 (length abbrev)))))
|
1997-03-30 19:06:27 +00:00
|
|
|
(setq use-case-replace nil)))
|
2001-04-26 19:44:30 +00:00
|
|
|
|
|
|
|
;; 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.
|
2004-04-21 19:22:52 +00:00
|
|
|
;; The goal of this is to prevent that carrying forward.
|
2001-04-26 19:44:30 +00:00
|
|
|
(if (and (string= expansion (downcase expansion))
|
|
|
|
(string= abbrev (downcase abbrev)))
|
1996-08-01 04:54:51 +00:00
|
|
|
(setq use-case-replace nil))
|
2001-04-26 19:44:30 +00:00
|
|
|
|
1996-08-01 04:54:51 +00:00
|
|
|
(if use-case-replace
|
|
|
|
(setq expansion (downcase expansion)))
|
2000-12-15 11:51:04 +00:00
|
|
|
|
|
|
|
;; In case we insert subsequent words,
|
|
|
|
;; record if we upcased or downcased the first word,
|
|
|
|
;; in order to do likewise for subsequent words.
|
|
|
|
(and record-case-pattern
|
2003-02-04 11:26:42 +00:00
|
|
|
(setq dabbrev--last-case-pattern
|
2000-12-15 11:51:04 +00:00
|
|
|
(and use-case-replace
|
|
|
|
(cond ((equal abbrev (upcase abbrev)) 'upcase)
|
|
|
|
((equal abbrev (downcase abbrev)) 'downcase)))))
|
|
|
|
|
2003-01-06 01:19:59 +00:00
|
|
|
;; Convert whitespace to single spaces.
|
2007-05-10 14:46:52 +00:00
|
|
|
(if dabbrev-eliminate-newlines
|
|
|
|
(let ((pos
|
|
|
|
(if (equal abbrev " ") 0 (length abbrev))))
|
|
|
|
;; If ABBREV is real, search after the end of it.
|
|
|
|
;; If ABBREV is space and we are copying successive words,
|
|
|
|
;; search starting at the front.
|
2003-01-06 01:19:59 +00:00
|
|
|
(while (string-match "[\n \t]+" expansion pos)
|
|
|
|
(setq pos (1+ (match-beginning 0)))
|
|
|
|
(setq expansion (replace-match " " nil nil expansion)))))
|
2001-04-26 19:44:30 +00:00
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
(if old
|
|
|
|
(save-excursion
|
|
|
|
(search-backward old))
|
1998-03-14 04:43:03 +00:00
|
|
|
;;(set-match-data (list (point-marker) (point-marker)))
|
2001-04-26 19:44:30 +00:00
|
|
|
(search-backward abbrev)
|
|
|
|
(search-forward abbrev))
|
|
|
|
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Make case of replacement conform to case of abbreviation
|
|
|
|
;; provided (1) that kind of thing is enabled in this buffer
|
|
|
|
;; and (2) the replacement itself is all lower case.
|
|
|
|
(dabbrev--safe-replace-match expansion
|
|
|
|
(not use-case-replace)
|
2016-03-02 17:20:47 +00:00
|
|
|
t))
|
|
|
|
;; Return the expansion actually used.
|
|
|
|
expansion)
|
1994-12-24 01:26:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
;;;----------------------------------------------------------------
|
|
|
|
;;; Search function used by dabbrevs library.
|
|
|
|
|
|
|
|
|
|
|
|
(defun dabbrev--search (abbrev reverse ignore-case)
|
2001-04-26 19:44:30 +00:00
|
|
|
"Search for something that could be used to expand ABBREV.
|
|
|
|
|
|
|
|
Second arg, REVERSE, is t for reverse search, nil for forward.
|
|
|
|
The variable `dabbrev-limit' controls the maximum search region size.
|
|
|
|
Third argument IGNORE-CASE non-nil means treat case as insignificant while
|
|
|
|
looking for a match and when comparing with previous matches. Also if
|
|
|
|
that's non-nil and the match is found at the beginning of a sentence
|
|
|
|
and is in lower case except for the initial then it is converted to
|
|
|
|
all lower case for return.
|
|
|
|
|
|
|
|
Table of expansions already seen is examined in buffer
|
|
|
|
`dabbrev--last-table' so that only distinct possibilities are found
|
|
|
|
by dabbrev-re-expand.
|
|
|
|
|
|
|
|
Returns the expansion found, or nil if not found.
|
|
|
|
Leaves point at the location of the start of the expansion."
|
1994-12-24 01:26:51 +00:00
|
|
|
(save-match-data
|
|
|
|
(let ((pattern1 (concat (regexp-quote abbrev)
|
|
|
|
"\\(" dabbrev--abbrev-char-regexp "\\)"))
|
|
|
|
(pattern2 (concat (regexp-quote abbrev)
|
|
|
|
"\\(\\(" dabbrev--abbrev-char-regexp "\\)+\\)"))
|
2002-05-14 19:45:16 +00:00
|
|
|
found-string result)
|
1994-12-24 01:26:51 +00:00
|
|
|
;; Limited search.
|
|
|
|
(save-restriction
|
|
|
|
(and dabbrev-limit
|
2012-03-12 13:03:10 +00:00
|
|
|
(narrow-to-region
|
|
|
|
dabbrev--last-expansion-location
|
|
|
|
(+ (point) (if reverse (- dabbrev-limit) dabbrev-limit))))
|
1994-12-24 01:26:51 +00:00
|
|
|
;;--------------------------------
|
|
|
|
;; Look for a distinct expansion, using dabbrev--last-table.
|
|
|
|
;;--------------------------------
|
|
|
|
(while (and (not found-string)
|
|
|
|
(if reverse
|
|
|
|
(re-search-backward pattern1 nil t)
|
|
|
|
(re-search-forward pattern1 nil t)))
|
1995-07-17 22:48:39 +00:00
|
|
|
(goto-char (match-beginning 0))
|
|
|
|
;; In case we matched in the middle of a word,
|
|
|
|
;; back up to start of word and verify we still match.
|
|
|
|
(dabbrev--goto-start-of-abbrev)
|
|
|
|
|
|
|
|
(if (not (looking-at pattern1))
|
|
|
|
nil
|
|
|
|
;; We have a truly valid match. Find the end.
|
1994-12-24 01:26:51 +00:00
|
|
|
(re-search-forward pattern2)
|
2004-03-26 15:19:39 +00:00
|
|
|
(setq found-string (match-string-no-properties 0))
|
2002-05-14 19:45:16 +00:00
|
|
|
(setq result found-string)
|
1994-12-24 01:26:51 +00:00
|
|
|
(and ignore-case (setq found-string (downcase found-string)))
|
1995-07-17 22:48:39 +00:00
|
|
|
;; Ignore this match if it's already in the table.
|
1994-12-24 01:30:55 +00:00
|
|
|
(if (dabbrev-filter-elements
|
|
|
|
table-string dabbrev--last-table
|
|
|
|
(string= found-string table-string))
|
1995-07-17 22:48:39 +00:00
|
|
|
(setq found-string nil)))
|
|
|
|
;; Prepare to continue searching.
|
2004-03-26 15:19:39 +00:00
|
|
|
(goto-char (if reverse (match-beginning 0) (match-end 0))))
|
1995-07-17 22:48:39 +00:00
|
|
|
;; If we found something, use it.
|
2002-05-14 19:45:16 +00:00
|
|
|
(when found-string
|
|
|
|
;; Put it into `dabbrev--last-table'
|
|
|
|
;; and return it (either downcased, or as is).
|
|
|
|
(setq dabbrev--last-table
|
|
|
|
(cons found-string dabbrev--last-table))
|
|
|
|
result)))))
|
1994-12-24 01:26:51 +00:00
|
|
|
|
1992-09-15 02:36:36 +00:00
|
|
|
(provide 'dabbrev)
|
1994-12-24 01:30:55 +00:00
|
|
|
|
1996-01-14 07:34:30 +00:00
|
|
|
;;; dabbrev.el ends here
|