From: "Drew Adams" <drew.adams@oracle.com>
To: <rms@gnu.org>
Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
Subject: RE: propose adding Icicles to Emacs
Date: Sat, 16 Jun 2007 15:36:11 -0700 [thread overview]
Message-ID: <EIENLHALHGIMHGDOLMIMEEJPDCAA.drew.adams@oracle.com> (raw)
In-Reply-To: <E1HzdMo-0006yJ-Gw@fencepost.gnu.org>
> 2. My `mouse-choose-completion' also records the number of the current
> completion candidate in a global variable. This is so that
> Icicles functions that work with the candidate number will also work
> when you choose a candidate with the mouse, not just by cycling.
> The candidate number is very important for Icicles, some functionality
> being dependent on it.
>
> I don't understand what a "candidate number" is, and I think we will
> have to consider this issue along with the core Icicles features.
Let me explain. It's pretty important for Icicles.
The TABLE arg to `completing-read' can be an alist whose elements can be
conses whose cars are strings. The element cdrs can be anything.
You can choose a candidate in different ways in Icicles, including by
cycling to it and using RET, C-RET, or C-M-RET on the "current candidate"
during cycling. You can also choose it with `mouse-2', `C-mouse-2', or
`C-M-mouse-2' in *Completions*.
In some important cases, it is not enough to recuperate the string used in
*Completions* as the return value from `completing-read'. In those cases,
Icicles must recuperate the entire raw candidate value from the TABLE
argument - that is, it needs not only the candidate name but also its
associated alist data, that is, both the car and the cdr of the candidate
element.
One way that Icicles does this (the best way, when it is possible) is to use
the number (i.e. index) of the candidate in the TABLE arg. This index
corresponds to the order of candidates when cycling and the order of the
candidates in *Completions*.
Keep in mind that for some commands there can be different raw candidates
that have the same string name. For example, a candidate to `icicle-search'
looks like this:
(SEARCH-HIT-STRING . HIT-END-MARKER) or
((SEARCH-HIT-STRING BUFFER-NAME) . HIT-END-MARKER), where
. SEARCH-HIT-STRING is the candidate "name", that is, the displayed
candidate in *Completions*. It is a search-pattern hit.
. HIT-END-MARKER is a marker at the end of the search hit.
It enables search to go to the hit.
. BUFFER-NAME is a string naming the buffer of the hit. It is
propertized for *Completions*, to help distinguish hits from
different buffers when searching across buffers. That is,
when multiple buffers or files are used, the candidate
displayed in *Completions* has two parts: the search-hit
string and the buffer name. Users can turn this display off
with a user option, so that no BUFFER-NAME is present.
You can see that unless you cycle to define a "current completion candidate"
to choose, or you choose it with the mouse in *Completions*, just picking it
by completing its name does not necessarily uniquely identify the raw
completion candidate. If there is only one matching string, then it does,
but otherwise it does not.
So, you see that it is important for `mouse-choose-completion' to track the
candidate number, just as cycling tracks it. The need is to identify the
proper raw candidate, to be able to recuperate all of its data.
Yes, to forestall a question you might have, this could be implemented
differently if done inside Emacs itself. Working from without, it is a bit
of a workaround. Although `completing-read' lets you pass an alist as TABLE
arg, it does not give you any way to recuperate the alist element given the
chosen string, unless that string is unique. (You can use `assoc', but that
gives you just the first element that has that string.) `completing-read'
returns only the string that names the candidate, not the entire candidate
element from the alist.
Here, to give you an idea, is the code that recuperates a complete raw
candidate value, given its string part:
(defun icicle-get-alist-candidate (cand)
"Return completion candidate (full entry) from `icicle-candidates-alist'.
CAND is the name of the candidate (a string).
If user cycled among candidates or used `mouse-2', then use the
current candidate number, and ignore CAND.
Otherwise:
If only one candidate matches CAND, use that.
Else raise an error telling user to use cycling or `mouse-2'."
(and icicle-candidates-alist
(let ((cand-entries
(icicle-filter-alist icicle-candidates-alist
icicle-completion-candidates)))
(if (wholenump icicle-candidate-nb) ; Cycled or used `mouse-2'.
(elt cand-entries
(mod icicle-candidate-nb
(length icicle-candidates-alist)))
;; If `icicle-completion-candidates' is nil, because user
;; didn't use `TAB' or `S-TAB', then `icicle-candidates-alist'
;; can contain non-matches. So, we check for more than one
;; match. However, we can't just use `assoc', because
;; candidates might be multi-completions (lists).
(let ((first-match (icicle-first-matching-candidate
cand icicle-candidates-alist)))
(if (and first-match
(not (icicle-first-matching-candidate
cand
(setq cand-entries
(delete first-match cand-entries)))))
first-match ; Only one match, so use it.
(error
"Ambiguous choice. Cycle or use `mouse-2' to choose \
unique matching candidate.")))))))
To simplify, think of `icicle-candidate-alist' as the TABLE arg to
`completing-read'. `icicle-filter-alist' filters this alist, keeping only
those candidates that are current (i.e., whose strings are currently
displayed in *Completions*).
`icicle-first-matching-candidate' is like `assoc', but it also treats
multi-completions. Again, a multi-completion is an element of the TABLE arg
passed to `completing-read' whose car is a list of strings instead of a
string; the strings are joined together by my `completing-read' and treated
as a single candidate.
Icicles uses cycling and often makes use of multiple candidates that have
the same display appearance (same string), so the position of the string you
choose in the list of candidates is important. Another way of saying this is
that Icicles has a notion of "current candidate", which vanilla Emacs does
not.
next prev parent reply other threads:[~2007-06-16 22:36 UTC|newest]
Thread overview: 212+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-26 0:19 [drew.adams@oracle.com: RE: cannot find :enable in Elisp manual index] Richard Stallman
2007-05-26 6:05 ` Eli Zaretskii
2007-05-29 4:01 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Drew Adams
2007-05-29 19:12 ` Eli Zaretskii
2007-05-29 20:05 ` Stephen Berman
2007-05-29 20:58 ` Eli Zaretskii
2007-05-29 21:20 ` Stephen Berman
2007-05-29 21:25 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-05-29 21:03 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Drew Adams
2007-05-30 3:20 ` Eli Zaretskii
2007-05-30 4:43 ` Drew Adams
2007-05-30 5:26 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-05-30 15:17 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Johan Bockgård
2007-05-30 23:09 ` Eli Zaretskii
2007-05-30 5:23 ` David Kastrup
2007-05-30 23:01 ` Eli Zaretskii
2007-05-30 23:14 ` Eli Zaretskii
2007-06-02 2:54 ` Richard Stallman
2007-06-02 9:18 ` Jason Rumney
2007-06-02 17:29 ` Richard Stallman
2007-06-02 10:12 ` Robert J. Chassell
2007-06-02 17:29 ` Richard Stallman
2007-06-02 23:47 ` Robert J. Chassell
2007-06-03 21:27 ` Richard Stallman
2007-06-02 10:18 ` Alan Mackenzie
2007-06-02 14:36 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-06-02 17:26 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Eli Zaretskii
2007-06-02 23:47 ` Alan Mackenzie
2007-06-02 23:48 ` Jason Rumney
2007-06-02 17:29 ` Richard Stallman
2007-06-02 18:10 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-06-03 21:27 ` Richard Stallman
2007-06-04 5:30 ` [drew.adams@oracle.com: RE: cannot find :enable inElispmanualindex] Drew Adams
2007-06-02 23:01 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Miles Bader
2007-06-03 0:00 ` Karl Berry
2007-06-03 21:27 ` Richard Stallman
2007-06-03 22:52 ` Juri Linkov
2007-06-03 23:55 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-06-04 5:01 ` Richard Stallman
2007-06-04 5:42 ` [drew.adams@oracle.com: RE: cannot find :enable inElispmanualindex] Drew Adams
2007-06-04 23:20 ` Richard Stallman
2007-06-05 0:10 ` [drew.adams@oracle.com: RE: cannot find :enableinElispmanualindex] Drew Adams
2007-06-06 0:50 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Stefan Monnier
2007-06-06 2:12 ` Drew Adams
2007-06-06 12:26 ` Stefan Monnier
2007-06-06 13:54 ` Drew Adams
2007-06-06 15:06 ` [drew.adams@oracle.com: RE: cannot find :enable inElispmanualindex] Drew Adams
2007-06-06 18:44 ` Juri Linkov
2007-06-06 20:01 ` Stefan Monnier
2007-06-06 20:51 ` Juri Linkov
2007-06-06 21:18 ` Stefan Monnier
2007-06-06 22:01 ` Juri Linkov
2007-06-06 22:24 ` Stefan Monnier
2007-06-06 22:40 ` Karl Berry
2007-06-07 12:37 ` Stefan Monnier
2007-06-07 22:22 ` Karl Berry
2007-06-08 1:00 ` Stefan Monnier
2007-06-08 2:28 ` Karl Berry
2007-06-08 6:58 ` csant
2007-06-08 15:42 ` Stefan Monnier
2007-06-08 7:12 ` Stefan Monnier
2007-06-08 8:34 ` Juri Linkov
2007-06-06 22:04 ` Karl Berry
2007-06-08 7:11 ` Richard Stallman
2007-06-08 8:32 ` Juri Linkov
2007-06-08 15:46 ` Stefan Monnier
2007-06-08 15:52 ` propose adding Icicles to Emacs Drew Adams
2007-06-10 13:19 ` Richard Stallman
2007-06-10 17:16 ` Drew Adams
2007-06-10 18:22 ` Sean O'Rourke
2007-06-11 0:09 ` Drew Adams
2007-06-11 9:44 ` Richard Stallman
2007-06-11 18:33 ` Drew Adams
2007-06-11 19:17 ` Stefan Monnier
2007-06-11 20:53 ` Drew Adams
2007-06-11 21:46 ` Stefan Monnier
2007-06-11 23:21 ` Drew Adams
2007-06-13 8:06 ` Richard Stallman
2007-06-14 7:48 ` Richard Stallman
2007-06-14 15:51 ` Drew Adams
2007-06-14 16:07 ` Stefan Monnier
2007-06-15 0:39 ` Drew Adams
2007-06-15 19:22 ` Richard Stallman
2007-06-15 21:04 ` Drew Adams
2007-06-16 18:51 ` Richard Stallman
2007-06-16 18:51 ` Richard Stallman
2007-06-16 18:51 ` Richard Stallman
2007-06-16 20:53 ` Drew Adams
2007-06-17 8:54 ` Richard Stallman
2007-06-17 18:48 ` Juri Linkov
2007-06-17 20:39 ` Drew Adams
2007-06-17 21:18 ` Juri Linkov
2007-06-17 23:07 ` Drew Adams
2007-06-18 21:17 ` Juri Linkov
2007-06-18 23:31 ` Drew Adams
2007-06-19 8:16 ` Juri Linkov
2007-06-19 14:47 ` Drew Adams
2007-06-18 14:56 ` Stefan Monnier
2007-06-19 22:26 ` Richard Stallman
2007-06-20 6:46 ` Stefan Monnier
2007-06-28 2:41 ` Stefan Monnier
2007-06-28 15:47 ` Drew Adams
2007-06-28 19:25 ` Richard Stallman
2007-06-28 20:03 ` Stefan Monnier
2007-06-29 5:10 ` Richard Stallman
2007-06-18 21:31 ` Richard Stallman
2007-06-19 3:52 ` Stefan Monnier
2007-06-19 22:26 ` Richard Stallman
2007-06-19 23:11 ` Drew Adams
2007-06-20 1:19 ` Stefan Monnier
2007-06-19 22:47 ` Drew Adams
2007-06-19 23:15 ` Drew Adams
2007-06-20 14:19 ` Juri Linkov
2007-06-20 15:13 ` Drew Adams
2007-06-20 15:13 ` Stefan Monnier
2007-06-20 15:34 ` Drew Adams
2007-06-20 15:50 ` Juri Linkov
2007-06-20 16:02 ` Juanma Barranquero
2007-06-20 16:38 ` Drew Adams
2007-06-20 17:28 ` Drew Adams
2007-06-20 17:51 ` Juri Linkov
2007-06-21 1:07 ` Richard Stallman
2007-06-19 22:48 ` Drew Adams
2007-06-20 17:36 ` Richard Stallman
2007-06-16 18:51 ` Richard Stallman
2007-06-16 19:58 ` Drew Adams
2007-06-16 18:51 ` Richard Stallman
2007-06-16 22:36 ` Drew Adams [this message]
2007-06-17 21:49 ` Richard Stallman
2007-06-16 18:51 ` Richard Stallman
2007-06-16 22:29 ` Drew Adams
2007-06-17 21:48 ` Richard Stallman
2007-06-17 22:18 ` Drew Adams
2007-06-18 16:15 ` Drew Adams
2007-06-25 13:19 ` Richard Stallman
2007-06-25 14:57 ` Drew Adams
2007-06-25 19:52 ` Richard Stallman
2007-06-25 21:40 ` Drew Adams
2007-06-26 16:57 ` Richard Stallman
2007-06-26 17:36 ` Drew Adams
2007-07-01 20:40 ` Richard Stallman
2007-07-01 21:54 ` Drew Adams
2007-07-02 19:47 ` Richard Stallman
2007-07-02 22:19 ` Drew Adams
2007-07-03 4:24 ` Richard Stallman
2007-07-03 7:56 ` Drew Adams
2007-07-04 3:43 ` Richard Stallman
2007-07-04 6:13 ` Drew Adams
2007-06-25 20:47 ` Juri Linkov
2007-06-21 18:35 ` Davis Herring
2007-06-21 18:39 ` Lennart Borgman (gmail)
2007-06-21 20:42 ` Drew Adams
2007-06-21 22:27 ` Davis Herring
2007-06-22 0:20 ` Drew Adams
2007-06-24 14:40 ` Richard Stallman
2007-06-15 8:48 ` Richard Stallman
2007-06-15 13:23 ` Drew Adams
2007-06-15 22:45 ` Richard Stallman
2007-06-13 16:21 ` Richard Stallman
2007-06-13 16:22 ` Richard Stallman
2007-06-13 19:00 ` Drew Adams
2007-06-14 16:19 ` Richard Stallman
2007-06-15 1:01 ` Drew Adams
2007-06-15 19:22 ` Richard Stallman
2007-06-15 21:04 ` Drew Adams
2007-06-16 18:50 ` Richard Stallman
2007-06-17 18:46 ` Juri Linkov
2007-06-17 19:35 ` Drew Adams
2007-06-18 21:31 ` Richard Stallman
2007-06-11 9:44 ` Richard Stallman
2007-06-11 17:29 ` Drew Adams
2007-06-11 18:10 ` Stefan Monnier
2007-06-13 8:07 ` Richard Stallman
2007-06-13 15:23 ` Drew Adams
2007-06-14 7:49 ` Richard Stallman
2007-06-15 0:41 ` Drew Adams
2007-06-15 19:22 ` Richard Stallman
2007-06-15 21:04 ` Drew Adams
2007-06-16 18:51 ` Richard Stallman
2007-06-16 22:30 ` Drew Adams
2007-06-13 8:07 ` Richard Stallman
2007-06-11 3:49 ` Miles Bader
2007-06-11 7:24 ` Drew Adams
2007-06-11 16:25 ` Richard Stallman
2007-06-11 9:44 ` Richard Stallman
2007-06-11 18:41 ` Drew Adams
2007-06-12 0:43 ` Miles Bader
2007-06-12 8:08 ` Kim F. Storm
2007-06-12 9:18 ` joakim
2007-06-12 11:04 ` Kim F. Storm
2007-06-12 11:16 ` joakim
2007-06-12 13:30 ` Drew Adams
2007-06-12 14:06 ` keys that work on terminals (was: Re: propose adding Icicles to Emacs) Dan Nicolaescu
2007-06-12 14:45 ` keys that work on terminals joakim
2007-06-12 13:22 ` propose adding Icicles to Emacs Drew Adams
2007-06-06 15:43 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Stefan Monnier
2007-06-04 5:01 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Richard Stallman
2007-06-04 23:51 ` Juri Linkov
2007-06-05 3:55 ` Miles Bader
2007-06-05 16:29 ` Juri Linkov
2007-06-05 17:12 ` [drew.adams@oracle.com: RE: cannot find :enable in Elispmanualindex] Drew Adams
2007-06-05 19:17 ` [drew.adams@oracle.com: RE: cannot find :enable in Elisp manualindex] Richard Stallman
2007-06-05 22:32 ` Richard Stallman
2007-06-06 0:32 ` Karl Berry
2007-06-06 22:10 ` Richard Stallman
2007-06-06 22:21 ` Karl Berry
2007-06-02 22:34 ` Juri Linkov
2007-06-02 22:42 ` Juri Linkov
2007-06-03 3:07 ` Eli Zaretskii
2007-06-03 9:34 ` Juri Linkov
2007-06-03 21:23 ` Karl Berry
2007-06-03 21:27 ` Richard Stallman
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=EIENLHALHGIMHGDOLMIMEEJPDCAA.drew.adams@oracle.com \
--to=drew.adams@oracle.com \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=rms@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 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.