emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 7abd3f2: Improve Isearch error handling


From: Juri Linkov
Subject: [Emacs-diffs] master 7abd3f2: Improve Isearch error handling
Date: Sun, 22 Apr 2018 18:11:04 -0400 (EDT)

branch: master
commit 7abd3f2dcf1d31e31f40ca817666e8f66a17284f
Author: Juri Linkov <address@hidden>
Commit: Juri Linkov <address@hidden>

    Improve Isearch error handling
    
    * lisp/isearch.el (isearch--momentary-message): Propertize message
    suffix with minibuffer-prompt face.
    (isearch--describe-regexp-mode): Do not omit description in case
    of error in default non-literal search.
    (isearch-message-prefix): Display “case-sensitive” in case of error.
    (isearch-message-suffix): Propertize message suffix with
    minibuffer-prompt face.
    (isearch-search-fun-default): Remove unused error handling.
    
    * lisp/vc/add-log.el (change-log-next-buffer): Better handle
    errors during wrapping.
---
 etc/NEWS           | 18 +++++++++++----
 lisp/info.el       |  2 +-
 lisp/isearch.el    | 68 +++++++++++++++++++++++++++---------------------------
 lisp/replace.el    |  2 +-
 lisp/vc/add-log.el | 14 ++++++++---
 5 files changed, 60 insertions(+), 44 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index ffe2f50..bde9b89 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -141,11 +141,6 @@ regular expression was previously invalid, but is now 
accepted:
 
 * Editing Changes in Emacs 27.1
 
-+++
-** New isearch bindings.
-'C-M-w' in isearch changed from isearch-del-char to the new function
-isearch-yank-symbol-or-char. isearch-del-char is now bound to 'C-M-d'.
-
 ---
 ** New variable 'x-wait-for-event-timeout'.
 This controls how long Emacs will wait for updates to the graphical
@@ -169,6 +164,10 @@ for abbrevs that have them.
 `text-property-search-backward' have been added.  These provide an
 interface that's more like functions like @code{search-forward}.
 
+---
+** More commands support noncontiguous rectangular regions, namely
+‘upcase-dwim’, ‘downcase-dwim’, ‘replace-string’, ‘replace-regexp’.
+
 
 * Changes in Specialized Modes and Packages in Emacs 27.1
 
@@ -293,12 +292,21 @@ can now be searched via 'C-s'.
 ** Search and Replace
 
 +++
+*** New isearch bindings.
+'C-M-w' in isearch changed from isearch-del-char to the new function
+isearch-yank-symbol-or-char. isearch-del-char is now bound to 'C-M-d'.
+
++++
 *** 'search-exit-option' provides new options 'move' and 'shift-move'
 to extend the search string by yanking text that ends at the new
 position after moving point in the current buffer.  'shift-move'
 extends the search string by motion commands while holding down
 the shift key.
 
+---
+*** Isearch now remembers the regexp-based search mode for words/symbols
+and case-sensitivity together with search strings in the search ring.
+
 ** Edebug
 
 +++
diff --git a/lisp/info.el b/lisp/info.el
index 0db84fb..bbce55f 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -2017,7 +2017,7 @@ If DIRECTION is `backward', search in the reverse 
direction."
                   Info-isearch-initial-node
                   bound
                   (and found (> found opoint-min) (< found opoint-max)))
-       (signal 'user-search-failed (list regexp "(end of node)")))
+       (signal 'user-search-failed (list regexp "end of node")))
 
       ;; If no subfiles, give error now.
       (unless (or found Info-current-subfile)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index db196e0..5cbb4c9 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -1143,10 +1143,10 @@ REGEXP if non-nil says use the regexp search ring."
 
 (defun isearch-update-from-string-properties (string)
   "Update isearch properties from the isearch string"
-  (when (memq 'isearch-case-fold-search (text-properties-at 0 string))
+  (when (plist-member (text-properties-at 0 string) 'isearch-case-fold-search)
     (setq isearch-case-fold-search
          (get-text-property 0 'isearch-case-fold-search string)))
-  (when (memq 'isearch-regexp-function (text-properties-at 0 string))
+  (when (plist-member (text-properties-at 0 string) 'isearch-regexp-function)
     (setq isearch-regexp-function
          (get-text-property 0 'isearch-regexp-function string))))
 
@@ -1602,10 +1602,10 @@ Turning on character-folding turns off regexp mode.")
 (defun isearch--momentary-message (string)
   "Print STRING at the end of the isearch prompt for 1 second"
   (let ((message-log-max nil))
-    (message "%s%s [%s]"
+    (message "%s%s%s"
              (isearch-message-prefix nil isearch-nonincremental)
              isearch-message
-             string))
+             (propertize (format " [%s]" string) 'face 'minibuffer-prompt)))
   (sit-for 1))
 
 (isearch-define-mode-toggle lax-whitespace " " nil
@@ -2693,12 +2693,16 @@ the word mode."
          (cond
           ;; 1. Do not use a description on the default search mode,
           ;;    but only if the default search mode is non-nil.
-          ((or (and search-default-mode
-                    (equal search-default-mode regexp-function))
-               ;; Special case where `search-default-mode' is t
-               ;; (defaults to regexp searches).
-               (and (eq search-default-mode t)
-                    (eq search-default-mode isearch-regexp))) "")
+          ((and (or (and search-default-mode
+                         (equal search-default-mode regexp-function))
+                    ;; Special case where `search-default-mode' is t
+                    ;; (defaults to regexp searches).
+                    (and (eq search-default-mode t)
+                         (eq search-default-mode isearch-regexp)))
+                ;; Also do not omit description in case of error
+                ;; in default non-literal search.
+                (or isearch-success (not (or regexp-function isearch-regexp))))
+           "")
           ;; 2. Use the `isearch-message-prefix' set for
           ;;    `regexp-function' if available.
           (regexp-function
@@ -2741,6 +2745,8 @@ the word mode."
                              (< (point) isearch-opoint)))
                       "over")
                   (if isearch-wrapped "wrapped ")
+                   (if (and (not isearch-success) (not 
isearch-case-fold-search))
+                       "case-sensitive ")
                    (let ((prefix ""))
                      (advice-function-mapc
                       (lambda (_ props)
@@ -2768,11 +2774,12 @@ the word mode."
                'face 'minibuffer-prompt)))
 
 (defun isearch-message-suffix (&optional c-q-hack)
-  (concat (if c-q-hack "^Q" "")
-         (if isearch-error
-             (concat " [" isearch-error "]")
-           "")
-         (or isearch-message-suffix-add "")))
+  (propertize (concat (if c-q-hack "^Q" "")
+                     (if isearch-error
+                         (concat " [" isearch-error "]")
+                       "")
+                     (or isearch-message-suffix-add ""))
+              'face 'minibuffer-prompt))
 
 
 ;; Searching
@@ -2808,25 +2815,18 @@ Can be changed via `isearch-search-fun-function' for 
special needs."
                                        (isearch-regexp 
isearch-regexp-lax-whitespace)
                                        (t isearch-lax-whitespace))
                                   search-whitespace-regexp)))
-      (condition-case er
-          (funcall
-           (if isearch-forward #'re-search-forward #'re-search-backward)
-           (cond (isearch-regexp-function
-                  (let ((lax (and (not bound) 
(isearch--lax-regexp-function-p))))
-                    (when lax
-                      (setq isearch-adjusted t))
-                    (if (functionp isearch-regexp-function)
-                        (funcall isearch-regexp-function string lax)
-                      (word-search-regexp string lax))))
-                 (isearch-regexp string)
-                 (t (regexp-quote string)))
-           bound noerror count)
-        (search-failed
-         (signal (car er)
-                 (let ((prefix (get isearch-regexp-function 
'isearch-message-prefix)))
-                   (if (and isearch-regexp-function (stringp prefix))
-                       (list (format "%s   [using %ssearch]" string prefix))
-                     (cdr er)))))))))
+      (funcall
+       (if isearch-forward #'re-search-forward #'re-search-backward)
+       (cond (isearch-regexp-function
+              (let ((lax (and (not bound) (isearch--lax-regexp-function-p))))
+                (when lax
+                  (setq isearch-adjusted t))
+                (if (functionp isearch-regexp-function)
+                    (funcall isearch-regexp-function string lax)
+                  (word-search-regexp string lax))))
+             (isearch-regexp string)
+             (t (regexp-quote string)))
+       bound noerror count))))
 
 (defun isearch-search-string (string bound noerror)
   "Search for the first occurrence of STRING or its translation.
diff --git a/lisp/replace.el b/lisp/replace.el
index d5d34f6..3503b65 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -314,7 +314,7 @@ the original string if not."
               (query-replace-read-to from prompt regexp-flag))))
     (list from to
          (or (and current-prefix-arg (not (eq current-prefix-arg '-)))
-              (and (memq 'isearch-regexp-function (text-properties-at 0 from))
+              (and (plist-member (text-properties-at 0 from) 
'isearch-regexp-function)
                    (get-text-property 0 'isearch-regexp-function from)))
          (and current-prefix-arg (eq current-prefix-arg '-)))))
 
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index 41a9991..4c64ae1 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -1099,9 +1099,17 @@ file were isearch was started."
     ;; If there are no files that match the default pattern ChangeLog.[0-9],
     ;; return the current buffer to force isearch wrapping to its beginning.
     ;; If file is nil, multi-isearch-search-fun will signal "end of multi".
-    (if (and file (file-exists-p file))
-       (find-file-noselect file)
-      (current-buffer))))
+    (cond
+     ;; Wrapping doesn't catch errors from the nil arg of file-exists-p,
+     ;; so handle it explicitly.
+     ((and wrap (null file))
+      (current-buffer))
+     ;; When there is no next file, file-exists-p raises the error to be
+     ;; catched by the search function that displays the error message.
+     ((file-exists-p file)
+      (find-file-noselect file))
+     (t
+      (current-buffer)))))
 
 (defun change-log-fill-forward-paragraph (n)
   "Cut paragraphs so filling preserves open parentheses at beginning of lines."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]