X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/07474fef28b4a621323810fcefdfce6ad48fe202..5c6cc95c9a56b19410e314c0d98d37cad87a9bd0:/lisp/international/isearch-x.el diff --git a/lisp/international/isearch-x.el b/lisp/international/isearch-x.el index 31546b50c3..09d6d0a1d0 100644 --- a/lisp/international/isearch-x.el +++ b/lisp/international/isearch-x.el @@ -1,19 +1,22 @@ ;;; isearch-x.el --- extended isearch handling commands -;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. -;; Licensed to the Free Software Foundation. +;; Copyright (C) 1997, 2001-2016 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +;; 2005, 2006, 2007, 2008, 2009, 2010, 2011 +;; National Institute of Advanced Industrial Science and Technology (AIST) +;; Registration Number H14PRO021 -;; Keywords: multilingual, isearch +;; Keywords: i18n, multilingual, isearch ;; Author: Kenichi HANDA ;; Maintainer: Kenichi HANDA ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,9 +24,9 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; along with GNU Emacs. If not, see . + +;;; Commentary: ;;; Code: @@ -50,63 +53,95 @@ (isearch-update)) (defvar isearch-minibuffer-local-map - (let ((map (make-keymap))) - (define-key map [t] 'isearch-minibuffer-non-self-insert) - (let ((i ?\ )) - (while (< i 256) - (define-key map (vector i) 'isearch-minibuffer-self-insert) - (setq i (1+ i)))) - (let ((l (generic-character-list)) - (table (nth 1 map))) - (while l - (set-char-table-default table (car l) 'isearch-minibuffer-self-insert) - (setq l (cdr l)))) - (define-key map "\C-m" 'exit-minibuffer) - (define-key map [return] 'exit-minibuffer) + (let ((map (copy-keymap minibuffer-local-map))) + (define-key map [with-keyboard-coding] 'isearch-with-keyboard-coding) + (define-key map [with-input-method] 'isearch-with-input-method) map) - "Keymap of minibuffer to input multibyte characters while isearching.") + "Keymap to use in minibuffer for multibyte character inputting in isearch.") -(defun isearch-minibuffer-non-self-insert () +;; Exit from recursive edit safely. Set in `after-change-functions' +;; by isearch-with-keyboard-coding. +(defun isearch-exit-recursive-edit (start end length) (interactive) - (setq unread-command-events (cons last-command-event unread-command-events)) + (throw 'exit nil)) + +;; Simulate character decoding by the keyboard coding system in the +;; current buffer (minibuffer). As soon as a character is inserted, +;; it exits from minibuffer. + +(defun isearch-with-keyboard-coding () + (interactive) + ;; FIXME: What does this after-change-functions binding do here? + (let ((after-change-functions '(isearch-exit-recursive-edit))) + (recursive-edit)) (exit-minibuffer)) -(defun isearch-minibuffer-self-insert () +;; Simulate the work of the current input method in the current buffer +;; (minibuffer). + +(defun isearch-with-input-method () (interactive) - (let ((events (cons last-command-event unread-post-input-method-events))) - (catch 'isearch-tag - (while events - (let* ((event (car events)) - (cmd (lookup-key isearch-mode-map (vector event)))) - (cond ((eq cmd 'isearch-printing-char) - (insert event) - (setq events (cdr events))) - ((eq cmd 'exit-minibuffer) - (setq events (cdr events)) - (throw 'isearch-tag nil)) - (t - (throw 'isearch-tag nil)))))) - (setq unread-post-input-method-events events) - (or unread-post-input-method-events - (exit-minibuffer)))) + (let ((key (car unread-command-events)) + events) + (setq unread-command-events (cdr unread-command-events) + events (funcall input-method-function key)) + ;; EVENTS is a list of events the input method has generated. It + ;; contains a character event and/or the special event + ;; `compose-last-chars'. We extract only character events and + ;; insert the corresponding characters. + (while events + (if (integerp (car events)) (insert (car events))) + (setq events (cdr events))) + (exit-minibuffer))) ;;;###autoload -(defun isearch-process-search-multibyte-characters (last-char) +(defun isearch-process-search-multibyte-characters (last-char &optional count) (if (eq this-command 'isearch-printing-char) (let ((overriding-terminal-local-map nil) - ;; Let input method work rather tersely. - (input-method-verbose-flag nil) + (prompt (isearch-message-prefix)) (minibuffer-local-map isearch-minibuffer-local-map) - str) - (setq unread-input-method-events - (cons last-char unread-input-method-events)) - (setq str (read-multilingual-string - (concat (isearch-message-prefix) isearch-message) - nil - current-input-method)) + str junk-hist) + + ;; PROMPT contains text-properties from + ;; `minibuffer-prompt-properties', and some of these can screw up + ;; its use in `read-string' below (specifically, a read-only + ;; property will cause it to signal an error), so strip them here; + ;; read-string will add the same properties itself anyway. + ;; + (set-text-properties 0 (length prompt) nil prompt) + + (if isearch-input-method-function + (let (;; Let input method work rather tersely. + (input-method-verbose-flag nil)) + (setq unread-command-events + (cons 'with-input-method + (cons last-char unread-command-events)) + ;; Inherit current-input-method in a minibuffer. + str (read-string prompt isearch-message 'junk-hist nil t)) + (if (or (not str) (< (length str) (length isearch-message))) + ;; All inputs were deleted while the input method + ;; was working. + (setq str "") + (setq str (substring str (length isearch-message))) + (if (and (= (length str) 1) + (= (aref str 0) last-char) + (>= last-char 128)) + ;; The input method couldn't handle LAST-CHAR. + (setq str nil))))) + + (if (and (not str) (keyboard-coding-system)) + (setq unread-command-events + (cons 'with-keyboard-coding + (cons last-char unread-command-events)) + str (read-string prompt nil 'junk-hist))) + (if (and str (> (length str) 0)) - (isearch-process-search-string str str) + (let ((unread-command-events nil)) + (if (and (integerp count) (> count 1)) + (let ((strs (mapconcat 'identity (make-list count str) ""))) + (isearch-process-search-string strs strs)) + (isearch-process-search-string str str))) (isearch-update))) - (isearch-process-search-char last-char))) + (isearch-process-search-char last-char count))) ;;; isearch-x.el ends here