* 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:
parent
8370def5c8
commit
279f9b06fd
4 changed files with 82 additions and 44 deletions
5
etc/NEWS
5
etc/NEWS
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue