* updating buffer window while accepting minibuffer input
[not found] <mailman.161.1405526455.3403.help-gnu-emacs@gnu.org>
@ 2014-07-16 21:12 ` Buchs, Kevin J.
2014-07-16 21:50 ` Drew Adams
2014-07-17 0:52 ` Michael Heerdegen
0 siblings, 2 replies; 5+ messages in thread
From: Buchs, Kevin J. @ 2014-07-16 21:12 UTC (permalink / raw
To: help-gnu-emacs
This is a follow-up to "regexp nirvana - near miss" (thanks Drew for
giving me this programming burden ;-). I'm wanting to traverse a list of
buffer positions according to minibuffer keystrokes and have the
referenced buffer position update (and eventually highlight) much like
isearch-*. I'm stuck on the buffer position not actually updating
whilest I am in the midst of (read-minibuffer-input). I have spent about
two hours delving into how isearch works and came out without a clue as
to how it actually gets minibuffer reading activated. So, I'm seeking
help. Code follows signature.
Kevin Buchs Research Computer Services Phone: 507-538-5459
Mayo Clinic 200 1st. St SW Rochester, MN 55905
http://mayoclinic.org http://facebook.com/MayoClinic http://youtube.com/MayoClinic http://twitter.com/MayoClinic
(defun regexpneg-fwd ()
(interactive)
;; Move to next match
(if (< regexpneg-pointer (1- (length regexpneg-list)))
(progn
(set-buffer regexpneg-buffer)
(setq regexpneg-pointer (1+ regexpneg-pointer))
(goto-char (nth regexpneg-pointer regexpneg-list))
(recenter 5)
(message "buffer: %S, position: %d, pointer: %d"
(current-buffer) (point) regexpneg-pointer))))
(defun regexpneg-rev ()
(interactive)
;; Move to prior match
(unless (= regexpneg-pointer 0)
(set-buffer regexpneg-buffer)
(setq regexpneg-pointer (1- regexpneg-pointer))
(goto-char (nth regexpneg-pointer regexpneg-list))
(recenter 5)
(message "buffer: %S, position: %d, pointer: %d"
(current-buffer) (point) regexpneg-pointer)))
(defun regexpneg (part negpart)
"Search for regexp part, not followed by regexp negpart; You can
advance in search hits with C-s or SPACE. Reverse with C-r or DEL"
(interactive)
(let (
(point-start (point))
(subsetnotlist '()))
;; Save a reference to current buffer
(setq regexpneg-buffer (current-buffer))
;; Search for 'part' - return list of locations =
regexpneg-list
(setq regexpneg-list '())
(while (re-search-forward part nil t)
(setq regexpneg-list (append regexpneg-list
(list (match-beginning 0)))))
;; Search for 'part'+'negpart' - return list of locations =
subsetnotlist
(goto-char point-start)
(while (re-search-forward (concat part negpart) nil t)
(setq subsetnotlist (append subsetnotlist (list
(match-beginning 0)))))
;; Delete members of subsetnotlist from regexpneg-list
(dolist (var subsetnotlist)
(delq var regexpneg-list))
;; Check for keymap or create it
(unless (keymapp 'regexpneg-keymap)
(setq regexpneg-keymap (make-sparse-keymap))
(define-key regexpneg-keymap "\C-s" 'regexpneg-fwd)
(define-key regexpneg-keymap " " 'regexpneg-fwd)
(define-key regexpneg-keymap "\C-r" 'regexpneg-rev)
(define-key regexpneg-keymap "DEL" 'regexpneg-rev)
(define-key regexpneg-keymap "\C-j" 'exit-minibuffer)
(define-key regexpneg-keymap "\C-m" 'exit-minibuffer))
;; Set index-pointer
(setq regexpneg-pointer 0)
;; Move to first match
(goto-char (nth regexpneg-pointer regexpneg-list))
(message "buffer: %S, position: %d, pointer: %d"
(current-buffer) (point) regexpneg-pointer)
;; Show minibuffer for further options
(setq resp (read-from-minibuffer
"REN: fwd=C-s,SPACE; rev=C-r,DEL; exit=C-j,C-m: " nil
regexpneg-keymap))
(message "got response '%s'" resp)))
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: updating buffer window while accepting minibuffer input
2014-07-16 21:12 ` updating buffer window while accepting minibuffer input Buchs, Kevin J.
@ 2014-07-16 21:50 ` Drew Adams
2014-07-17 0:52 ` Michael Heerdegen
1 sibling, 0 replies; 5+ messages in thread
From: Drew Adams @ 2014-07-16 21:50 UTC (permalink / raw
To: Buchs, Kevin J., help-gnu-emacs
> I'm wanting to traverse a list of
> buffer positions according to minibuffer keystrokes and have the
> referenced buffer position update (and eventually highlight) much like
> isearch-*. I'm stuck on the buffer position not actually updating
> whilest I am in the midst of (read-minibuffer-input). I have spent about
> two hours delving into how isearch works and came out without a clue as
> to how it actually gets minibuffer reading activated.
The Isearch code is a bit complicated. If you follow its model then you
will likely need to do many of the state-maintenance etc. things it does,
which are not necessarily directly related to searching.
Of particular note: Isearch does not really use the minibuffer (except
for odd jobs like when you use `M-e' to edit the search string).
Instead, it handles events in the usual way that Emacs does. (In Emacs,
every key you hit corresponds to a command, which is then invoked.)
In Isearch, certain input events correspond to keys that are bound to
particular Isearch actions. Other keys, such as `a', `B', `9', and `$'
have, as their corresponding action, to add the corresponding printable
character (`a', `B', `9', `$' etc.) to the search string. Search then
begins again automatically (resumes), using the newly updated search string.
See `isearch-printing-char' for the treatment of printable chars.
In sum, the minibuffer is not involved at all, for reading your input.
In particular, you do *not* want to use `read-input-from-minibuffer',
if you want Isearch-like behavior.
(FWIW, I'm no expert on Isearch. HTH. Juri Linkov is one of the best
placed to answer questions about its code.)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: updating buffer window while accepting minibuffer input
2014-07-16 21:12 ` updating buffer window while accepting minibuffer input Buchs, Kevin J.
2014-07-16 21:50 ` Drew Adams
@ 2014-07-17 0:52 ` Michael Heerdegen
2014-07-17 1:43 ` Drew Adams
1 sibling, 1 reply; 5+ messages in thread
From: Michael Heerdegen @ 2014-07-17 0:52 UTC (permalink / raw
To: help-gnu-emacs
"Buchs, Kevin J." <buchs.kevin@mayo.edu> writes:
> This is a follow-up to "regexp nirvana - near miss" (thanks Drew for
> giving me this programming burden ;-).
BTW, what nobody said yet is that both Icicles and Helm implement buffer
searches that allow negation, i.e., have built in what you described in
your prior post. Before you reinvent the wheel ... maybe you find one
of these sufficient.
In Icicles' search, use the normal candidate exclusion mechanism.
In helm, use helm-occur and enter e.g. "rx1 !rx1rx2" to match lines that
match regexp rx1, but that do not match regexp rx1 followed by regexp
rx2 ("!" just means "negation").
Michael.
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: updating buffer window while accepting minibuffer input
2014-07-17 0:52 ` Michael Heerdegen
@ 2014-07-17 1:43 ` Drew Adams
2014-07-17 2:43 ` Michael Heerdegen
0 siblings, 1 reply; 5+ messages in thread
From: Drew Adams @ 2014-07-17 1:43 UTC (permalink / raw
To: Michael Heerdegen, help-gnu-emacs
> In Icicles' search, use the normal candidate exclusion mechanism.
Which means:
1. Type a pattern to match whatever subset of the current
set of candidates you want to remove (exclude, subtract).
2. Then use `C-~' to remove them.
See "Chip Away the Non-Elephant" in the Icicles doc:
http://www.emacswiki.org//Icicles_-_Nutshell_View#ChippingAway
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: updating buffer window while accepting minibuffer input
2014-07-17 1:43 ` Drew Adams
@ 2014-07-17 2:43 ` Michael Heerdegen
0 siblings, 0 replies; 5+ messages in thread
From: Michael Heerdegen @ 2014-07-17 2:43 UTC (permalink / raw
To: help-gnu-emacs
Drew Adams <drew.adams@oracle.com> writes:
> > In Icicles' search, use the normal candidate exclusion mechanism.
>
> Which means:
>
> 1. Type a pattern to match whatever subset of the current
> set of candidates you want to remove (exclude, subtract).
>
> 2. Then use `C-~' to remove them.
>
> See "Chip Away the Non-Elephant" in the Icicles doc:
> http://www.emacswiki.org//Icicles_-_Nutshell_View#ChippingAway
Thanks for elaborating, Drew.
Let me add: the poor man's version of this - or of doing this similarly
with helm - without using external packages could be reached with M-x
occur combined with M-x hide-lines. Doesn't offer all the features that
come with these packages, but does the job.
Michael.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-07-17 2:43 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <mailman.161.1405526455.3403.help-gnu-emacs@gnu.org>
2014-07-16 21:12 ` updating buffer window while accepting minibuffer input Buchs, Kevin J.
2014-07-16 21:50 ` Drew Adams
2014-07-17 0:52 ` Michael Heerdegen
2014-07-17 1:43 ` Drew Adams
2014-07-17 2:43 ` Michael Heerdegen
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.