Commit 279f9b06 authored by Juri Linkov's avatar Juri Linkov
Browse files

* 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
parent 8370def5
...@@ -73,6 +73,11 @@ amounts of data into the ERC input. ...@@ -73,6 +73,11 @@ amounts of data into the ERC input.
*** The icomplete-separator is customizable, and its default has changed. *** The icomplete-separator is customizable, and its default has changed.
*** Removed icomplete-show-key-bindings. *** 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. ** MH-E has been updated to MH-E version 8.4.
See MH-E-NEWS for details. See MH-E-NEWS for details.
......
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> 2012-12-15 Juri Linkov <juri@jurta.org>
   
* isearch.el (isearch-delete-char, isearch-del-char): Doc fix. * isearch.el (isearch-delete-char, isearch-del-char): Doc fix.
......
...@@ -2945,7 +2945,8 @@ at the beginning of the name. ...@@ -2945,7 +2945,8 @@ at the beginning of the name.
This function also accepts a hexadecimal number of Unicode code This function also accepts a hexadecimal number of Unicode code
point or a number in hash notation, e.g. #o21430 for octal, point or a number in hash notation, e.g. #o21430 for octal,
#x2318 for hex, or #10r8984 for decimal." #x2318 for hex, or #10r8984 for decimal."
(let ((input (let* ((enable-recursive-minibuffers t)
(input
(completing-read (completing-read
prompt prompt
(lambda (string pred action) (lambda (string pred action)
......
...@@ -520,7 +520,7 @@ This is like `describe-bindings', but displays only Isearch keys." ...@@ -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" nil)
(define-key map [?\C-x t] 'isearch-other-control-char) (define-key map [?\C-x t] 'isearch-other-control-char)
(define-key map "\C-x8" nil) (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) map)
"Keymap for `isearch-mode'.") "Keymap for `isearch-mode'.")
...@@ -1118,23 +1118,17 @@ If MSG is non-nil, use `isearch-message', otherwise `isearch-string'." ...@@ -1118,23 +1118,17 @@ If MSG is non-nil, use `isearch-message', otherwise `isearch-string'."
(length succ-msg) (length succ-msg)
0)))) 0))))
(defun isearch-edit-string () (defmacro with-isearch-suspended (&rest body)
"Edit the search string in the minibuffer. "Exit Isearch mode, run BODY, and reinvoke the pending search.
The following additional command keys are active while editing. You can update the global isearch variables by setting new values to
\\<minibuffer-local-isearch-map> `isearch-new-string', `isearch-new-message', `isearch-new-forward',
\\[exit-minibuffer] to resume incremental searching with the edited string. `isearch-new-word', `isearch-new-case-fold'."
\\[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."
;; This code is very hairy for several reasons, explained in the code. ;; This code is very hairy for several reasons, explained in the code.
;; Mainly, isearch-mode must be terminated while editing and then restarted. ;; 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, ;; If there were a way to catch any change of buffer from the minibuffer,
;; this could be simplified greatly. ;; this could be simplified greatly.
;; Editing doesn't back up the search point. Should it? ;; Editing doesn't back up the search point. Should it?
(interactive) `(condition-case nil
(condition-case nil
(progn (progn
(let ((isearch-nonincremental isearch-nonincremental) (let ((isearch-nonincremental isearch-nonincremental)
...@@ -1197,29 +1191,7 @@ The following additional command keys are active while editing. ...@@ -1197,29 +1191,7 @@ The following additional command keys are active while editing.
(setq old-point (point) old-other-end isearch-other-end) (setq old-point (point) old-other-end isearch-other-end)
(unwind-protect (unwind-protect
(let* ((message-log-max nil) (progn ,@body)
;; 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 "")))
;; Set point at the start (end) of old match if forward (backward), ;; Set point at the start (end) of old match if forward (backward),
;; so after exiting minibuffer isearch resumes at the start (end) ;; so after exiting minibuffer isearch resumes at the start (end)
...@@ -1278,6 +1250,41 @@ The following additional command keys are active while editing. ...@@ -1278,6 +1250,41 @@ The following additional command keys are active while editing.
(isearch-abort) ;; outside of let to restore outside global values (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 () (defun isearch-nonincremental-exit-minibuffer ()
(interactive) (interactive)
(setq isearch-nonincremental t) (setq isearch-nonincremental t)
...@@ -1841,6 +1848,17 @@ Subword is used when `subword-mode' is activated. " ...@@ -1841,6 +1848,17 @@ Subword is used when `subword-mode' is activated. "
(lambda () (let ((inhibit-field-text-motion t)) (lambda () (let ((inhibit-field-text-motion t))
(line-end-position (if (eolp) 2 1)))))) (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 () (defun isearch-search-and-update ()
;; Do the search and update the display. ;; Do the search and update the display.
(when (or isearch-success (when (or isearch-success
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment