unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
@ 2012-03-16 11:05 Vitalie Spinu
  2012-03-16 12:18 ` Vitalie Spinu
  2012-03-16 17:20 ` Stefan Monnier
  0 siblings, 2 replies; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-16 11:05 UTC (permalink / raw)
  To: emacs-devel


Hi, 

The completion in emacs 24 is called twice. For example

(defun foo-completion ()
  (when (save-excursion (re-search-backward "\\<\\w*" (point-at-bol) t))
    (let ((token (match-string-no-properties 0))
	  (beg (match-beginning 0))
	  (end (match-end 0)))
      (message "%s:" token)
      (when (= end (point))
	(list beg end (list "aaaa" "aaaaaaa" "bbbb" "truncat") :exclusive 'no)))))

(add-to-list 'completion-at-point-functions 'foo-completion) 
;; it is now (foo-completion lisp-completion-at-point t)

Place your point at the end of 'aaaa and you try to complete. I am
getting 

aaa:
aaaa:

in my message buffer. Which means the completion is called twice. I hope
this is not an intended behavior, as it might seriously interfere with
custom completion. For example I might want to have a different behavior
on the second consequent invocation of the completion (give a message,
modify the candidates etc).

Second problem is that if the completion is sole, the handling is not
passed over. For example after 'truncat I am getting a message "Sole
completion" and the lisp-completion-at-point is not reached at all. I
believe it's not how it should work.

In all the rest, new completion system is virtually perfect, thanks.

Vitalie.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-16 11:05 Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion Vitalie Spinu
@ 2012-03-16 12:18 ` Vitalie Spinu
  2012-03-16 17:20 ` Stefan Monnier
  1 sibling, 0 replies; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-16 12:18 UTC (permalink / raw)
  To: emacs-devel

>>>> Vitalie Spinu <spinuvit@gmail.com>
>>>> on Fri, 16 Mar 2012 12:05:14 +0100 wrote:

  > Hi,

  > The completion in emacs 24 is called twice. For example

  > (defun foo-completion ()
  >   (when (save-excursion (re-search-backward "\\<\\w*" (point-at-bol) t))
  >     (let ((token (match-string-no-properties 0))
  > 	  (beg (match-beginning 0))
  > 	  (end (match-end 0)))
  >       (message "%s:" token)
  >       (when (= end (point))
  > 	(list beg end (list "aaaa" "aaaaaaa" "bbbb" "truncat") :exclusive 'no)))))

  > (add-to-list 'completion-at-point-functions 'foo-completion)
  > ;; it is now (foo-completion lisp-completion-at-point t)

  > Place your point at the end of 'aaaa and you try to complete. I am
  > getting

  > aaa:
  > aaaa:

  > in my message buffer. Which means the completion is called twice. I hope
  > this is not an intended behavior, as it might seriously interfere with
  > custom completion. For example I might want to have a different behavior
  > on the second consequent invocation of the completion (give a message,
  > modify the candidates etc).

A related issue. Position after 'aaaa, try to complete. You will get a
"Sole completion" message. Press "space" or "M-b", or whatever, you will
get a message "aaaa:" which means that completion is repeated after any
other command. This is really bad, as my completion is calling an
external process and stalls emacs for a second, badly interfering with
the editing.

  > Second problem is that if the completion is sole, the handling is not
  > passed over. For example after 'truncat I am getting a message "Sole
  > completion" and the lisp-completion-at-point is not reached at all. I
  > believe it's not how it should work.

  > In all the rest, new completion system is virtually perfect, thanks.

  > Vitalie.





^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-16 11:05 Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion Vitalie Spinu
  2012-03-16 12:18 ` Vitalie Spinu
@ 2012-03-16 17:20 ` Stefan Monnier
  2012-03-16 19:33   ` Vitalie Spinu
  1 sibling, 1 reply; 14+ messages in thread
From: Stefan Monnier @ 2012-03-16 17:20 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

> The completion in Emacs 24 is called twice.  For example

> (defun foo-completion ()
>   (when (save-excursion (re-search-backward "\\<\\w*" (point-at-bol) t))
>     (let ((token (match-string-no-properties 0))
> 	  (beg (match-beginning 0))
> 	  (end (match-end 0)))
>       (message "%s:" token)
>       (when (= end (point))
> 	(list beg end (list "aaaa" "aaaaaaa" "bbbb" "truncat") :exclusive 'no)))))

> (add-to-list 'completion-at-point-functions 'foo-completion) 
> ;; it is now (foo-completion lisp-completion-at-point t)

> Place your point at the end of 'aaaa and you try to complete. I am
> getting 

> aaa:
> aaaa:

> in my message buffer.  Which means the completion is called twice.

Not sure why, but not terribly problematic either.

> I hope this is not an intended behavior, as it might seriously
> interfere with custom completion.  For example I might want to have
> a different behavior on the second consequent invocation of the
> completion (give a message, modify the candidates etc).

No, completion-at-point-functions should return completion data and
can't know what that data will be used for.  Could be for TAB
completion, for on-the-fly popup completion à la auto-complete, for
display of the *Completions* buffer, or to decide whether we're still in
the same completion field (so as to pop-down the *Completions* buffer
when we leave that field), ...

> Second problem is that if the completion is sole, the handling is not
> passed over.

That's expected: completion is only passed over if the text doesn't
match any candidate.


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-16 17:20 ` Stefan Monnier
@ 2012-03-16 19:33   ` Vitalie Spinu
  2012-03-17 22:34     ` Stefan Monnier
  0 siblings, 1 reply; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-16 19:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

>>>> Stefan Monnier <monnier@iro.umontreal.ca>
>>>> on Fri, 16 Mar 2012 13:20:19 -0400 wrote:

  >> Place your point at the end of 'aaaa and you try to complete. I am
  >> getting 

  >> aaa:
  >> aaaa:

  >> in my message buffer.  Which means the completion is called twice.

  > Not sure why, but not terribly problematic either.

Right, unless the completion retrieval is computationally
intensive. Please see my other message with a more serious related
issue. It might give some clues.

  >> I hope this is not an intended behavior, as it might seriously
  >> interfere with custom completion.  For example I might want to have
  >> a different behavior on the second consequent invocation of the
  >> completion (give a message, modify the candidates etc).

  > No, completion-at-point-functions should return completion data and
  > can't know what that data will be used for.  Could be for TAB
  > completion, for on-the-fly popup completion à la auto-complete, for
  > display of the *Completions* buffer, or to decide whether we're still in
  > the same completion field (so as to pop-down the *Completions* buffer
  > when we leave that field), ...

In my case it's meaningful, as I retrieve completions from a
process. And if there is no process associated with a buffer, I want to
message: "Dude stop pressing TAB, there is no proc!!""

Also I think, popup functions should use a different list (like
completion-popup-functions). As users might want to use different sets
of completions. Also popup completions *must* be considerably less
computationally intensive, so it's probably a different set of functions
anyhow.

  >> Second problem is that if the completion is sole, the handling is not
  >> passed over.

  > That's expected: completion is only passed over if the text doesn't
  > match any candidate.

IMHO, this is far form an ideal default. Take an example of two
completions, one for symbols, another for functions. Or, even the etags
completion which is always the last, and might give many more candidates
with the same prefix.

Best, 
Vitalie.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-16 19:33   ` Vitalie Spinu
@ 2012-03-17 22:34     ` Stefan Monnier
  2012-03-17 22:43       ` Lennart Borgman
  2012-03-17 23:33       ` Vitalie Spinu
  0 siblings, 2 replies; 14+ messages in thread
From: Stefan Monnier @ 2012-03-17 22:34 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

>> Not sure why, but not terribly problematic either.
> Right, unless the completion retrieval is computationally intensive.

That could be a problem, but I haven't seen a circumstance where this is
the case yet.  This computation is only meant to decide which completion
table to use at a given buffer position.  The exact set of candidates
can be computed later.

> Please see my other message with a more serious related issue.
> It might give some clues.

I do not see your other message.  Is it on emacs-devel or a bug-report?

> In my case it's meaningful, as I retrieve completions from a
> process.

Then you should probably get your completions from the completion-table,
rather than from completion-at-point-functions.
IOW your completion-at-point-functions should return (without contacting
any process, other than maybe checking whether a process exists)
a completion table that's a function, e.g. built with
completion-table-dynamic, or using complete-with-action and it's *that*
function which contacts the process.

> Also I think, popup functions should use a different list (like
> completion-popup-functions).

That might be right (tho I hope it's not), but it doesn't eliminate the
fact that completion-at-point-functions might be called in
various circumstances.

> As users might want to use different sets of completions.

I expect completion-at-point-functions to be setup by major modes rather
than by users.

> Also popup completions *must* be considerably less computationally
> intensive, so it's probably a different set of functions anyhow.

The way I see it, completion-at-point-functions would instead include in
the `props' it returns, enough info to determine whether to use that
completion data for popup completion.

>>> Second problem is that if the completion is sole, the handling is not
>>> passed over.
>> That's expected: completion is only passed over if the text doesn't
>> match any candidate.
> IMHO, this is far form an ideal default.  Take an example of two
> completions, one for symbols, another for functions.  Or, even the
> etags completion which is always the last, and might give many more
> candidates with the same prefix.

You might be right.  The current behavior of "fall over" for
non-exclusive completion data is not cast in stone and is known to
have limitations.


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-17 22:34     ` Stefan Monnier
@ 2012-03-17 22:43       ` Lennart Borgman
  2012-03-17 23:33       ` Vitalie Spinu
  1 sibling, 0 replies; 14+ messages in thread
From: Lennart Borgman @ 2012-03-17 22:43 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Vitalie Spinu, emacs-devel

On Sat, Mar 17, 2012 at 23:34, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>>> Not sure why, but not terribly problematic either.
>> Right, unless the completion retrieval is computationally intensive.
>
> That could be a problem, but I haven't seen a circumstance where this is
> the case yet.  This computation is only meant to decide which completion
> table to use at a given buffer position.  The exact set of candidates
> can be computed later.

If a parser is involved to make the candidate it can of course take long time.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-17 22:34     ` Stefan Monnier
  2012-03-17 22:43       ` Lennart Borgman
@ 2012-03-17 23:33       ` Vitalie Spinu
  2012-03-18  2:03         ` Stefan Monnier
  1 sibling, 1 reply; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-17 23:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

>>>> Stefan Monnier <monnier@iro.umontreal.ca>
>>>> on Sat, 17 Mar 2012 18:34:31 -0400 wrote:

  >> Please see my other message with a more serious related issue.
  >> It might give some clues.

  > I do not see your other message.  Is it on emacs-devel or a bug-report?

Yes to emacs-devel,
http://lists.gnu.org/archive/html/emacs-devel/2012-03/msg00249.html

  >> In my case it's meaningful, as I retrieve completions from a
  >> process.

  > Then you should probably get your completions from the completion-table,
  > rather than from completion-at-point-functions.
  > IOW your completion-at-point-functions should return (without contacting
  > any process, other than maybe checking whether a process exists)
  > a completion table that's a function, e.g. built with
  > completion-table-dynamic, or using complete-with-action and it's *that*
  > function which contacts the process.

Thanks for the pointer. I was not aware of this distinction. But why
would that make a difference? Isn't the end result the same? Info is
silent on this.

  >> Also I think, popup functions should use a different list (like
  >> completion-popup-functions).

  > That might be right (tho I hope it's not), but it doesn't eliminate the
  > fact that completion-at-point-functions might be called in
  > various circumstances.

I've written auto-complete support and emacs-24 completion at point for
R. And it turned out that these two are really distinct features. One is
fast, cache based and sloppy, as it should not interfere with the
editing. Another one is exact and might be very slow, because it
contacts the associated process. The TAB completions can afford to be
slow, as there is no editing.

  >> As users might want to use different sets of completions.

  > I expect completion-at-point-functions to be setup by major modes rather
  > than by users.

Take auto-complete as an example. There are plenty of different
ac-sources, and users use whatever completion they want.

Related topic.  It would be great to have a separate "namespace" for all
buildin completions, or even a dedicated package. Then users and
developers can easily find buildin stuff.

For instance `completion-filename' instead of `comint-filename-completion',
 `completion-etags' instead of `tags-completion-at-point-function'
etc. Auto-complete package is a good example here - all sources start
with "ac-source-".

  >> Also popup completions *must* be considerably less computationally
  >> intensive, so it's probably a different set of functions anyhow.

  > The way I see it, completion-at-point-functions would instead include in
  > the `props' it returns, enough info to determine whether to use that
  > completion data for popup completion.

To return the props it still must be called, right? Indeed if the
completion function were aware that it was called from popup, then it
can simply return nil to be skipped. But, AFAICT, this is not currently
the case.

Vitalie.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-17 23:33       ` Vitalie Spinu
@ 2012-03-18  2:03         ` Stefan Monnier
  2012-03-18  9:35           ` Vitalie Spinu
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Monnier @ 2012-03-18  2:03 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

>> I do not see your other message.  Is it on emacs-devel or a bug-report?
> Yes to emacs-devel,
> http://lists.gnu.org/archive/html/emacs-devel/2012-03/msg00249.html

Ah, not sure why I didn't see it, OK here it is:

> A related issue. Position after 'aaaa, try to complete. You will get a
> "Sole completion" message.  Press "space" or "M-b", or whatever, you will
> get a message "aaaa:" which means that completion is repeated after any
> other command.  This is really bad, as my completion is calling an
> external process and stalls emacs for a second, badly interfering with
> the editing.

Again, you're confused: the completion-at-point-functions do not perform
completion, they just return the data about what completion table to use
at point.

>> Then you should probably get your completions from the completion-table,
>> rather than from completion-at-point-functions.
>> IOW your completion-at-point-functions should return (without contacting
>> any process, other than maybe checking whether a process exists)
>> a completion table that's a function, e.g. built with
>> completion-table-dynamic, or using complete-with-action and it's *that*
>> function which contacts the process.
> Thanks for the pointer.  I was not aware of this distinction.  But why
> would that make a difference?

Because the completion table may or may not be used after being returned
by completion-at-point-function.  And it may be called with a different
string than the one in the buffer.

>>> Also I think, popup functions should use a different list (like
>>> completion-popup-functions).
>> That might be right (tho I hope it's not), but it doesn't eliminate the
>> fact that completion-at-point-functions might be called in
>> various circumstances.
> I've written auto-complete support and emacs-24 completion at point
> for R.  And it turned out that these two are really distinct features.
> One is fast, cache based and sloppy, as it should not interfere with
> the editing.  Another one is exact and might be very slow, because it
> contacts the associated process.  The TAB completions can afford to be
> slow, as there is no editing.

Interesting.

So the completion candidates displayed in R-mode for auto-complete are
different than the ones used for TAB?

> Take auto-complete as an example.  There are plenty of different
> ac-sources, and users use whatever completion they want.

From what I can tell, this is largely because the major modes don't
provide this info themselves yet.

> Related topic.  It would be great to have a separate "namespace" for all
> buildin completions, or even a dedicated package. Then users and
> developers can easily find buildin stuff.
> For instance `completion-filename' instead of `comint-filename-completion',
> `completion-etags' instead of `tags-completion-at-point-function'
> etc.  Auto-complete package is a good example here - all sources start
> with "ac-source-".

Hmm... more consistency in the naming might be good here, indeed.
It's important to keep the "<package>-" prefix since I don't want to
consider all of this as part of Emacs's "core", but maybe we could
settle on "<something>-completion-at-point-function" or maybe something
shorter than that.

>>> Also popup completions *must* be considerably less computationally
>>> intensive, so it's probably a different set of functions anyhow.
>> The way I see it, completion-at-point-functions would instead include in
>> the `props' it returns, enough info to determine whether to use that
>> completion data for popup completion.
> To return the props it still must be called, right? Indeed if the
> completion function were aware that it was called from popup, then it
> can simply return nil to be skipped. But, AFAICT, this is not currently
> the case.

As mentioned, completion-point-functions should not work hard: it should
just return the boundaries of what it would consider as "the text to
complete if we were to complete it", and what code to use to get the
completion candidates (again, in case we do decide to perform
completion).

For auto-complete, we might need to look at the completion candidates
very often, in order to decide whether or not to popup a set
of completions.  But I'd hope that the `props' can provide the needed
data (e.g. a predicate function to decide whether or not it's worth the
trouble getting the list of candidates).

Linking completion-at-point-functions and auto-complete is not done yet,
clearly (and will probably also add more completion-metadata).


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-18  2:03         ` Stefan Monnier
@ 2012-03-18  9:35           ` Vitalie Spinu
  2012-03-18 15:42             ` Stefan Monnier
  0 siblings, 1 reply; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-18  9:35 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

>>>> Stefan Monnier <monnier@iro.umontreal.ca>
>>>> on Sat, 17 Mar 2012 22:03:44 -0400 wrote:

  >> A related issue. Position after 'aaaa, try to complete. You will get a
  >> "Sole completion" message.  Press "space" or "M-b", or whatever, you will
  >> get a message "aaaa:" which means that completion is repeated after any
  >> other command.  This is really bad, as my completion is calling an
  >> external process and stalls emacs for a second, badly interfering with
  >> the editing.

  > Again, you're confused: the completion-at-point-functions do not perform
  > completion, they just return the data about what completion table to use
  > at point.

Ok, I see it more clearly now, with your auto-complete point latter,
thanks. Will rewrite and see if it gets better.

(...)

  >> I've written auto-complete support and emacs-24 completion at point
  >> for R.  And it turned out that these two are really distinct features.
  >> One is fast, cache based and sloppy, as it should not interfere with
  >> the editing.  Another one is exact and might be very slow, because it
  >> contacts the associated process.  The TAB completions can afford to be
  >> slow, as there is no editing.

  > Interesting.

  > So the completion candidates displayed in R-mode for auto-complete are
  > different than the ones used for TAB?

Yes, and no. What I meant is that the underlying mechanisms are very
different.  99.99% of the time the completion candidates are the same,
but there are objects which are not meaningful to cache, like arguments
of the user functions, or components of the recursive structures (lists,
environments, data.frames etc.). In this cases AC also calls the
process, and it's usually fast. But in some extreme corner cases, like
if user changed a function in an attached package, AC will still use the
cached version.'

  > Hmm... more consistency in the naming might be good here, indeed.
  > It's important to keep the "<package>-" prefix since I don't want to
  > consider all of this as part of Emacs's "core", but maybe we could
  > settle on "<something>-completion-at-point-function" or maybe something
  > shorter than that.

I am a fan of the -completion postfix convention. It's easy to match in
apropos, anything or IDO regexp: comint-filename-completion,
tags-completion, imenu-completion, imenu-in-same-mode-completion,
words-in-same-buffer-commpletion etc. It can get pretty long by itself,
so a short postfix is better.

Best, 
Vitalie.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-18  9:35           ` Vitalie Spinu
@ 2012-03-18 15:42             ` Stefan Monnier
  2012-03-18 19:18               ` Vitalie Spinu
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Monnier @ 2012-03-18 15:42 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

> Yes, and no. What I meant is that the underlying mechanisms are very
> different.  99.99% of the time the completion candidates are the same,
> but there are objects which are not meaningful to cache, like arguments
> of the user functions, or components of the recursive structures (lists,
> environments, data.frames etc.).  In this cases AC also calls the
> process, and it's usually fast.  But in some extreme corner cases, like
> if user changed a function in an attached package, AC will still use the
> cached version.'

So, IIUC it would be perfectly OK for TAB completion to use the AC code.

>> Hmm... more consistency in the naming might be good here, indeed.
>> It's important to keep the "<package>-" prefix since I don't want to
>> consider all of this as part of Emacs's "core", but maybe we could
>> settle on "<something>-completion-at-point-function" or maybe something
>> shorter than that.
> I am a fan of the -completion postfix convention.  It's easy to match in
> apropos, anything or IDO regexp: comint-filename-completion,
> tags-completion, imenu-completion, imenu-in-same-mode-completion,
> words-in-same-buffer-commpletion etc.  It can get pretty long by itself,
> so a short postfix is better.

But I suspect it will generate false positives because it's not
specific enough.  Maybe "-completion-data"?


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-18 15:42             ` Stefan Monnier
@ 2012-03-18 19:18               ` Vitalie Spinu
  2012-03-19  0:53                 ` Stefan Monnier
  0 siblings, 1 reply; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-18 19:18 UTC (permalink / raw)
  To: emacs-devel

>>>> Stefan Monnier <monnier@iro.umontreal.ca>
>>>> on Sun, 18 Mar 2012 11:42:27 -0400 wrote:

  >> Yes, and no. What I meant is that the underlying mechanisms are very
  >> different.  99.99% of the time the completion candidates are the same,
  >> but there are objects which are not meaningful to cache, like arguments
  >> of the user functions, or components of the recursive structures (lists,
  >> environments, data.frames etc.).  In this cases AC also calls the
  >> process, and it's usually fast.  But in some extreme corner cases, like
  >> if user changed a function in an attached package, AC will still use the
  >> cached version.'

  > So, IIUC it would be perfectly OK for TAB completion to use the AC code.

Indeed, you could be right that always one-for-all completion function
might be made enough for the prefix completion. But I don't see how popup
menu can properly deal with partial completions for example, or
expansions a la yas. So you would still need a separate list for those.

And the old argument still stands - would the user like to have the same
redundant list of completion functions for C-M-i and popup menu?  

  >>> Hmm... more consistency in the naming might be good here, indeed.
  >>> It's important to keep the "<package>-" prefix since I don't want to
  >>> consider all of this as part of Emacs's "core", but maybe we could
  >>> settle on "<something>-completion-at-point-function" or maybe something
  >>> shorter than that.
  >> I am a fan of the -completion postfix convention.  It's easy to match in
  >> apropos, anything or IDO regexp: comint-filename-completion,
  >> tags-completion, imenu-completion, imenu-in-same-mode-completion,
  >> words-in-same-buffer-commpletion etc.  It can get pretty long by itself,
  >> so a short postfix is better.

  > But I suspect it will generate false positives because it's not
  > specific enough.  Maybe "-completion-data"?

Maybe -c-a-p,  or -c-a-p-data? 

Vitalie.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-18 19:18               ` Vitalie Spinu
@ 2012-03-19  0:53                 ` Stefan Monnier
  2012-03-19  8:35                   ` Vitalie Spinu
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Monnier @ 2012-03-19  0:53 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

>>> Yes, and no. What I meant is that the underlying mechanisms are very
>>> different.  99.99% of the time the completion candidates are the same,
>>> but there are objects which are not meaningful to cache, like arguments
>>> of the user functions, or components of the recursive structures (lists,
>>> environments, data.frames etc.).  In this cases AC also calls the
>>> process, and it's usually fast.  But in some extreme corner cases, like
>>> if user changed a function in an attached package, AC will still use the
>>> cached version.'
>> So, IIUC it would be perfectly OK for TAB completion to use the AC code.
> Indeed, you could be right that always one-for-all completion function
> might be made enough for the prefix completion. But I don't see how popup
> menu can properly deal with partial completions for example,

I'd expect popup menus wouldn't use the partial-completion style, but
that's not a problem: the completion-styles only care about what to do
once we have the completion data, whereas completion-at-point-function
does not care about it at all since it only cares about providing that
completion data.
Every kind of completion UI can use its own (set of) completion
style(s).  If AC can be made to use a partial-completion style, great,
but if not that's just as well.

> or expansions a la yas.

I guess you're referring to some part of yasnippet, but I don't know
which part, nor why it is related to completion-at-point-functions.

> So you would still need a separate list for those.

As explained, partial-completion is another problem.  As for abbrev-like
"completion+expansion", I don't see why it can't work with AC (and if
it can't work, the completion-at-point-function can return some data
in its `props' making it clear it can't be used for AC).

> And the old argument still stands - would the user like to have the same
> redundant list of completion functions for C-M-i and popup menu?

I don't see why not.  Tho, for completions like etags-completion or
dabbrev-completion, i.e. forms of completions which don't actually know
whether the candidates they return are actually relevant at point, maybe
we'd like to make exceptions (like we already do for dabbrev-completions
which are bound to a special key rather than to TAB).

>>>> Hmm... more consistency in the naming might be good here, indeed.
>>>> It's important to keep the "<package>-" prefix since I don't want to
>>>> consider all of this as part of Emacs's "core", but maybe we could
>>>> settle on "<something>-completion-at-point-function" or maybe something
>>>> shorter than that.
>>> I am a fan of the -completion postfix convention.  It's easy to match in
>>> apropos, anything or IDO regexp: comint-filename-completion,
>>> tags-completion, imenu-completion, imenu-in-same-mode-completion,
>>> words-in-same-buffer-commpletion etc.  It can get pretty long by itself,
>>> so a short postfix is better.
>> But I suspect it will generate false positives because it's not
>> specific enough.  Maybe "-completion-data"?
> Maybe -c-a-p,  or -c-a-p-data?

I used "-capf" within the code of completion-at-point, but I think it's
too cryptic for use outside of that context.


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-19  0:53                 ` Stefan Monnier
@ 2012-03-19  8:35                   ` Vitalie Spinu
  2012-03-19 12:49                     ` Stefan Monnier
  0 siblings, 1 reply; 14+ messages in thread
From: Vitalie Spinu @ 2012-03-19  8:35 UTC (permalink / raw)
  To: emacs-devel

>>>> Stefan Monnier <monnier@IRO.UMontreal.CA>
>>>> on Sun, 18 Mar 2012 20:53:11 -0400 wrote:

  >> or expansions a la yas.

  > I guess you're referring to some part of yasnippet, but I don't know
  > which part, nor why it is related to completion-at-point-functions.

Yes, I mean the expansion of abbreviations at point, like yasnippet
does. But, it looks like you don't consider it as a completion in the
first place.

  >> So you would still need a separate list for those.

  > As explained, partial-completion is another problem.  As for abbrev-like
  > "completion+expansion", I don't see why it can't work with AC (and if
  > it can't work, the completion-at-point-function can return some data
  > in its `props' making it clear it can't be used for AC).

Hmm, ... right, still cannot get used to the concept.

  >> And the old argument still stands - would the user like to have the same
  >> redundant list of completion functions for C-M-i and popup menu?

  > I don't see why not.  Tho, for completions like etags-completion or
  > dabbrev-completion, i.e. forms of completions which don't actually know
  > whether the candidates they return are actually relevant at point, maybe
  > we'd like to make exceptions (like we already do for dabbrev-completions
  > which are bound to a special key rather than to TAB).

Good point, given the current mechanism, it's trivial to write a custom
completion, with custom list of capfs and bind it to a key. 

  > I used "-capf" within the code of completion-at-point, but I think it's
  > too cryptic for use outside of that context.

Sounds great to me! It's easy to spell, search for and remember, and is
more specific than -data. At the end it's just a convention to be used
to, and from each function's documentation it will be clear what it
means.

Thanks, 
Vitalie.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion.
  2012-03-19  8:35                   ` Vitalie Spinu
@ 2012-03-19 12:49                     ` Stefan Monnier
  0 siblings, 0 replies; 14+ messages in thread
From: Stefan Monnier @ 2012-03-19 12:49 UTC (permalink / raw)
  To: Vitalie Spinu; +Cc: emacs-devel

>>> or expansions a la yas.
>> I guess you're referring to some part of yasnippet, but I don't know
>> which part, nor why it is related to completion-at-point-functions.
> Yes, I mean the expansion of abbreviations at point, like yasnippet
> does.  But, it looks like you don't consider it as a completion in the
> first place.

I don't know yasnippet's abbreviation's expansion behavior, but assuming
it works basically along the same lines as abbrev, then the completion
part is only the part that finds an abbrev based on the text already
typed (and there may be several such abbrevs, so you get the usual
behavior of completions), whereas the expansion is a post-processing
step which only happens if the completion found a single candidate (and
this is performed with the :exit-function that can be set in
completion-data's `props').
See bibtex.el for an example use of this functionality.

>> I used "-capf" within the code of completion-at-point, but I think it's
>> too cryptic for use outside of that context.
> Sounds great to me! It's easy to spell, search for and remember, and is
> more specific than -data. At the end it's just a convention to be used
> to, and from each function's documentation it will be clear what it
> means.

Then maybe we should go with "-completion-capf" (more specific
than -data, but still makes it clear it's related to completion, even
for people not familiar with -capf).


        Stefan



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2012-03-19 12:49 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-16 11:05 Completion with (:exclusive 'no) is called twice, and doesn't pass over on sole completion Vitalie Spinu
2012-03-16 12:18 ` Vitalie Spinu
2012-03-16 17:20 ` Stefan Monnier
2012-03-16 19:33   ` Vitalie Spinu
2012-03-17 22:34     ` Stefan Monnier
2012-03-17 22:43       ` Lennart Borgman
2012-03-17 23:33       ` Vitalie Spinu
2012-03-18  2:03         ` Stefan Monnier
2012-03-18  9:35           ` Vitalie Spinu
2012-03-18 15:42             ` Stefan Monnier
2012-03-18 19:18               ` Vitalie Spinu
2012-03-19  0:53                 ` Stefan Monnier
2012-03-19  8:35                   ` Vitalie Spinu
2012-03-19 12:49                     ` Stefan Monnier

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).