summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2018-09-15 09:20:32 -0700
committerGlenn Morris <rgm@gnu.org>2018-09-15 09:20:32 -0700
commit9e79d59790809387707852e6d1b691d1bfbf2327 (patch)
treeb18125d7befbcdad78f2cafb805d0db45c030318
parentffbe561ee5acb0b9edc5f4c995c287fb2485c315 (diff)
parente133b630625d6e5791c8b491c1cf3252cdb97080 (diff)
downloademacs-9e79d59790809387707852e6d1b691d1bfbf2327.tar.gz
Merge from origin/emacs-26
e133b63 (origin/emacs-26) Avoid adverse side effects of fixing bug#21824 cc8f334 Document changes called out in NEWS 20ecc52 ; * etc/NEWS: Document recent change in 'thing-at-point'. 1fc5283 ; INSTALL: Fix a typo in the last commit. 24f240d Tiny doc updates re yum/dnf etc 41c2d25 Remove unused variable 1e3b3fa Fix (thing-at-point 'list) regression (Bug#31772) 219893a Clarify meaning of '*' 41cdda2 * etc/PROBLEMS: Document Ubuntu 16.04 issue. 1c22f03 Increase default value for imenu-auto-rescan-maxout ee84389 Improve recent change to ELisp manual ff374e4 * doc/lispref/display.texi (SVG Images): Improve wording. 3a0caf6 * doc/lispref/display.texi (SVG Images): Fix a typo. (Bug#32... Conflicts: doc/lispref/lists.texi etc/NEWS
-rw-r--r--INSTALL5
-rw-r--r--doc/emacs/programs.texi4
-rw-r--r--doc/lispref/commands.texi7
-rw-r--r--doc/lispref/display.texi48
-rw-r--r--doc/lispref/lists.texi2
-rw-r--r--doc/lispref/minibuf.texi55
-rw-r--r--doc/misc/dired-x.texi3
-rw-r--r--doc/misc/efaq.texi5
-rw-r--r--etc/NEWS.266
-rw-r--r--etc/PROBLEMS9
-rw-r--r--lisp/imenu.el8
-rw-r--r--lisp/progmodes/prolog.el6
-rw-r--r--lisp/thingatpt.el27
-rw-r--r--src/buffer.c24
-rw-r--r--test/lisp/thingatpt-tests.el72
-rw-r--r--test/src/buffer-tests.el19
16 files changed, 192 insertions, 108 deletions
diff --git a/INSTALL b/INSTALL
index ab2e800e676..0c56fff6d4a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -202,8 +202,9 @@ The names of the packages that you need varies according to the
GNU/Linux distribution that you use, and the options that you want to
configure Emacs with. On Debian-based systems, you can install all the
packages needed to build the installed version of Emacs with a command
-like 'apt-get build-dep emacs24'. On Red Hat systems, the
-corresponding command is 'yum-builddep emacs'.
+like 'apt-get build-dep emacs' (on older systems, replace 'emacs' with
+eg 'emacs25'). On Red Hat-based systems, the corresponding command is
+'dnf builddep emacs' (on older systems, use 'yum-builddep' instead).
DETAILED BUILDING AND INSTALLATION:
diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi
index c72558ce9a7..cfeb61e44d4 100644
--- a/doc/emacs/programs.texi
+++ b/doc/emacs/programs.texi
@@ -274,6 +274,10 @@ Rescanning happens automatically if you set @code{imenu-auto-rescan} to
a non-@code{nil} value. There is no need to rescan because of small
changes in the text.
+@vindex imenu-auto-rescan-maxout
+ @code{imenu-auto-rescan} will be disabled in buffers that are larger
+than @code{imenu-auto-rescan-maxout} in bytes.
+
@vindex imenu-sort-function
You can customize the way the menus are sorted by setting the
variable @code{imenu-sort-function}. By default, names are ordered as
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 3e74f05e4c8..49c839a8971 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -1075,12 +1075,13 @@ the current Emacs session. If a symbol has not yet been so used,
@subsection Keyboard Events
@cindex keyboard events
+@cindex character event
There are two kinds of input you can get from the keyboard: ordinary
keys, and function keys. Ordinary keys correspond to (possibly
modified) characters; the events they generate are represented in Lisp
-as characters. The event type of a character event is the character
-itself (an integer), which might have some modifier bits set; see
-@ref{Classifying Events}.
+as characters. The event type of a @dfn{character event} is the
+character itself (an integer), which might have some modifier bits
+set; see @ref{Classifying Events}.
@cindex modifier bits (of input character)
@cindex basic code (of input character)
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index ea9a305ae2a..9a6fb422f01 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -5442,7 +5442,8 @@ Specifies a rotation angle in degrees.
SVG (Scalable Vector Graphics) is an XML format for specifying images.
If your Emacs build has SVG support, you can create and manipulate
-these images with the following functions.
+these images with the following functions from the @file{svg.el}
+library.
@defun svg-create width height &rest args
Create a new, empty SVG image with the specified dimensions.
@@ -5456,8 +5457,11 @@ The default width (in pixels) of any lines created.
The default stroke color on any lines created.
@end table
-This function returns an SVG structure, and all the following functions
-work on that structure.
+@cindex SVG object
+This function returns an @dfn{SVG object}, a Lisp data structure that
+specifies an SVG image, and all the following functions work on that
+structure. The argument @var{svg} in the following functions
+specifies such an SVG object.
@end defun
@defun svg-gradient svg id type stops
@@ -5501,8 +5505,8 @@ gradient object.
@end table
@defun svg-rectangle svg x y width height &rest args
-Add a rectangle to @var{svg} where the upper left corner is at
-position @var{x}/@var{y} and is of size @var{width}/@var{height}.
+Add to @var{svg} a rectangle whose upper left corner is at
+position @var{x}/@var{y} and whose size is @var{width}/@var{height}.
@lisp
(svg-rectangle svg 100 100 500 500 :gradient "gradient1")
@@ -5510,24 +5514,24 @@ position @var{x}/@var{y} and is of size @var{width}/@var{height}.
@end defun
@defun svg-circle svg x y radius &rest args
-Add a circle to @var{svg} where the center is at @var{x}/@var{y}
-and the radius is @var{radius}.
+Add to @var{svg} a circle whose center is at @var{x}/@var{y} and whose
+radius is @var{radius}.
@end defun
@defun svg-ellipse svg x y x-radius y-radius &rest args
-Add a circle to @var{svg} where the center is at @var{x}/@var{y} and
-the horizontal radius is @var{x-radius} and the vertical radius is
+Add to @var{svg} an ellipse whose center is at @var{x}/@var{y}, and
+whose horizontal radius is @var{x-radius} and the vertical radius is
@var{y-radius}.
@end defun
@defun svg-line svg x1 y1 x2 y2 &rest args
-Add a line to @var{svg} that starts at @var{x1}/@var{y1} and extends
+Add to @var{svg} a line that starts at @var{x1}/@var{y1} and extends
to @var{x2}/@var{y2}.
@end defun
@defun svg-polyline svg points &rest args
-Add a multiple segment line to @var{svg} that goes through
-@var{points}, which is a list of X/Y position pairs.
+Add to @var{svg} a multiple-segment line (a.k.a.@: ``polyline'') that
+goes through @var{points}, which is a list of X/Y position pairs.
@lisp
(svg-polyline svg '((200 . 100) (500 . 450) (80 . 100))
@@ -5541,12 +5545,12 @@ that describe the outer circumference of the polygon.
@lisp
(svg-polygon svg '((100 . 100) (200 . 150) (150 . 90))
- :stroke-color "blue" :fill-color "red"")
+ :stroke-color "blue" :fill-color "red")
@end lisp
@end defun
@defun svg-text svg text &rest args
-Add a text to @var{svg}.
+Add the specified @var{text} to @var{svg}.
@lisp
(svg-text
@@ -5565,9 +5569,9 @@ Add a text to @var{svg}.
@defun svg-embed svg image image-type datap &rest args
Add an embedded (raster) image to @var{svg}. If @var{datap} is
-@code{nil}, @var{IMAGE} should be a file name; if not, it should be a
-binary string containing the image data. @var{image-type} should be a
-@acronym{MIME} image type, for instance @samp{"image/jpeg"}.
+@code{nil}, @var{image} should be a file name; otherwise it should be a
+string containing the image data as raw bytes. @var{image-type} should be a
+@acronym{MIME} image type, for instance @code{"image/jpeg"}.
@lisp
(svg-embed svg "~/rms.jpg" "image/jpeg" nil
@@ -5580,10 +5584,14 @@ binary string containing the image data. @var{image-type} should be a
Remove the element with identifier @code{id} from the @code{svg}.
@end defun
-Finally, the @code{svg-image} takes an SVG object as its parameter and
+@defun svg-image svg
+Finally, the @code{svg-image} takes an SVG object as its argument and
returns an image object suitable for use in functions like
-@code{insert-image}. Here's a complete example that creates and
-inserts an image with a circle:
+@code{insert-image}.
+@end defun
+
+Here's a complete example that creates and inserts an image with a
+circle:
@lisp
(let ((svg (svg-create 400 400 :stroke-width 10)))
diff --git a/doc/lispref/lists.texi b/doc/lispref/lists.texi
index b7bb3cf6be1..1548dd49b2f 100644
--- a/doc/lispref/lists.texi
+++ b/doc/lispref/lists.texi
@@ -1755,7 +1755,7 @@ alist
@defun assoc-delete-all key alist &optional test
This function is like @code{assq-delete-all} except that it accepts
an optional argument @var{test}, a predicate function to compare the
-keys in @var{alist}. If omitted or @code{nil}, @var{test} defaults to
+keys in @var{alist}. If omitted or @code{nil}, @var{test} defaults to
@code{equal}. As @code{assq-delete-all}, this function often modifies
the original list structure of @var{alist}.
@end defun
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index da3ebd89aa2..55fde747592 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -26,7 +26,7 @@ argument.
* Initial Input:: Specifying initial contents for the minibuffer.
* Completion:: How to invoke and customize completion.
* Yes-or-No Queries:: Asking a question with a simple answer.
-* Multiple Queries:: Asking a series of similar questions.
+* Multiple Queries:: Asking complex questions.
* Reading a Password:: Reading a password from the terminal.
* Minibuffer Commands:: Commands used as key bindings in minibuffers.
* Minibuffer Windows:: Operating on the special minibuffer windows.
@@ -2090,9 +2090,12 @@ Do you really want to remove everything? (yes or no)
@end defun
@node Multiple Queries
-@section Asking Multiple Y-or-N Questions
-@cindex multiple yes-or-no questions
+@section Asking Multiple-Choice Questions
+
+ This section describes facilities for asking the user more complex
+questions or several similar questions.
+@cindex multiple yes-or-no questions
When you have a series of similar questions to ask, such as ``Do you
want to save this buffer?'' for each buffer in turn, you should use
@code{map-y-or-n-p} to ask the collection of questions, rather than
@@ -2186,6 +2189,52 @@ The return value of @code{map-y-or-n-p} is the number of objects acted on.
@c FIXME An example of this would be more useful than all the
@c preceding examples of simple things.
+If you need to ask the user a question that might have more than just
+2 answers, use @code{read-answer}.
+
+@defun read-answer question answers
+@vindex read-answer-short
+This function prompts the user with text in @var{question}, which
+should end in the @samp{SPC} character. The function includes in the
+prompt the possible responses in @var{answers} by appending them to
+the end of @var{question}. The possible responses are provided in
+@var{answers} as an alist whose elements are of the following form:
+
+@lisp
+(@var{long-answer} @var{short-answer} @var{help-message})
+@end lisp
+
+@noindent
+where @var{long-answer} is the complete text of the user response, a
+string; @var{short-answer} is a short form of the same response, a
+single character; and @var{help-message} is the text that describes
+the meaning of the answer. If the variable @code{read-answer-short}
+is non-@code{nil}, the prompt will show the short variants of the
+possible answers and the user is expected to type the single
+characters shown in the prompt; otherwise the prompt will show the
+long variants of the answers, and the user is expected to type the
+full text of one of the answers and end by pressing @key{RET}. If
+@code{use-dialog-box} is non-@code{nil}, and this function was invoked
+by mouse events, the question and the answers will be displayed in a
+GUI dialog box.
+
+The function returns the text of the @var{long-answer} selected by the
+user, regardless of whether long or short answers were shown in the
+prompt and typed by the user.
+
+Here is an example of using this function:
+
+@lisp
+(let ((read-answer-short t))
+ (read-answer "Foo "
+ '(("yes" ?y "perform the action")
+ ("no" ?n "skip to the next")
+ ("all" ?! "perform for the rest without more questions")
+ ("help" ?h "show help")
+ ("quit" ?q "exit"))))
+@end lisp
+@end defun
+
@node Reading a Password
@section Reading a Password
@cindex passwords, reading
diff --git a/doc/misc/dired-x.texi b/doc/misc/dired-x.texi
index 36179200f4e..1ff2b73512a 100644
--- a/doc/misc/dired-x.texi
+++ b/doc/misc/dired-x.texi
@@ -521,8 +521,7 @@ where each @var{command} can either be a string or a Lisp expression
that evaluates to a string. If several commands are given, all of
them will temporarily be pushed onto the history.
-If @samp{*} in the shell command, that means to substitute the file
-name.
+A @samp{*} in the shell command is replaced by the file name.
You can set this variable in your @file{~/.emacs}. For example,
to add rules for @samp{.foo} and @samp{.bar} file extensions, write
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index 5b432d5b2fb..26d9c82b219 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -3392,8 +3392,9 @@ and binaries, and how to install Emacs on those systems.
Most GNU/Linux distributions provide pre-built Emacs packages.
If Emacs is not installed already, you can install it by running (as
-root) a command such as @samp{yum install emacs} (Red Hat and
-derivatives) or @samp{apt-get install emacs} (Debian and derivatives).
+root) a command such as @samp{dnf install emacs} (Red Hat and
+derivatives; use @samp{yum} in older distributions) or
+@samp{apt-get install emacs} (Debian and derivatives).
If you want to compile Emacs yourself, read the file @file{INSTALL} in
the source distribution. In brief:
diff --git a/etc/NEWS.26 b/etc/NEWS.26
index 97222705e61..19dd433cda4 100644
--- a/etc/NEWS.26
+++ b/etc/NEWS.26
@@ -37,6 +37,11 @@ in its NEWS.)
* Changes in Specialized Modes and Packages in Emacs 26.2
+** Imenu
+
+---
+*** The value for 'imenu-auto-rescan-maxout' has been increased to 600000.
+
** Gnus
---
@@ -60,6 +65,7 @@ in its NEWS.)
** VC
+---
*** VC support for Mercurial was improved.
Emacs now avoids invoking 'hg' as much as possible, for faster operation.
(This and the following changes were actually made in Emacs 26.1, but
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index b863572e040..eba3420fcb8 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -2957,6 +2957,15 @@ as a macro. If the definition (in both unex*.c and malloc.c) is wrong,
it can cause problems like this. You might be able to find the correct
value in the man page for a.out(5).
+* 'make check' failures
+
+** emacs-module-tests fail on Ubuntu 16.04
+
+This is due to a bug in GCC that was fixed in 2015; see
+<https://lists.gnu.org/r/emacs-devel/2018-09/msg00548.html>.
+You can work around the problem by using a later version of GCC or of
+Ubuntu, or by configuring without modules.
+
* Problems on legacy systems
This section covers bugs reported on very old hardware or software.
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 7285b105748..09d50daacc2 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -96,11 +96,11 @@ This might not yet be honored by all index-building functions."
:type 'boolean
:group 'imenu)
-(defcustom imenu-auto-rescan-maxout 60000
- "Imenu auto-rescan is disabled in buffers larger than this size (in bytes).
-This variable is buffer-local."
+(defcustom imenu-auto-rescan-maxout 600000
+ "Imenu auto-rescan is disabled in buffers larger than this size (in bytes)."
:type 'integer
- :group 'imenu)
+ :group 'imenu
+ :version "26.2")
(defcustom imenu-use-popup-menu 'on-mouse
"Use a popup menu rather than a minibuffer prompt.
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index a895a777968..3bcc9bebcda 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -480,12 +480,6 @@ Legal values:
;; Keyboard
-(defcustom prolog-hungry-delete-key-flag nil
- "Non-nil means delete key consumes all preceding spaces."
- :version "24.1"
- :group 'prolog-keyboard
- :type 'boolean)
-
(defcustom prolog-electric-dot-flag nil
"Non-nil means make dot key electric.
Electric dot appends newline or inserts head of a new clause.
diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el
index 679401eef15..5f9de9abbb2 100644
--- a/lisp/thingatpt.el
+++ b/lisp/thingatpt.el
@@ -222,17 +222,15 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
(defun thing-at-point-bounds-of-list-at-point ()
"Return the bounds of the list at point.
+Prefer the enclosing list with fallback on sexp at point.
\[Internal function used by `bounds-of-thing-at-point'.]"
(save-excursion
- (let* ((st (parse-partial-sexp (point-min) (point)))
- (beg (or (and (eq 4 (car (syntax-after (point))))
- (not (nth 8 st))
- (point))
- (nth 1 st))))
- (when beg
- (goto-char beg)
- (forward-sexp)
- (cons beg (point))))))
+ (if (ignore-errors (up-list -1))
+ (ignore-errors (cons (point) (progn (forward-sexp) (point))))
+ (let ((bound (bounds-of-thing-at-point 'sexp)))
+ (and bound
+ (<= (car bound) (point)) (< (point) (cdr bound))
+ bound)))))
;; Defuns
@@ -636,8 +634,13 @@ Signal an error if the entire string was not used."
(put 'number 'thing-at-point 'number-at-point)
;;;###autoload
-(defun list-at-point ()
- "Return the Lisp list at point, or nil if none is found."
- (form-at-point 'list 'listp))
+(defun list-at-point (&optional ignore-comment-or-string)
+ "Return the Lisp list at point, or nil if none is found.
+If IGNORE-COMMENT-OR-STRING is non-nil comments and strings are
+treated as white space."
+ (let ((ppss (and ignore-comment-or-string (syntax-ppss))))
+ (save-excursion
+ (goto-char (or (nth 8 ppss) (point)))
+ (form-at-point 'list 'listp))))
;;; thingatpt.el ends here
diff --git a/src/buffer.c b/src/buffer.c
index 878844dd020..1f18dbd11a8 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -4516,23 +4516,6 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
Lisp_Object *copy;
ptrdiff_t i;
- if (size)
- {
- Lisp_Object ovl
- = XVECTOR (last_overlay_modification_hooks)->contents[1];
-
- /* If the buffer of the first overlay in the array doesn't
- match the current buffer, then these modification hooks
- should not be run in this buffer. This could happen when
- some code calls some insdel functions, such as del_range_1,
- with the PREPARE argument false -- in that case this
- function is never called to record the overlay modification
- hook functions in the last_overlay_modification_hooks
- array, so anything we find there is not ours. */
- if (XMARKER (OVERLAY_START (ovl))->buffer != current_buffer)
- return;
- }
-
USE_SAFE_ALLOCA;
SAFE_ALLOCA_LISP (copy, size);
memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,
@@ -4543,7 +4526,12 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
Lisp_Object prop_i, overlay_i;
prop_i = copy[i++];
overlay_i = copy[i++];
- call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
+ /* It is possible that the recorded overlay has been deleted
+ (which makes it's markers' buffers be nil), or that (due to
+ some bug) it belongs to a different buffer. Only run this
+ hook if the overlay belongs to the current buffer. */
+ if (XMARKER (OVERLAY_START (overlay_i))->buffer == current_buffer)
+ call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
}
SAFE_FREE ();
diff --git a/test/lisp/thingatpt-tests.el b/test/lisp/thingatpt-tests.el
index b4a5fd90ce4..aa29924ac1a 100644
--- a/test/lisp/thingatpt-tests.el
+++ b/test/lisp/thingatpt-tests.el
@@ -87,41 +87,43 @@ position to retrieve THING.")
(goto-char (nth 1 test))
(should (equal (thing-at-point (nth 2 test)) (nth 3 test))))))
-;; These tests reflect the actual behavior of
-;; `thing-at-point-bounds-of-list-at-point'.
-(ert-deftest thing-at-point-bug24627 ()
- "Test for https://debbugs.gnu.org/24627 ."
- (let ((string-result '(("(a \"b\" c)" . (a "b" c))
- (";(a \"b\" c)")
- ("(a \"b\" c\n)" . (a "b" c))
- ("\"(a b c)\"")
- ("(a ;(b c d)\ne)" . (a e))
- ("(foo\n(a ;(b c d)\ne) bar)" . (a e))
- ("(foo\na ;(b c d)\ne bar)" . (foo a e bar))
- ("(foo\n(a \"(b c d)\"\ne) bar)" . (a "(b c d)" e))
- ("(b\n(a ;(foo c d)\ne) bar)" . (a e))
- ("(princ \"(a b c)\")" . (princ "(a b c)"))
- ("(defun foo ()\n \"Test function.\"\n ;;(a b)\n nil)" . (defun foo nil "Test function." nil))))
- (file
- (expand-file-name "lisp/thingatpt.el" source-directory))
- buf)
- ;; Test for `thing-at-point'.
- (when (file-exists-p file)
- (unwind-protect
- (progn
- (setq buf (find-file file))
- (goto-char (point-max))
- (forward-line -1)
- (should-not (thing-at-point 'list)))
- (kill-buffer buf)))
- ;; Tests for `list-at-point'.
- (dolist (str-res string-result)
- (with-temp-buffer
- (emacs-lisp-mode)
- (insert (car str-res))
- (re-search-backward "\\((a\\|^a\\)")
- (should (equal (list-at-point)
- (cdr str-res)))))))
+;; See bug#24627 and bug#31772.
+(ert-deftest thing-at-point-bounds-of-list-at-point ()
+ (cl-macrolet ((with-test-buffer (str &rest body)
+ `(with-temp-buffer
+ (emacs-lisp-mode)
+ (insert ,str)
+ (search-backward "|")
+ (delete-char 1)
+ ,@body)))
+ (let ((tests1
+ '(("|(a \"b\" c)" (a "b" c))
+ (";|(a \"b\" c)" (a "b" c) nil)
+ ("|(a \"b\" c\n)" (a "b" c))
+ ("\"|(a b c)\"" (a b c) nil)
+ ("|(a ;(b c d)\ne)" (a e))
+ ("(foo\n|(a ;(b c d)\ne) bar)" (foo (a e) bar))
+ ("(foo\n|a ;(b c d)\ne bar)" (foo a e bar))
+ ("(foo\n|(a \"(b c d)\"\ne) bar)" (foo (a "(b c d)" e) bar))
+ ("(b\n|(a ;(foo c d)\ne) bar)" (b (a e) bar))
+ ("(princ \"|(a b c)\")" (a b c) (princ "(a b c)"))
+ ("(defun foo ()\n \"Test function.\"\n ;;|(a b)\n nil)"
+ (defun foo nil "Test function." nil)
+ (defun foo nil "Test function." nil))))
+ (tests2
+ '(("|list-at-point" . "list-at-point")
+ ("list-|at-point" . "list-at-point")
+ ("list-at-point|" . nil)
+ ("|(a b c)" . "(a b c)")
+ ("(a b c)|" . nil))))
+ (dolist (test tests1)
+ (with-test-buffer (car test)
+ (should (equal (list-at-point) (cl-second test)))
+ (when (cddr test)
+ (should (equal (list-at-point t) (cl-third test))))))
+ (dolist (test tests2)
+ (with-test-buffer (car test)
+ (should (equal (thing-at-point 'list) (cdr test))))))))
(ert-deftest thing-at-point-url-in-comment ()
(with-temp-buffer
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index d115e668178..0e4fd3655ae 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -45,6 +45,25 @@ with parameters from the *Messages* buffer modification."
(should (eq buf (current-buffer))))
(when msg-ov (delete-overlay msg-ov))))))
+(ert-deftest overlay-modification-hooks-deleted-overlay ()
+ "Test for bug#30823."
+ (let ((check-point nil)
+ (ov-delete nil)
+ (ov-set nil))
+ (with-temp-buffer
+ (insert "abc")
+ (setq ov-set (make-overlay 1 3))
+ (overlay-put ov-set 'modification-hooks
+ (list (lambda (_o after &rest _args)
+ (and after (setq check-point t)))))
+ (setq ov-delete (make-overlay 1 3))
+ (overlay-put ov-delete 'modification-hooks
+ (list (lambda (o after &rest _args)
+ (and (not after) (delete-overlay o)))))
+ (goto-char 2)
+ (insert "1")
+ (should (eq check-point t)))))
+
(ert-deftest test-generate-new-buffer-name-bug27966 ()
(should-not (string-equal "nil"
(progn (get-buffer-create "nil")