* lisp/isearch.el (isearch-mode-map): Bind `C-x 8 RET' to

`isearch-insert-char-by-name'.
(with-isearch-suspended): New defmacro with body mostly from
`isearch-edit-string' except the part that sets
`isearch-new-string' and `isearch-new-message'.
(isearch-edit-string): Use new macro `with-isearch-suspended' with
body that sets `isearch-new-string' and `isearch-new-message'.
(isearch-insert-char-by-name): New command.
* lisp/international/mule-cmds.el (read-char-by-name): Let-bind
`enable-recursive-minibuffers' to t.
http://lists.gnu.org/archive/html/emacs-devel/2012-12/msg00234.html
This commit is contained in:
Juri Linkov 2012-12-15 15:03:17 +02:00
parent 8370def5c8
commit 279f9b06fd
4 changed files with 82 additions and 44 deletions

View file

@ -73,6 +73,11 @@ amounts of data into the ERC input.
*** The icomplete-separator is customizable, and its default has changed.
*** Removed icomplete-show-key-bindings.
** Isearch
*** `C-x 8 RET' in Isearch mode reads a character by its Unicode name
and adds it to the search string.
** MH-E has been updated to MH-E version 8.4.
See MH-E-NEWS for details.

View file

@ -1,3 +1,17 @@
2012-12-15 Juri Linkov <juri@jurta.org>
* isearch.el (isearch-mode-map): Bind `C-x 8 RET' to
`isearch-insert-char-by-name'.
(with-isearch-suspended): New defmacro with body mostly from
`isearch-edit-string' except the part that sets
`isearch-new-string' and `isearch-new-message'.
(isearch-edit-string): Use new macro `with-isearch-suspended' with
body that sets `isearch-new-string' and `isearch-new-message'.
(isearch-insert-char-by-name): New command.
* international/mule-cmds.el (read-char-by-name): Let-bind
`enable-recursive-minibuffers' to t.
http://lists.gnu.org/archive/html/emacs-devel/2012-12/msg00234.html
2012-12-15 Juri Linkov <juri@jurta.org>
* isearch.el (isearch-delete-char, isearch-del-char): Doc fix.

View file

@ -2945,14 +2945,15 @@ at the beginning of the name.
This function also accepts a hexadecimal number of Unicode code
point or a number in hash notation, e.g. #o21430 for octal,
#x2318 for hex, or #10r8984 for decimal."
(let ((input
(completing-read
prompt
(lambda (string pred action)
(let ((completion-ignore-case t))
(if (eq action 'metadata)
'(metadata (category . unicode-name))
(complete-with-action action (ucs-names) string pred)))))))
(let* ((enable-recursive-minibuffers t)
(input
(completing-read
prompt
(lambda (string pred action)
(let ((completion-ignore-case t))
(if (eq action 'metadata)
'(metadata (category . unicode-name))
(complete-with-action action (ucs-names) string pred)))))))
(cond
((string-match-p "\\`[0-9a-fA-F]+\\'" input)
(string-to-number input 16))

View file

@ -520,7 +520,7 @@ This is like `describe-bindings', but displays only Isearch keys."
(define-key map "\C-x" nil)
(define-key map [?\C-x t] 'isearch-other-control-char)
(define-key map "\C-x8" nil)
(define-key map "\C-x8\r" 'isearch-other-control-char)
(define-key map "\C-x8\r" 'isearch-insert-char-by-name)
map)
"Keymap for `isearch-mode'.")
@ -1118,23 +1118,17 @@ If MSG is non-nil, use `isearch-message', otherwise `isearch-string'."
(length succ-msg)
0))))
(defun isearch-edit-string ()
"Edit the search string in the minibuffer.
The following additional command keys are active while editing.
\\<minibuffer-local-isearch-map>
\\[exit-minibuffer] to resume incremental searching with the edited string.
\\[isearch-nonincremental-exit-minibuffer] to do one nonincremental search.
\\[isearch-forward-exit-minibuffer] to resume isearching forward.
\\[isearch-reverse-exit-minibuffer] to resume isearching backward.
\\[isearch-complete-edit] to complete the search string using the search ring."
(defmacro with-isearch-suspended (&rest body)
"Exit Isearch mode, run BODY, and reinvoke the pending search.
You can update the global isearch variables by setting new values to
`isearch-new-string', `isearch-new-message', `isearch-new-forward',
`isearch-new-word', `isearch-new-case-fold'."
;; This code is very hairy for several reasons, explained in the code.
;; Mainly, isearch-mode must be terminated while editing and then restarted.
;; If there were a way to catch any change of buffer from the minibuffer,
;; this could be simplified greatly.
;; Editing doesn't back up the search point. Should it?
(interactive)
(condition-case nil
`(condition-case nil
(progn
(let ((isearch-nonincremental isearch-nonincremental)
@ -1197,29 +1191,7 @@ The following additional command keys are active while editing.
(setq old-point (point) old-other-end isearch-other-end)
(unwind-protect
(let* ((message-log-max nil)
;; Don't add a new search string to the search ring here
;; in `read-from-minibuffer'. It should be added only
;; by `isearch-update-ring' called from `isearch-done'.
(history-add-new-input nil)
;; Binding minibuffer-history-symbol to nil is a work-around
;; for some incompatibility with gmhist.
(minibuffer-history-symbol))
(setq isearch-new-string
(read-from-minibuffer
(isearch-message-prefix nil isearch-nonincremental)
(cons isearch-string (1+ (or (isearch-fail-pos)
(length isearch-string))))
minibuffer-local-isearch-map nil
(if isearch-regexp
(cons 'regexp-search-ring
(1+ (or regexp-search-ring-yank-pointer -1)))
(cons 'search-ring
(1+ (or search-ring-yank-pointer -1))))
nil t)
isearch-new-message
(mapconcat 'isearch-text-char-description
isearch-new-string "")))
(progn ,@body)
;; Set point at the start (end) of old match if forward (backward),
;; so after exiting minibuffer isearch resumes at the start (end)
@ -1278,6 +1250,41 @@ The following additional command keys are active while editing.
(isearch-abort) ;; outside of let to restore outside global values
)))
(defun isearch-edit-string ()
"Edit the search string in the minibuffer.
The following additional command keys are active while editing.
\\<minibuffer-local-isearch-map>
\\[exit-minibuffer] to resume incremental searching with the edited string.
\\[isearch-nonincremental-exit-minibuffer] to do one nonincremental search.
\\[isearch-forward-exit-minibuffer] to resume isearching forward.
\\[isearch-reverse-exit-minibuffer] to resume isearching backward.
\\[isearch-complete-edit] to complete the search string using the search ring."
(interactive)
(with-isearch-suspended
(let* ((message-log-max nil)
;; Don't add a new search string to the search ring here
;; in `read-from-minibuffer'. It should be added only
;; by `isearch-update-ring' called from `isearch-done'.
(history-add-new-input nil)
;; Binding minibuffer-history-symbol to nil is a work-around
;; for some incompatibility with gmhist.
(minibuffer-history-symbol))
(setq isearch-new-string
(read-from-minibuffer
(isearch-message-prefix nil isearch-nonincremental)
(cons isearch-string (1+ (or (isearch-fail-pos)
(length isearch-string))))
minibuffer-local-isearch-map nil
(if isearch-regexp
(cons 'regexp-search-ring
(1+ (or regexp-search-ring-yank-pointer -1)))
(cons 'search-ring
(1+ (or search-ring-yank-pointer -1))))
nil t)
isearch-new-message
(mapconcat 'isearch-text-char-description
isearch-new-string "")))))
(defun isearch-nonincremental-exit-minibuffer ()
(interactive)
(setq isearch-nonincremental t)
@ -1841,6 +1848,17 @@ Subword is used when `subword-mode' is activated. "
(lambda () (let ((inhibit-field-text-motion t))
(line-end-position (if (eolp) 2 1))))))
(defun isearch-insert-char-by-name ()
"Read a character by its Unicode name and insert it into search string."
(interactive)
(with-isearch-suspended
(let ((char (read-char-by-name "Insert character (Unicode name or hex): ")))
(when char
(setq isearch-new-string (concat isearch-string (string char))
isearch-new-message (concat isearch-message
(mapconcat 'isearch-text-char-description
(string char) "")))))))
(defun isearch-search-and-update ()
;; Do the search and update the display.
(when (or isearch-success