]> git.eshelyaron.com Git - emacs.git/commitdiff
Suppress a misleading message when closing a paren in a regex
authorHarald Jörg <haj@posteo.de>
Fri, 30 Oct 2020 12:23:52 +0000 (13:23 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 30 Oct 2020 12:24:01 +0000 (13:24 +0100)
* lisp/progmodes/cperl-mode.el (cperl-forward-re): Suppress an
error message about "End of string/RE not found" when we are
at the end of a narrowed buffer where the end of a RE is
temporarily unavailable (Bug#37127).

* test/lisp/progmodes/cperl-mode-tests.el (cperl-bug37127):
Add a test to verify that the message is suppressed when
inappropriate, but appears when the RE *is* incomplete.

lisp/progmodes/cperl-mode.el
test/lisp/progmodes/cperl-mode-tests.el

index ebbea6bed926b4edaacc9e9559c95bae1e40b584..94f42cb2bc4b8e2ef7c81135fecaa2e511848470 100644 (file)
@@ -3225,6 +3225,13 @@ modify syntax-type text property if the situation is too hard."
                 (and cperl-brace-recursing
                      (or (eq ostart  ?\{)
                          (eq starter ?\{)))
+                ;; If we are at the end of a narrowed buffer, then a
+                ;; scan error should not be reported to the user.
+                ;; This situation actually happens when a closing
+                ;; paren is entered in a regular expression.
+                ;; Reported in Bug#37127.
+                (and (eobp) (buffer-narrowed-p)
+                     (equal (car bb) 'scan-error))
                 (message
                  "End of `%s%s%c ... %c' string/RE not found: %s"
                  argument
index 9b486ae2e2cd5882c213931d42dfae13dad2b8a6..75010f7d0f31761a9a537f6138cbae32be5a3cdd 100644 (file)
@@ -220,4 +220,33 @@ point in the distant past, and is still broken in perl-mode. "
         (should (equal (nth 3 (syntax-ppss)) nil))
         (should (equal (nth 4 (syntax-ppss)) t))))))
 
+(ert-deftest cperl-bug37127 ()
+  "Verify that closing a paren in a regex goes without a message.
+Also check that the message is issued if the regex terminator is
+missing."
+  (let (collected-messages)
+    ;; Part one: Regex is ok, no messages
+    (ert-with-message-capture collected-messages
+      (with-temp-buffer
+        (insert "$_ =~ /(./;")
+        (cperl-mode)
+        (goto-char (point-min))
+        (search-forward ".")
+        (let ((last-command-event ?\)))
+          (cperl-electric-rparen 1)
+          (cperl-find-pods-heres (point-min) (point-max) t)))
+      (should (string-equal collected-messages "")))
+    ;; part two: Regex terminator missing -> message
+    (ert-with-message-capture collected-messages
+      (with-temp-buffer
+        (insert "$_ =~ /(..;")
+        (goto-char (point-min))
+        (cperl-mode)
+        (search-forward ".")
+        (let ((last-command-event ?\)))
+          (cperl-electric-rparen 1)
+          (cperl-find-pods-heres (point-min) (point-max) t)))
+      (should (string-match "^End of .* string/RE"
+                            collected-messages)))))
+
 ;;; cperl-mode-tests.el ends here