]> code.delx.au - gnu-emacs/blobdiff - lisp/isearch.el
(ediff-files, ediff-files3, ediff-merge-files)
[gnu-emacs] / lisp / isearch.el
index 6792baea9d3c7e6b7cd2110db33916cb4c61a4f9..69ffcdd55f684f38deec95078da16aba1ac74aa3 100644 (file)
@@ -1,7 +1,7 @@
 ;;; isearch.el --- incremental search minor mode
 
 ;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
-;;   2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+;;   2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu>
 ;; Maintainer: FSF
@@ -116,8 +116,11 @@ When you put a space or spaces in the incremental regexp, it stands for
 this, unless it is inside of a regexp construct such as [...] or *, + or ?.
 You might want to use something like \"[ \\t\\r\\n]+\" instead.
 In the Customization buffer, that is `[' followed by a space,
-a tab, a carriage return (control-M), a newline, and `]+'."
-  :type 'regexp
+a tab, a carriage return (control-M), a newline, and `]+'.
+
+When this is nil, each space you type matches literally, against one space."
+  :type '(choice (const :tag "Find Spaces Literally" nil)
+                regexp)
   :group 'isearch)
 
 (defcustom search-invisible 'open
@@ -219,7 +222,8 @@ Default value, nil, means edit the string instead."
      (:background "magenta4" :foreground "cyan1"))
     (t (:inverse-video t)))
   "Face for highlighting Isearch matches."
-  :group 'isearch)
+  :group 'isearch
+  :group 'basic-faces)
 (defvar isearch 'isearch)
 
 (defcustom isearch-lazy-highlight t
@@ -289,7 +293,8 @@ A value of nil means highlight all matches."
      (:background "turquoise3"))
     (t (:underline t)))
   "Face for lazy highlighting of matches other than the current one."
-  :group 'lazy-highlight)
+  :group 'lazy-highlight
+  :group 'basic-faces)
 (put 'isearch-lazy-highlight-face 'face-alias 'lazy-highlight)
 (defvar lazy-highlight-face 'lazy-highlight)
 (define-obsolete-variable-alias 'isearch-lazy-highlight-face
@@ -384,6 +389,8 @@ A value of nil means highlight all matches."
     (define-key map [iconify-frame] nil)
     (define-key map [make-frame-visible] nil)
     (define-key map [mouse-movement] nil)
+    (define-key map [language-change] nil)
+
     ;; For searching multilingual text.
     (define-key map "\C-\\" 'isearch-toggle-input-method)
     (define-key map "\C-^" 'isearch-toggle-specified-input-method)
@@ -517,8 +524,8 @@ Type \\[isearch-exit] to exit, leaving point at location found.
 Type LFD (C-j) to match end of line.
 Type \\[isearch-repeat-forward] to search again forward,\
  \\[isearch-repeat-backward] to search again backward.
-Type \\[isearch-yank-word-or-char] to yank word from buffer onto end of search\
string and search for it.
+Type \\[isearch-yank-word-or-char] to yank next word or character in buffer
 onto the end of the search string, and search for it.
 Type \\[isearch-del-char] to delete character from end of search string.
 Type \\[isearch-yank-char] to yank char from buffer onto end of search\
  string and search for it.
@@ -582,7 +589,7 @@ is treated as a regexp.  See \\[isearch-forward] for more info.
 In regexp incremental searches, a space or spaces normally matches
 any whitespace (the variable `search-whitespace-regexp' controls
 precisely what that means).  If you want to search for a literal space
-and nothing else, enter C-q SPC.
+and nothing else, enter C-q SPC."
   (interactive "P\np")
   (isearch-mode t (null not-regexp) nil (not no-recursive-edit)))
 
@@ -823,21 +830,22 @@ NOPUSH is t and EDIT is t."
 
 (defun isearch-update-ring (string &optional regexp)
   "Add STRING to the beginning of the search ring.
-REGEXP says which ring to use."
+REGEXP if non-nil says use the regexp search ring."
   (if regexp
-      (if (or (null regexp-search-ring)
-             (not (string= string (car regexp-search-ring))))
-         (progn
-           (push string regexp-search-ring)
-           (if (> (length regexp-search-ring) regexp-search-ring-max)
-               (setcdr (nthcdr (1- search-ring-max) regexp-search-ring)
-                       nil))))
-    (if (or (null search-ring)
-           (not (string= string (car search-ring))))
-       (progn
-         (push string search-ring)
-         (if (> (length search-ring) search-ring-max)
-             (setcdr (nthcdr (1- search-ring-max) search-ring) nil))))))
+      (when (or (null regexp-search-ring)
+               (not (string= string (car regexp-search-ring))))
+       (when history-delete-duplicates
+         (setq regexp-search-ring (delete string regexp-search-ring)))
+       (push string regexp-search-ring)
+       (when (> (length regexp-search-ring) regexp-search-ring-max)
+         (setcdr (nthcdr (1- search-ring-max) regexp-search-ring) nil)))
+    (when (or (null search-ring)
+             (not (string= string (car search-ring))))
+      (when history-delete-duplicates
+       (setq search-ring (delete string search-ring)))
+      (push string search-ring)
+      (when (> (length search-ring) search-ring-max)
+       (setcdr (nthcdr (1- search-ring-max) search-ring) nil)))))
 
 ;; Switching buffers should first terminate isearch-mode.
 ;; ;; For Emacs 19, the frame switch event is handled.
@@ -1136,15 +1144,16 @@ Use `isearch-exit' to quit without signaling."
       ;; C-s in forward or C-r in reverse.
       (if (equal isearch-string "")
          ;; If search string is empty, use last one.
-         (setq isearch-string
-               (or (if isearch-regexp
-                       (car regexp-search-ring)
-                     (car search-ring))
-                   (error "No previous search string"))
-               isearch-message
-               (mapconcat 'isearch-text-char-description
-                          isearch-string "")
-               isearch-case-fold-search isearch-last-case-fold-search)
+         (if (null (if isearch-regexp regexp-search-ring search-ring))
+             (setq isearch-error "No previous search string")
+           (setq isearch-string
+                 (if isearch-regexp
+                     (car regexp-search-ring)
+                   (car search-ring))
+                 isearch-message
+                 (mapconcat 'isearch-text-char-description
+                            isearch-string "")
+                 isearch-case-fold-search isearch-last-case-fold-search))
        ;; If already have what to search for, repeat it.
        (or isearch-success
            (progn
@@ -1219,9 +1228,10 @@ Use `isearch-exit' to quit without signaling."
   (let ((case-fold-search isearch-case-fold-search))
     (isearch-done)
     (isearch-clean-overlays)
-    (if (and (< isearch-other-end (point))
+    (if (and isearch-other-end
+            (< isearch-other-end (point))
              (not (and transient-mark-mode mark-active
-                       (< isearch-opoint (point)))))
+                       (< (mark) (point)))))
         (goto-char isearch-other-end))
     (set query-replace-from-history-variable
          (cons isearch-string
@@ -1687,12 +1697,15 @@ Isearch mode."
             (and (integerp main-event)
                  (memq 'shift mods)
                  (memq 'control mods)
-                 (lookup-key isearch-mode-map
-                             (let ((copy (copy-sequence key)))
-                               (aset copy 0
-                                     (- main-event (- ?\C-\S-a ?\C-a)))
-                               copy)
-                             nil)))
+                 (not (memq (lookup-key isearch-mode-map
+                                        (let ((copy (copy-sequence key)))
+                                          (aset copy 0
+                                                (- main-event
+                                                   (- ?\C-\S-a ?\C-a)))
+                                          copy)
+                                        nil)
+                            '(nil
+                              isearch-other-control-char)))))
           (setcar keylist (- main-event (- ?\C-\S-a ?\C-a)))
           (cancel-kbd-macro-events)
           (apply 'isearch-unread keylist))
@@ -1804,6 +1817,8 @@ Isearch mode."
    ((eq   char ?|)       (isearch-fallback t nil t)))
 
   ;; Append the char to the search string, update the message and re-search.
+  (if (char-table-p translation-table-for-input)
+      (setq char (or (aref translation-table-for-input char) char)))
   (isearch-process-search-string
    (char-to-string char)
    (if (>= char ?\200)
@@ -2230,17 +2245,15 @@ since they have special meaning in a regexp."
 (defvar isearch-overlay nil)
 
 (defun isearch-highlight (beg end)
-  (unless (null search-highlight)
-    (cond (isearch-overlay
-          ;; Overlay already exists, just move it.
-          (move-overlay isearch-overlay beg end (current-buffer)))
-
-         (t
-          ;; Overlay doesn't exist, create it.
-          (setq isearch-overlay (make-overlay beg end))
-          (overlay-put isearch-overlay 'face isearch)
-           (overlay-put isearch-overlay 'priority 1) ;higher than lazy overlays
-           ))))
+  (if search-highlight
+      (if isearch-overlay
+         ;; Overlay already exists, just move it.
+         (move-overlay isearch-overlay beg end (current-buffer))
+       ;; Overlay doesn't exist, create it.
+       (setq isearch-overlay (make-overlay beg end))
+       ;; 1001 is higher than lazy's 1000 and ediff's 100+
+       (overlay-put isearch-overlay 'priority 1001)
+       (overlay-put isearch-overlay 'face isearch))))
 
 (defun isearch-dehighlight ()
   (when isearch-overlay
@@ -2404,8 +2417,10 @@ Attempt to do the search exactly the way the pending isearch would."
                        ;; non-zero-length match
                        (let ((ov (make-overlay mb me)))
                          (push ov isearch-lazy-highlight-overlays)
+                         ;; 1000 is higher than ediff's 100+,
+                         ;; but lower than isearch main overlay's 1001
+                         (overlay-put ov 'priority 1000)
                          (overlay-put ov 'face lazy-highlight-face)
-                         (overlay-put ov 'priority 0) ;lower than main overlay
                          (overlay-put ov 'window (selected-window))))
                      (if isearch-forward
                          (setq isearch-lazy-highlight-end (point))