From: Juri Linkov Date: Thu, 13 Jun 2013 20:50:51 +0000 (+0300) Subject: Add prefix arg to more isearch commands. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~2016^2~122 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6e8cfc81e747bef8edd1f5df2c25b6a00c766a03;p=emacs.git Add prefix arg to more isearch commands. * lisp/isearch.el (isearch-yank-word, isearch-yank-line) (isearch-char-by-name, isearch-quote-char) (isearch-printing-char, isearch-process-search-char): Add optional count prefix arg. * lisp/international/isearch-x.el (isearch-process-search-multibyte-characters): Add optional count prefix arg. Fixes: debbugs:14563 --- diff --git a/etc/NEWS b/etc/NEWS index 7e26c2458e8..8bf1d17005e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -296,6 +296,10 @@ and opens overlays with hidden text when `search-invisible' is `open'. *** By default, prefix arguments do not now terminate Isearch mode. Set `isearch-allow-prefix' to nil to restore old behavior. +*** More Isearch commands accept prefix arguments, namely +`isearch-printing-char', `isearch-quote-char', `isearch-yank-word', +`isearch-yank-line'. + ** MH-E has been updated to MH-E version 8.5. See MH-E-NEWS for details. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3525568ab2d..974fad3e306 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2013-06-13 Juri Linkov + + * isearch.el (isearch-yank-word, isearch-yank-line) + (isearch-char-by-name, isearch-quote-char) + (isearch-printing-char, isearch-process-search-char): + Add optional count prefix arg. (Bug#14563) + + * international/isearch-x.el + (isearch-process-search-multibyte-characters): + Add optional count prefix arg. + 2013-06-13 Stefan Monnier * subr.el (internal-push-keymap, internal-pop-keymap): New functions. @@ -4667,7 +4678,7 @@ * progmodes/grep.el (grep-regexp-alist): Use variable grep-match-face instead of hard-coded default face `match'. (Bug#9438) -2012-02-01 Christopher Schmidt +2013-02-01 Christopher Schmidt * vc/vc-arch.el (vc-arch-registered): * vc/vc-bzr.el (vc-bzr-registered): diff --git a/lisp/international/isearch-x.el b/lisp/international/isearch-x.el index 992236ce1ad..37213b95d3e 100644 --- a/lisp/international/isearch-x.el +++ b/lisp/international/isearch-x.el @@ -94,7 +94,7 @@ (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) (prompt (isearch-message-prefix)) @@ -136,8 +136,11 @@ (if (and str (> (length str) 0)) (let ((unread-command-events nil)) - (isearch-process-search-string str str)) + (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 diff --git a/lisp/isearch.el b/lisp/isearch.el index d9f8b0891e4..4754f86d5d7 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -1919,29 +1919,33 @@ Subword is used when `subword-mode' is activated. " (forward-word 1)) (forward-char 1)) (point)))) -(defun isearch-yank-word () +(defun isearch-yank-word (&optional arg) "Pull next word from buffer into search string." - (interactive) - (isearch-yank-internal (lambda () (forward-word 1) (point)))) + (interactive "p") + (isearch-yank-internal (lambda () (forward-word arg) (point)))) -(defun isearch-yank-line () +(defun isearch-yank-line (&optional arg) "Pull rest of line from buffer into search string." - (interactive) + (interactive "p") (isearch-yank-internal (lambda () (let ((inhibit-field-text-motion t)) - (line-end-position (if (eolp) 2 1)))))) + (line-end-position (if (eolp) (1+ arg) arg)))))) -(defun isearch-char-by-name () +(defun isearch-char-by-name (&optional count) "Read a character by its Unicode name and add it to the search string. -Completion is available like in `read-char-by-name' used by `insert-char'." - (interactive) +Completion is available like in `read-char-by-name' used by `insert-char'. +With argument, add COUNT copies of the character." + (interactive "p") (with-isearch-suspended (let ((char (read-char-by-name "Add character to search (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) ""))))))) + (let ((string (if (and (integerp count) (> count 1)) + (make-string count char) + (char-to-string char)))) + (setq isearch-new-string (concat isearch-string string) + isearch-new-message (concat isearch-message + (mapconcat 'isearch-text-char-description + string "")))))))) (defun isearch-search-and-update () ;; Do the search and update the display. @@ -2382,9 +2386,10 @@ Isearch mode." (t;; otherwise nil (isearch-process-search-string key key))))) -(defun isearch-quote-char () - "Quote special characters for incremental search." - (interactive) +(defun isearch-quote-char (&optional count) + "Quote special characters for incremental search. +With argument, add COUNT copies of the character." + (interactive "p") (let ((char (read-quoted-char (isearch-message t)))) ;; Assume character codes 0200 - 0377 stand for characters in some ;; single-byte character set, and convert them to Emacs @@ -2392,24 +2397,26 @@ Isearch mode." (if (and isearch-regexp isearch-regexp-lax-whitespace (= char ?\s)) (if (subregexp-context-p isearch-string (length isearch-string)) (isearch-process-search-string "[ ]" " ") - (isearch-process-search-char char)) + (isearch-process-search-char char count)) (and enable-multibyte-characters (>= char ?\200) (<= char ?\377) (setq char (unibyte-char-to-multibyte char))) - (isearch-process-search-char char)))) - -(defun isearch-printing-char () - "Add this ordinary printing character to the search string and search." - (interactive) - (let ((char last-command-event)) + (isearch-process-search-char char count)))) + +(defun isearch-printing-char (&optional char count) + "Add this ordinary printing CHAR to the search string and search. +With argument, add COUNT copies of the character." + (interactive (list last-command-event + (prefix-numeric-value current-prefix-arg))) + (let ((char (or char last-command-event))) (if (= char ?\S-\ ) (setq char ?\s)) (if current-input-method - (isearch-process-search-multibyte-characters char) - (isearch-process-search-char char)))) + (isearch-process-search-multibyte-characters char count) + (isearch-process-search-char char count)))) -(defun isearch-process-search-char (char) +(defun isearch-process-search-char (char &optional count) ;; * and ? are special in regexps when not preceded by \. ;; } and | are special in regexps when preceded by \. ;; Nothing special for + because it matches at least once. @@ -2418,12 +2425,15 @@ Isearch mode." ((eq char ?\}) (isearch-fallback t t)) ((eq char ?|) (isearch-fallback t nil t))) - ;; Append the char to the search string, update the message and re-search. - (isearch-process-search-string - (char-to-string char) - (if (>= char ?\200) - (char-to-string char) - (isearch-text-char-description char)))) + ;; Append the char(s) to the search string, + ;; update the message and re-search. + (let* ((string (if (and (integerp count) (> count 1)) + (make-string count char) + (char-to-string char))) + (message (if (>= char ?\200) + string + (mapconcat 'isearch-text-char-description string "")))) + (isearch-process-search-string string message))) (defun isearch-process-search-string (string message) (setq isearch-string (concat isearch-string string)