[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master f6c359cb66a: Fix bugs in dabbrev-expand (bug#74090)
From: |
Stephen Berman |
Subject: |
master f6c359cb66a: Fix bugs in dabbrev-expand (bug#74090) |
Date: |
Thu, 31 Oct 2024 05:46:36 -0400 (EDT) |
branch: master
commit f6c359cb66a0e9b851e3467b1ba9cab7efa8f744
Author: Stephen Berman <stephen.berman@gmx.net>
Commit: Stephen Berman <stephen.berman@gmx.net>
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.
---
lisp/dabbrev.el | 65 ++++++--
test/lisp/dabbrev-resources/INSTALL_BEGIN | 153 +++++++++++++++++++
test/lisp/dabbrev-resources/dabbrev-expand.el | 132 ++++++++++++++++
test/lisp/dabbrev-tests.el | 207 ++++++++++++++++++++++++++
4 files changed, 542 insertions(+), 15 deletions(-)
diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el
index 7b6cbb78cef..bbe6a64b626 100644
--- a/lisp/dabbrev.el
+++ b/lisp/dabbrev.el
@@ -464,8 +464,21 @@ direction of search to backward if set non-nil.
See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion]."
(interactive "*P")
- (let (abbrev record-case-pattern
- expansion old direction (orig-point (point)))
+ ;; 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)))
;; abbrev -- the abbrev to expand
;; expansion -- the expansion found (eventually) or nil until then
;; old -- the text currently in the buffer
@@ -480,6 +493,7 @@ See also `dabbrev-abbrev-char-regexp' and
\\[dabbrev-completion]."
(point)))))
;; Find a different expansion for the same abbrev as last time.
(progn
+ (setq dabbrev--last-buffer-found nil)
(setq abbrev dabbrev--last-abbreviation)
(setq old dabbrev--last-expansion)
(setq direction dabbrev--last-direction))
@@ -488,7 +502,14 @@ See also `dabbrev-abbrev-char-regexp' and
\\[dabbrev-completion]."
(if (and (eq (preceding-char) ?\s)
(markerp dabbrev--last-abbrev-location)
(marker-position dabbrev--last-abbrev-location)
- (= (point) (1+ dabbrev--last-abbrev-location)))
+ ;; 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))
(progn
;; The "abbrev" to expand is just the space.
(setq abbrev " ")
@@ -549,29 +570,43 @@ See also `dabbrev-abbrev-char-regexp' and
\\[dabbrev-completion]."
(if old " further" "") abbrev))
(t
(if (not (or (eq dabbrev--last-buffer dabbrev--last-buffer-found)
- (minibuffer-window-active-p (selected-window))))
+ ;; 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)))))
(progn
(when (buffer-name dabbrev--last-buffer)
(message "Expansion found in `%s'"
(buffer-name dabbrev--last-buffer)))
(setq dabbrev--last-buffer-found dabbrev--last-buffer))
(message nil))
- (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)))
+ ;; 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))))
;; Success: stick it in and return.
(setq buffer-undo-list (cons orig-point buffer-undo-list))
(setq expansion (dabbrev--substitute-expansion old abbrev expansion
record-case-pattern))
- ;; Save state for re-expand.
- (setq dabbrev--last-expansion expansion)
- (setq dabbrev--last-abbreviation abbrev)
- (setq dabbrev--last-abbrev-location (point-marker))))))
+ ;; 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)))))))
;;----------------------------------------------------------------
;; Local functions
diff --git a/test/lisp/dabbrev-resources/INSTALL_BEGIN
b/test/lisp/dabbrev-resources/INSTALL_BEGIN
new file mode 100644
index 00000000000..6309419dccf
--- /dev/null
+++ b/test/lisp/dabbrev-resources/INSTALL_BEGIN
@@ -0,0 +1,153 @@
+GNU Emacs Installation Guide
+Copyright (C) 1992, 1994, 1996-1997, 2000-2024 Free Software Foundation,
+Inc.
+See the end of the file for license conditions.
+
+
+This file contains general information on building GNU Emacs. If you
+are building an Emacs release tarball on a Unix or a GNU system, the
+instructions in this file should be sufficient. For other
+configurations, we have additional specialized files:
+
+ . INSTALL.REPO if you build from a Git checkout
+ . nt/INSTALL if you build for MS-Windows
+ . nextstep/INSTALL if you build for GNUstep/macOS
+ . java/INSTALL if you build for Android
+ . msdos/INSTALL if you build for MS-DOS
+
+
+BASIC INSTALLATION
+
+On most Unix systems, you build Emacs by first running the 'configure'
+shell script. This attempts to deduce the correct values for
+various system-dependent variables and features, and find the
+directories where certain system headers and libraries are kept.
+In a few cases, you may need to explicitly tell configure where to
+find some things, or what options to use.
+
+'configure' creates a 'Makefile' in several subdirectories, and a
+'src/config.h' file containing system-dependent definitions.
+Running the 'make' utility then builds the package for your system.
+
+Building Emacs requires GNU make, <https://www.gnu.org/software/make/>.
+On most systems that Emacs supports, this is the default 'make' program.
+
+Here's the procedure to build Emacs using 'configure' on systems which
+are supported by it. In some cases, if the simplified procedure fails,
+you might need to use various non-default options, and maybe perform
+some of the steps manually. The more detailed description in the other
+sections of this guide will help you do that, so please refer to those
+sections if you need to.
+
+ 1. Obtain and unpack the Emacs release, with commands like this:
+
+ wget https://ftp.gnu.org/gnu/emacs/emacs-VERSION.tar.xz
+ tar -xf emacs-VERSION.tar.xz
+
+ where VERSION is the Emacs version number.
+
+ 2a. 'cd' to the directory where you unpacked Emacs and invoke the
+ 'configure' script:
+
+ ./configure
+
+ 2b. Alternatively, create a separate directory, outside the source
+ directory, where you want to build Emacs, and invoke 'configure'
+ from there:
+
+ SOURCE-DIR/configure
+
+ where SOURCE-DIR is the top-level Emacs source directory.
+
+ 2c. If you don't have write access to the default directory where
+ Emacs and its data files will be installed, specify an alternative
+ installation directory:
+
+ ./configure --prefix=/SOME/OTHER/DIRECTORY
+
+ where /SOME/OTHER/DIRECTORY is a directory writable by your user,
+ for example, a subdirectory of your home directory.
+
+ 3. When 'configure' finishes, it prints several lines of details
+ about the system configuration. Read those details carefully
+ looking for anything suspicious, such as wrong CPU and operating
+ system names, wrong places for headers or libraries, missing
+ libraries that you know are installed on your system, etc.
+
+ If you find anything wrong, you may have to pass to 'configure'
+ one or more options specifying the explicit machine configuration
+ name, where to find various headers and libraries, etc.
+ Refer to the section DETAILED BUILDING AND INSTALLATION below.
+
+ If 'configure' didn't find some image support libraries, such as
+ Xpm and jpeg, refer to "Image support libraries" below.
+
+ If the details printed by 'configure' don't make any sense to
+ you, but there are no obvious errors, assume that 'configure' did
+ its job and proceed.
+
+ 4. Invoke the 'make' program:
+
+ make
+
+ 5. If 'make' succeeds, it will build an executable program 'emacs'
+ in the 'src' directory. You can try this program, to make sure
+ it works:
+
+ src/emacs -Q
+
+ To test Emacs further (intended mostly to help developers):
+
+ make check
+
+ 6. Assuming that the program 'src/emacs' starts and displays its
+ opening screen, you can install the program and its auxiliary
+ files into their installation directories:
+
+ make install
+
+ You are now ready to use Emacs. If you wish to conserve space,
+ you may remove the program binaries and object files from the
+ directory where you built Emacs:
+
+ make clean
+
+ You can delete the entire build directory if you do not plan to
+ build Emacs again, but it can be useful to keep for debugging.
+ If you want to build Emacs again with different configure options,
+ first clean the source directories:
+
+ make distclean
+
+ Note that the install automatically saves space by compressing
+ (provided you have the 'gzip' program) those installed Lisp source (.el)
+ files that have corresponding .elc versions, as well as the Info files.
+
+ You can read a brief summary about common make targets:
+
+ make help
+
+
+ADDITIONAL DISTRIBUTION FILES
+
+* Complex Text Layout support libraries
+
+On GNU and Unix systems, Emacs needs optional libraries to correctly
+display such complex scripts as Indic and Khmer, and also for scripts
+that require Arabic shaping support (Arabic and Farsi). If the
+HarfBuzz library is installed, Emacs will build with it and use it for
+this purpose. HarfBuzz is the preferred shaping engine, both on Posix
+hosts and on MS-Windows, so we recommend installing it before building
+Emacs. The alternative for GNU/Linux and Posix systems is to use the
+"m17n-db", "libm17n-flt", and "libotf" libraries. (On some systems,
+particularly GNU/Linux, these libraries may be already present or
+available as additional packages.) Note that if there is a separate
+'dev' or 'devel' package, for use at compilation time rather than run
+time, you will need that as well as the corresponding run time
+package; typically the dev package will contain header files and a
+library archive. On MS-Windows, if HarfBuzz is not available, Emacs
+will use the Uniscribe shaping engine that is part of the OS.
+
+Note that Emacs cannot support complex scripts on a TTY, unless the
+terminal includes such a support. However, most modern terminal
+emulators, such as xterm, do support such scripts.
diff --git a/test/lisp/dabbrev-resources/dabbrev-expand.el
b/test/lisp/dabbrev-resources/dabbrev-expand.el
new file mode 100644
index 00000000000..c986b0ed633
--- /dev/null
+++ b/test/lisp/dabbrev-resources/dabbrev-expand.el
@@ -0,0 +1,132 @@
+(defun dabbrev-expand (arg)
+ "Expand previous word \"dynamically\".
+
+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
+`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
+by `dabbrev-ignored-buffer-names' and `dabbrev-ignored-buffer-regexps'.
+
+A positive prefix argument, N, says to take the Nth backward *distinct*
+possibility. A negative argument says search forward.
+
+If the cursor has not moved from the end of the previous expansion and
+no argument is given, replace the previously-made expansion
+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.
+
+See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion]."
+ (interactive "*P")
+ (let (abbrev record-case-pattern
+ expansion old direction (orig-point (point)))
+ ;; 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)
+ (markerp dabbrev--last-abbrev-location)
+ (marker-position dabbrev--last-abbrev-location)
+ (or (eq last-command this-command)
+ (and (window-minibuffer-p)
+ (= dabbrev--last-abbrev-location
+ (point)))))
+ ;; Find a different expansion for the same abbrev as last time.
+ (progn
+ (setq abbrev dabbrev--last-abbreviation)
+ (setq old dabbrev--last-expansion)
+ (setq direction dabbrev--last-direction))
+ ;; If the user inserts a space after expanding
+ ;; and then asks to expand again, always fetch the next word.
+ (if (and (eq (preceding-char) ?\s)
+ (markerp dabbrev--last-abbrev-location)
+ (marker-position dabbrev--last-abbrev-location)
+ (= (point) (1+ dabbrev--last-abbrev-location)))
+ (progn
+ ;; The "abbrev" to expand is just the space.
+ (setq abbrev " ")
+ (save-excursion
+ (save-restriction
+ (widen)
+ (if (buffer-live-p 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))
+
+ ;; 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))
+ (setq record-case-pattern t)
+ (setq old nil)))
+
+ ;;--------------------------------
+ ;; Find the expansion
+ ;;--------------------------------
+ (or expansion
+ (setq expansion
+ (dabbrev--find-expansion
+ abbrev direction
+ (dabbrev--ignore-case-p abbrev)))))
+ (cond
+ ((not expansion)
+ (dabbrev--reset-global-variables)
+ (if old
+ (save-excursion
+ (setq buffer-undo-list (cons orig-point buffer-undo-list))
+ ;; Put back the original abbrev with its original case pattern.
+ (search-backward old)
+ (insert abbrev)
+ (delete-region (point) (+ (point) (length old)))))
+ (user-error "No%s dynamic expansion for `%s' found"
+ (if old " further" "") abbrev))
+ (t
+ (if (not (or (eq dabbrev--last-buffer dabbrev--last-buffer-found)
+ (minibuffer-window-active-p (selected-window))))
+ (progn
+ (when (buffer-name dabbrev--last-buffer)
+ (message "Expansion found in `%s'"
+ (buffer-name dabbrev--last-buffer)))
+ (setq dabbrev--last-buffer-found dabbrev--last-buffer))
+ (message nil))
+ (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)))
+ ;; Success: stick it in and return.
+ (setq buffer-undo-list (cons orig-point buffer-undo-list))
+ (setq expansion (dabbrev--substitute-expansion old abbrev expansion
+ record-case-pattern))
+
+ ;; Save state for re-expand.
+ (setq dabbrev--last-expansion expansion)
+ (setq dabbrev--last-abbreviation abbrev)
+ (setq dabbrev--last-abbrev-location (point-marker))))))
diff --git a/test/lisp/dabbrev-tests.el b/test/lisp/dabbrev-tests.el
index c7574403949..987106aa5af 100644
--- a/test/lisp/dabbrev-tests.el
+++ b/test/lisp/dabbrev-tests.el
@@ -25,6 +25,7 @@
;;; Code:
(require 'ert)
+(require 'ert-x)
(require 'dabbrev)
(ert-deftest dabbrev-expand-test ()
@@ -68,4 +69,210 @@ multiple expansions."
(execute-kbd-macro (kbd "C-u C-u C-M-/")))
(should (string= (buffer-string) "abc\na")))))
+(defmacro with-dabbrev-test (&rest body)
+ "Set up an isolated `dabbrev' test environment."
+ (declare (debug (body)))
+ `(ert-with-temp-directory dabbrev-test-home
+ (let* (;; Since we change HOME, clear this to avoid a conflict
+ ;; e.g. if Emacs runs within the user's home directory.
+ (abbreviated-home-dir nil)
+ (process-environment (cons (format "HOME=%s" dabbrev-test-home)
+ process-environment))
+ (dabbrev-directory (ert-resource-directory)))
+ (unwind-protect
+ (progn ,@body)
+ ;; Restore pre-test-run state of test files.
+ (dolist (f (directory-files dabbrev-directory))
+ (let ((buf (get-file-buffer f)))
+ (when buf
+ (with-current-buffer buf
+ (restore-buffer-modified-p nil)
+ (kill-buffer)))))
+ (dabbrev--reset-global-variables)))))
+
+(ert-deftest dabbrev-expand-test-same-buffer-1 ()
+ "Test expanding a string twice within a single buffer.
+The first expansion should expand the input (a prefix-string) to a
+string in the buffer containing no whitespace character, the second
+expansion, after adding a space to the first expansion, should extend
+the string with the following string in the buffer up to the next
+whitespace character."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-max))
+ (terpri)
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic and"))))
+
+(ert-deftest dabbrev-expand-test-same-buffer-2 ()
+ "Test expanding a string plus space twice within a single buffer.
+Each expansion should extend the string with the following string in the
+buffer up to the next whitespace character."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-max))
+ (terpri)
+ (execute-kbd-macro (kbd "Indic SPC M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic and"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic and
Khmer"))))
+
+(ert-deftest dabbrev-expand-test-same-buffer-3 ()
+ "Test replacing an expansion within a single buffer."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-max))
+ (terpri)
+ (insert-file-contents (ert-resource-file "dabbrev-expand.el"))
+ (goto-char (point-max))
+ (terpri)
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indicate"))
+ (kill-whole-line)
+ (execute-kbd-macro (kbd "Ind M-/ M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic and"))))
+
+(ert-deftest dabbrev-expand-test-same-buffer-4 ()
+ "Test expanding a string in a narrowed-region."
+ (with-dabbrev-test
+ (let (disabled-command-function) ; Enable narrow-to-region.
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-min))
+ (execute-kbd-macro (kbd "C-s Ind M-a C-SPC M-} C-x n n"))
+ (goto-char (point-max))
+ (terpri)
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-substring (pos-bol) (pos-eol)) "Indic and")))))
+
+(ert-deftest dabbrev-expand-test-other-buffer-1 ()
+ "Test expanding a prefix string to a string from another buffer."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (switch-to-buffer (get-buffer-create "a" t))
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-string) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-string) "Indic and"))
+ (kill-buffer "a")))
+
+(ert-deftest dabbrev-expand-test-other-buffer-2 ()
+ "Test expanding a string + space to a string from another buffer."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (switch-to-buffer (get-buffer-create "a" t))
+ (execute-kbd-macro (kbd "Indic SPC M-/"))
+ (should (string= (buffer-string) "Indic and"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-string) "Indic and Khmer"))
+ (kill-buffer "a")))
+
+(ert-deftest dabbrev-expand-test-other-buffer-3 ()
+ "Test replacing an expansion with three different buffers.
+A prefix string in a buffer should find the first expansion in a
+different buffer and then find a replacement expansion is yet another
+buffer."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (find-file (ert-resource-file "dabbrev-expand.el"))
+ (switch-to-buffer (get-buffer-create "a" t))
+ (emacs-lisp-mode)
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-string) "Indicate"))
+ (erase-buffer)
+ (execute-kbd-macro (kbd "Ind M-/ M-/"))
+ (should (string= (buffer-string) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-string) "Indic and"))
+ (kill-buffer "a")))
+
+(ert-deftest dabbrev-expand-test-other-buffer-4 ()
+ "Test expanding a string using another narrowed buffer."
+ (with-dabbrev-test
+ (let (disabled-command-function) ; Enable narrow-to-region.
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-min))
+ (execute-kbd-macro (kbd "C-s Ind M-a C-SPC M-} C-x n n"))
+ (switch-to-buffer (get-buffer-create "a" t))
+ (execute-kbd-macro (kbd "Ind M-/"))
+ (should (string= (buffer-string) "Indic"))
+ (execute-kbd-macro (kbd "SPC M-/"))
+ (should (string= (buffer-string) "Indic and"))
+ (kill-buffer "a"))))
+
+(ert-deftest dabbrev-expand-test-minibuffer-1 ()
+ "Test expanding a prefix string twice in the minibuffer.
+Both expansions should come from the buffer from which the minibuffer
+was entered."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (with-selected-window (minibuffer-window)
+ (insert "Ind")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic"))
+ (insert " ")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic and"))
+ (delete-minibuffer-contents))))
+
+(ert-deftest dabbrev-expand-test-minibuffer-2 ()
+ "Test expanding a string + space in the minibuffer.
+The expansions should come from the buffer from which the minibuffer was
+entered."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (with-selected-window (minibuffer-window)
+ (insert "Indic ")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic and"))
+ (insert " ")
+ (dabbrev-expand nil)
+ (should (string= (buffer-string) "Indic and Khmer"))
+ (delete-minibuffer-contents))))
+
+;; FIXME: Why is dabbrev--reset-global-variables needed here?
+(ert-deftest dabbrev-expand-test-minibuffer-3 ()
+ "Test replacing an expansion in the minibuffer using two buffers.
+The first expansion should befound in the buffer from which the
+minibuffer was entered, the replacement should found in another buffer."
+ (with-dabbrev-test
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (find-file (ert-resource-file "dabbrev-expand.el"))
+ (with-selected-window (minibuffer-window)
+ (insert "Ind")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indicate"))
+ (kill-whole-line)
+ (dabbrev--reset-global-variables)
+ (insert "Ind")
+ (dabbrev-expand nil)
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic"))
+ (dabbrev--reset-global-variables)
+ (insert " ")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic and"))
+ (delete-minibuffer-contents))))
+
+(ert-deftest dabbrev-expand-test-minibuffer-4 ()
+ "Test expansion in the minibuffer using another narrowed buffer."
+ (with-dabbrev-test
+ (let (disabled-command-function) ; Enable narrow-to-region.
+ (find-file (ert-resource-file "INSTALL_BEGIN"))
+ (goto-char (point-min))
+ (execute-kbd-macro (kbd "C-s Ind M-a C-SPC M-} C-x n n")))
+ (with-selected-window (minibuffer-window)
+ (insert "Ind")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic"))
+ (insert " ")
+ (dabbrev-expand nil)
+ (should (string= (minibuffer-contents) "Indic and"))
+ (delete-minibuffer-contents))))
+
;;; dabbrev-tests.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master f6c359cb66a: Fix bugs in dabbrev-expand (bug#74090),
Stephen Berman <=