From: Karl Fogel <kfogel@red-bean.com>
To: Emacs developers <emacs-devel@gnu.org>
Subject: Re: PATCH: isearch-yank-until-char
Date: Sat, 24 Aug 2019 21:14:51 -0500 [thread overview]
Message-ID: <877e7256uc.fsf@red-bean.com> (raw)
In-Reply-To: <87lfvt6m1e.fsf@mail.linkov.net> (Juri Linkov's message of "Fri, 16 Aug 2019 20:52:21 +0300")
[-- Attachment #1: Type: text/plain, Size: 2028 bytes --]
On 16 Aug 2019, Juri Linkov wrote:
>>> Should your new command catch this error?
>>
>> It could. I'm not sure exacly what to do with the error, though.
>> The new version below displays a brief message and then returns to the
>> isearch prompt:
>>
>> This feels klugey, but I'm not sure what a better way is. Do you have
>> any ideas?
>
>Isearch used to catch errors and display the error message
>at the end of the isearch message by setting `isearch-error'.
>Why it doesn't do this now, I don't know, this needs more investigation.
>Maybe just setting `isearch-error' to the error message would help.
Well, I tried setting `isearch-error' in the error case -- instead of using `message' as the current patch does -- but it didn't seem to have any useful effect. I just got the "I-search:" prompt back immediately, with no indication that the character I had typed was not found. Then I tried keeping the current `message' code and *also* setting `isearch-error', but that seemed to have no effect either. The result was exactly the same as the current message behavior.
So I've left the code as-is; the current patch is attached here.
Do we have consensus to install it?
I don't have a good sense of whether there's consensus yet. We had some discussion about what keybinding to use within isearch, but (I think) the outcome was that M-C-c was an okay choice. We also seemed to agree that the current way of handling the "char not found" error is a bit klugey, but we don't know a better way to do it (or at least I don't know a better way).
(Through the discussion, thanks to you Juri, I also learned about the more general `isearch-yank-on-move'. For those who deliberately choose that behavior and won't be confused by it, it's pretty neat! But I think it's orthogonal to this patch, since the point of this patch is to add a transparent new behavior within traditional isearch -- that is, a behavior that won't get in the way or cause any surprises for those who don't learn about it.)
Best regards,
-Karl
[-- Attachment #2: isearch-yank-until-char-20190824.txt --]
[-- Type: text/plain, Size: 3999 bytes --]
[[[
Add `isearch-yank-until-char'
* lisp/isearch.el (isearch-yank-until-char): New function.
(isearch-mode-map, isearch-menu-bar-yank-map): Add it.
(isearch-forward): Document the new binding.
* doc/emacs/search.texi (Isearch Yanking): Document the feature.
* etc/NEWS: Mention the above.
]]]
--- doc/emacs/search.texi
+++ doc/emacs/search.texi
@@ -262,11 +262,17 @@ Isearch Yank
@kindex M-s C-e @r{(Incremental search)}
@findex isearch-yank-line
- Similarly, @kbd{M-s C-e} (@code{isearch-yank-line}) appends the rest
+ @kbd{M-s C-e} (@code{isearch-yank-line}) appends the rest
of the current line to the search string. If point is already at the
end of a line, it appends the next line. With a prefix argument
@var{n}, it appends the next @var{n} lines.
+@kindex C-M-c @r{(Incremental search)}
+@findex isearch-yank-until-char
+ Similarly, @kbd{C-M-c} (@code{isearch-yank-until-char}) appends to
+the search string everything from point until the next occurence of
+a specified character (not including that character).
+
@kindex C-y @r{(Incremental search)}
@kindex M-y @r{(Incremental search)}
@kindex mouse-2 @r{in the minibuffer (Incremental search)}
--- etc/NEWS
+++ etc/NEWS
@@ -1202,6 +1202,10 @@ highlight in one iteration while processing the full buffer.
+++
*** New isearch bindings.
+'C-M-c' invokes new function 'isearch-yank-until-char', which yanks
+everything from point to the specified character into the search
+string.
+
'C-M-w' in isearch changed from 'isearch-del-char' to the new function
'isearch-yank-symbol-or-char'. 'isearch-del-char' is now bound to
'C-M-d'.
--- lisp/isearch.el
+++ lisp/isearch.el
@@ -514,6 +514,9 @@ isearch-menu-bar-yank-map
(define-key map [isearch-yank-kill]
'(menu-item "Current kill" isearch-yank-kill
:help "Append current kill to search string"))
+ (define-key map [isearch-yank-until-char]
+ '(menu-item "Until char..." isearch-yank-until-char
+ :help "Yank from point to specified character into search string"))
(define-key map [isearch-yank-line]
'(menu-item "Rest of line" isearch-yank-line
:help "Yank the rest of the current line on search string"))
@@ -705,6 +708,7 @@ isearch-mode-map
(define-key map "\M-\C-d" 'isearch-del-char)
(define-key map "\M-\C-y" 'isearch-yank-char)
(define-key map "\C-y" 'isearch-yank-kill)
+ (define-key map "\M-\C-c" 'isearch-yank-until-char)
(define-key map "\M-s\C-e" 'isearch-yank-line)
(define-key map "\M-s\M-<" 'isearch-beginning-of-buffer)
@@ -998,6 +1002,8 @@ isearch-forward
Type \\[isearch-del-char] to delete character from end of search string.
Type \\[isearch-yank-char] to yank char from buffer onto end of search\
string and search for it.
+Type \\[isearch-yank-until-char] to yank from point until the next instance\
+ of a specified character onto end of search string and search for it.
Type \\[isearch-yank-line] to yank rest of line onto end of search string\
and search for it.
Type \\[isearch-yank-kill] to yank the last string of killed text.
@@ -2562,6 +2568,21 @@ isearch-yank-word
(interactive "p")
(isearch-yank-internal (lambda () (forward-word arg) (point))))
+(defun isearch-yank-until-char (char)
+ "Pull everything until next instance of CHAR from buffer into search string.
+Interactively, prompt for CHAR."
+ (interactive "cYank until character: ")
+ (isearch-yank-internal
+ (lambda () (let ((inhibit-field-text-motion t))
+ (condition-case nil
+ (progn
+ (search-forward (char-to-string char))
+ (forward-char -1))
+ (search-failed
+ (message "`%c' not found" char)
+ (sit-for 2)))
+ (point)))))
+
(defun isearch-yank-line (&optional arg)
"Pull rest of line from buffer into search string.
If optional ARG is non-nil, yank the next ARG lines."
next prev parent reply other threads:[~2019-08-25 2:14 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-14 3:05 PATCH: isearch-yank-until-char Karl Fogel
2019-08-14 14:20 ` Eli Zaretskii
2019-08-14 16:41 ` Karl Fogel
2019-08-14 16:48 ` Drew Adams
2019-08-14 17:20 ` Eli Zaretskii
2019-08-14 17:22 ` Karl Fogel
2019-08-14 17:51 ` Eli Zaretskii
2019-08-14 17:59 ` Noam Postavsky
2019-08-14 20:39 ` Juri Linkov
2019-08-14 20:34 ` Juri Linkov
2019-08-16 4:53 ` Karl Fogel
2019-08-16 17:52 ` Juri Linkov
2019-08-25 2:14 ` Karl Fogel [this message]
2019-08-25 3:22 ` Drew Adams
2019-08-25 20:03 ` Juri Linkov
2019-08-26 1:14 ` Drew Adams
2019-08-26 5:20 ` Karl Fogel
2019-08-26 14:50 ` Drew Adams
2019-08-26 17:51 ` Karl Fogel
2019-08-26 19:36 ` Drew Adams
2019-08-26 21:29 ` Karl Fogel
2019-08-26 21:57 ` Drew Adams
2019-08-26 22:21 ` Karl Fogel
2019-08-26 22:43 ` Drew Adams
2019-09-04 16:47 ` Karl Fogel
2019-09-04 17:00 ` Eli Zaretskii
2019-09-12 17:44 ` Karl Fogel
2019-09-16 21:24 ` Drew Adams
2019-09-17 16:02 ` Karl Fogel
2019-08-26 21:46 ` Juri Linkov
2019-08-26 21:52 ` Karl Fogel
2019-08-26 22:03 ` Drew Adams
2019-08-26 22:19 ` Juri Linkov
2019-08-26 22:33 ` Karl Fogel
2019-08-26 22:40 ` Drew Adams
2019-08-27 21:31 ` Juri Linkov
2019-08-27 22:52 ` Drew Adams
2019-08-27 23:15 ` Drew Adams
2019-08-25 19:58 ` Juri Linkov
2019-08-14 22:26 ` Stefan Monnier
2019-08-15 18:24 ` Juri Linkov
2019-08-17 12:31 ` Stefan Monnier
2019-08-17 22:51 ` Juri Linkov
2019-08-16 5:11 ` Karl Fogel
[not found] <<87tvakfnv4.fsf@red-bean.com>
[not found] ` <<835zmzsuau.fsf@gnu.org>
2019-08-14 15:24 ` Drew Adams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=877e7256uc.fsf@red-bean.com \
--to=kfogel@red-bean.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).