;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu>
-
-;; |$Date: 1995/04/24 15:27:35 $|$Revision: 1.89 $
+;; Maintainer: FSF
;; This file is part of GNU Emacs.
(define-key map "\C-w" 'isearch-yank-word)
(define-key map "\C-y" 'isearch-yank-line)
- ;; Bind the ASCII-equivalent "function keys" explicitly to nil
- ;; so that the default binding does not apply.
- ;; As a result, these keys translate thru function-key-map
- ;; as normal, and they have the effect of the equivalent ASCII char.
- ;; We bind [escape] below.
- (define-key map [tab] 'nil)
- (define-key map [kp-0] 'nil)
- (define-key map [kp-1] 'nil)
- (define-key map [kp-2] 'nil)
- (define-key map [kp-3] 'nil)
- (define-key map [kp-4] 'nil)
- (define-key map [kp-5] 'nil)
- (define-key map [kp-6] 'nil)
- (define-key map [kp-7] 'nil)
- (define-key map [kp-8] 'nil)
- (define-key map [kp-9] 'nil)
- (define-key map [kp-add] 'nil)
- (define-key map [kp-subtract] 'nil)
- (define-key map [kp-multiply] 'nil)
- (define-key map [kp-divide] 'nil)
- (define-key map [kp-decimal] 'nil)
- (define-key map [kp-separator] 'nil)
- (define-key map [kp-equal] 'nil)
- (define-key map [kp-tab] 'nil)
- (define-key map [kp-space] 'nil)
- (define-key map [kp-enter] 'nil)
- (define-key map [delete] 'nil)
- (define-key map [backspace] 'nil)
- (define-key map [return] 'nil)
- (define-key map [newline] 'nil)
-
;; Define keys for regexp chars * ? |.
;; Nothing special for + because it matches at least once.
(define-key map "*" 'isearch-*-char)
(define-key map "\M-\t" 'isearch-complete)
- ;; Switching frames should terminate isearch-mode
- (define-key map [switch-frame] 'isearch-switch-frame-handler)
-
+ ;; Pass frame events transparently so they won't exit the search.
+ ;; In particular, if we have more than one display open, then a
+ ;; switch-frame might be generated by someone typing at another keyboard.
+ (define-key map [switch-frame] nil)
+ (define-key map [delete-frame] nil)
+ (define-key map [iconify-frame] nil)
+ (define-key map [make-frame-visible] nil)
+
(setq isearch-mode-map map)
))
options; do M-x apropos on search-.* to find them.
Other control and meta characters terminate the search
and are then executed normally (depending on `search-exit-option').
+Likewise for function keys and mouse button events.
If this function is called non-interactively, it does not return to
the calling function until the search is done."
(defun isearch-mode (forward &optional regexp op-fun recursive-edit word-p)
- "Start isearch minor mode. Called by isearch-forward, etc."
+ "Start isearch minor mode. Called by `isearch-forward', etc.
+
+\\{isearch-mode-map}"
;; Initialize global vars.
(setq isearch-forward forward
(isearch-push-state)
- (make-local-variable 'overriding-local-map)
- (setq overriding-local-map isearch-mode-map)
+ (setq overriding-terminal-local-map isearch-mode-map)
(isearch-update)
(run-hooks 'isearch-mode-hook)
(setq mouse-leave-buffer-hook nil)
;; Called by all commands that terminate isearch-mode.
;; If NOPUSH is non-nil, we don't push the string on the search ring.
- (setq overriding-local-map nil)
+ (setq overriding-terminal-local-map nil)
;; (setq pre-command-hook isearch-old-pre-command-hook) ; for lemacs
(isearch-dehighlight t)
(let ((found-start (window-start (selected-window)))
(isearch-yank-flag isearch-yank-flag)
(isearch-invalid-regexp isearch-invalid-regexp)
(isearch-within-brackets isearch-within-brackets)
- (isearch-other-end isearch-other-end)
+;;; Don't bind this. We want isearch-search, below, to set it.
+;;; And the old value won't matter after that.
+;;; (isearch-other-end isearch-other-end)
+;;; Perhaps some of these other variables should be bound for a
+;;; shorter period, ending before the next isearch-search.
+;;; But there doesn't seem to be a real bug, so let's not risk it now.
(isearch-opoint isearch-opoint)
(isearch-slow-terminal-mode isearch-slow-terminal-mode)
(isearch-small-window isearch-small-window)
If it is the symbol `edit', the search string is edited in the minibuffer
and the meta character is unread so that it applies to editing the string."
(interactive)
- (cond ((eq search-exit-option 'edit)
- (let ((key (this-command-keys)))
- (apply 'isearch-unread (listify-key-sequence key)))
- (isearch-edit-string))
- (search-exit-option
- (let* ((key (this-command-keys))
- (main-event (aref key 0))
- window)
- (apply 'isearch-unread (listify-key-sequence key))
- ;; Properly handle scroll-bar and mode-line clicks
- ;; for which a dummy prefix event was generated as (aref key 0).
- (and (> (length key) 1)
- (symbolp (aref key 0))
- (listp (aref key 1))
- (not (numberp (posn-point (event-start (aref key 1)))))
- ;; Convert the event back into its raw form,
- ;; with the dummy prefix implicit in the mouse event,
- ;; so it will get split up once again.
- (progn (setq unread-command-events
- (cdr unread-command-events))
- (setq main-event (car unread-command-events))
- (setcar (cdr (event-start main-event))
- (car (nth 1 (event-start main-event))))))
- ;; If we got a mouse click, maybe it was read with the buffer
- ;; it was clicked on. If so, that buffer, not the current one,
- ;; is in isearch mode. So end the search in that buffer.
- (if (and (listp main-event)
- (setq window (posn-window (event-start main-event)))
- (windowp window))
- (save-excursion
- (set-buffer (window-buffer window))
- (isearch-done))
- (isearch-done))))
- (t;; otherwise nil
- (isearch-process-search-string (this-command-keys)
- (this-command-keys)))))
+ (let* ((key (this-command-keys))
+ (main-event (aref key 0))
+ (keylist (listify-key-sequence key)))
+ (cond ((and (= (length key) 1)
+ (let ((lookup (lookup-key function-key-map key)))
+ (not (or (null lookup) (integerp lookup)))))
+ ;; Handle a function key that translates into something else.
+ ;; If the key has a global definition too,
+ ;; exit and unread the key itself, so its global definition runs.
+ ;; Otherwise, unread the translation,
+ ;; so that the translated key takes effect within isearch.
+ (cancel-kbd-macro-events)
+ (if (lookup-key global-map key)
+ (progn
+ (isearch-done)
+ (apply 'isearch-unread keylist))
+ (apply 'isearch-unread
+ (listify-key-sequence (lookup-key function-key-map key)))))
+ (
+ ;; Handle an undefined shifted control character
+ ;; by downshifting it if that makes it defined.
+ ;; (As read-key-sequence would normally do,
+ ;; if we didn't have a default definition.)
+ (let ((mods (event-modifiers main-event)))
+ (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)))
+ (setcar keylist (- main-event (- ?\C-\S-a ?\C-a)))
+ (cancel-kbd-macro-events)
+ (apply 'isearch-unread keylist))
+ ((eq search-exit-option 'edit)
+ (apply 'isearch-unread keylist)
+ (isearch-edit-string))
+ (search-exit-option
+ (let (window)
+ (cancel-kbd-macro-events)
+ (apply 'isearch-unread keylist)
+ ;; Properly handle scroll-bar and mode-line clicks
+ ;; for which a dummy prefix event was generated as (aref key 0).
+ (and (> (length key) 1)
+ (symbolp (aref key 0))
+ (listp (aref key 1))
+ (not (numberp (posn-point (event-start (aref key 1)))))
+ ;; Convert the event back into its raw form,
+ ;; with the dummy prefix implicit in the mouse event,
+ ;; so it will get split up once again.
+ (progn (setq unread-command-events
+ (cdr unread-command-events))
+ (setq main-event (car unread-command-events))
+ (setcar (cdr (event-start main-event))
+ (car (nth 1 (event-start main-event))))))
+ ;; If we got a mouse click, maybe it was read with the buffer
+ ;; it was clicked on. If so, that buffer, not the current one,
+ ;; is in isearch mode. So end the search in that buffer.
+ (if (and (listp main-event)
+ (setq window (posn-window (event-start main-event)))
+ (windowp window))
+ (save-excursion
+ (set-buffer (window-buffer window))
+ (isearch-done))
+ (isearch-done))))
+ (t;; otherwise nil
+ (isearch-process-search-string key key)))))
(defun isearch-quote-char ()
"Quote special characters for incremental search."
;; If currently failing, display no ellipsis.
(or isearch-success (setq ellipsis nil))
(let ((m (concat (if isearch-success "" "failing ")
+ (if (and isearch-wrapped
+ (if isearch-forward
+ (> (point) isearch-opoint)
+ (< (point) isearch-opoint)))
+ "over")
(if isearch-wrapped "wrapped ")
(if isearch-word "word " "")
(if isearch-regexp "regexp " "")