---------- Forwarded message ---------- From: Drew Adams Date: 25 July 2017 at 00:57 Subject: RE: Disabling imenu default of thing-at-point To: Felipe Ochoa > > `completing-read' has multiple uses. It is not just for picking one of a set of completion candidates. When `t' is specified as the REQUIRED arg it means that either (a) one of those candidates must be picked or (2) the default value can be picked. The list of candidates might be predefined, and the default value might be computed dynamically (e.g. thing at point), for example. > The documentation doesn't say this, but since it has worked this way for 15+ years, I believe you :-) The doc (`C-h f') says: REQUIRE-MATCH can take the following values: - t means that the user is not allowed to exit unless the input is (or completes to) an element of COLLECTION or is null. If the input is null, ‘completing-read’ returns DEF, or the first element of the list of default values, or an empty string if DEF is nil, regardless of the value of REQUIRE-MATCH. > > Why is it bogus? If a different behavior were desired, where a user could not pick the default value but had to pick one of the completion candidates, then the `completing-read' call would be different. > I think this is exactly what I'm suggesting (That we use a different `completing-read' call). > I think this type of default is bogus, because of what imenu is supposed to do. From *info*: "The Imenu facility offers a way to find the major definitions in a file by name... If you type ‘M-x imenu’, it reads the name of a definition using the minibuffer, then moves point to that definition." Offering as default a non-existent definition is bogus in my mind, since where should point move to in that case? OK, that makes sense. You can do that easier, with clearer code - just test whether the default returned by thing-at-point is one of the completion candidates. > > Perhaps Ido Ubiquitous does not provide for or handle such a use case (?). But it is a common and useful use case of `completing-read'. > To the contrary, ido works just like `completing-read'. I can see how it might be useful in general for completing-read, but I just don't think it's useful for its use imenu. (And hence why I think imenu should be fixed) I'm OK with that. I think that a previous thread with the Ido Ubiquitous developer expressed the desire to remove that use case from `completing-read' because I.U. does *not* support it (jumps through some hoops to work around it). But perhaps I misunderstood. > > But is that what was intended for the Imenu code? Does it make no sense (in this case) for a user to pick the default value if it is not one of the completion candidates? > Stefan would have to comment on the code's intent (from 2001). As mentioned above, I don't think this makes sense. But others may have uses for imenu that I don't know of where this behavior is useful. I guess that's the question: is there any use here for a value that is not one of the completion candidates. If not, what you suggest sounds good. - Drew On 25 July 2017 at 11:05, Felipe Ochoa wrote: > (Apologies, forgot to CC the list) > > > > Sounds like Ido (or Ido Ubiquitous) needs to be fixed. There > > should not be a problem with providing a default value, even > > when that default value might not always be helpful. > > I think this could also be an option, but note that ido follows > completing-read-default in its handling of invalid defaults. E.g., > evaluate the following and hit RET without selecting anything: > > (completing-read-default > "Complete: " '("abc" "def" "ghi") > nil t nil nil "jkl") > > The result will be "jkl". > > One thing that cannot be fixed within ido (or completing-read) > is the prompt. Currently all users see "Index item (default %s): ", > even when the default is bogus, instead of "Index item: ". > > > It breaks everyone's ability to pick up what was previously the > > default value as a default value. > > > > > - (setq name (or (imenu-find-default name prepared-index-alist) > name))) > > > + (setq name (imenu-find-default name prepared-index-alist))) > > > (cond (prompt) > > > ((and name (imenu--in-alist name prepared-index-alist)) > > > (setq prompt (format "Index item (default %s): " name))) > > > > If you make that change then what is the sense of binding `name' to > > `(thing-at-point 'symbol)' in the first place? It's only purpose > > could then be to return a string so that `imenu-find-default' is > > used at all. This doesn't make any sense (to me). > > The code does not do away with defaults. To me, the new approach > would mean in words: > > 1. Grab the symbol at point. > 2. Check if it matches one of the items in the index. > 3. If so, offer it as a default. Otherwise, ignore it. > > >