Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fuzzy match on semantic completion from omnifunc #961

Closed
zerongjiang opened this issue May 10, 2014 · 2 comments · Fixed by #2657
Closed

fuzzy match on semantic completion from omnifunc #961

zerongjiang opened this issue May 10, 2014 · 2 comments · Fixed by #2657

Comments

@zerongjiang
Copy link

I'm wondering why fuzzy match doesn't work when I trigger semantic completion using omnifunc as the source.

For example, in PHP, I trigger omnifunc from YCM using <C-Space>

array<C-Space>

It gives me a list of possible completion. But when I continue typing and try to match some function in a fuzzy way. The completion disappears.

ycm

I used to use neocomplcache which works fine. So I screencast the same workflow as a comparison.
neocomplcache

I really enjoy how fast and convenient the fuzzy match is in YCM. And since YCM is using omnifunc as a source for general semantic completion, I think it would be sweet to enable fuzzy match on that.

Is there any option I miss in the configuration or it's a feature in To-do list ?

Thank you!

@xinleibird
Copy link

Similar issue with eclim for java from d56ec1e, the semantic triggers did not work.

@vheon
Copy link
Contributor

vheon commented May 11, 2014

I was investigating this myself a while back for an omnifunc for vimscript. The thing is that <C-Space> is actually mapped to <C-X><C-O><C-P> so it actually call the omnifunc as it is without do any magic at all and it can't do it since the autocmd CursorMovedI is not triggered while the popup is visible so YCM can not do the fuzzy selecting. Anyway YCM works fine with omnifunc using the semantic triggers, so in PHP for example after the -> you should get the fuzzy matching of completions. All of this does not count for languages that have native semantic engine, like the C-family, python or C# since they use YCM omnifunc that gets called at every keystroke when the popup menu is visible so the fuzzy matching is possible in that occasion. I don't know if this behavior is known to @Valloric and maybe should be good to add it to the docs. So better ping him :)

zzbot added a commit that referenced this issue Jun 25, 2017
[READY] Rewrite completion system

There is a number of issues with the current completion system:
 - UI is blocked until the completions are returned by the server, the request timed out, or a key is pressed by the user. This leads to a rough experience when completions take too much time: cursor disappearing and timeout errors (see #2192 and #2574). Users even [increase the timeout by manually editing the `completion_request.py` file](https://github.com/Valloric/YouCompleteMe/blob/master/python/ycm/client/completion_request.py#L30) to avoid these errors, which exacerbate the issue and, in some cases, make the plugin unusable (see #2574).
 - no fuzzy matching from omnifunc when forcing semantic completion. See #961;
 - no fuzzy matching when deleting characters. Vim filtering is used instead:

![completion-bug-deleting-characters](https://cloud.githubusercontent.com/assets/10026824/26276156/f298c6de-3d71-11e7-92da-d22186239c27.gif)
Neovim and MacVim are not affected.
 - completion menu disappears after deleting a character and inserting one:

![completion-bug-reinserting-character](https://cloud.githubusercontent.com/assets/10026824/26276192/b3ed0f7a-3d72-11e7-8c64-523a0a59cbdc.gif)
Neovim and MacVim are not affected.
 - ignore the start column returned by the server. See PR #2489.
 - subject to flickers. This one depends a lot on the version of Vim. Completion is almost flicker-free in Neovim and MacVim. Not too bad in console Vim (except in fast terminal like [alacritty](https://github.com/jwilm/alacritty)). Awful in gVim GTK2 (a bit better on GTK3) and gVim on Windows.

This PR is an attempt at fixing all of these issues while reducing flickers as best as possible (due to how completion works in Vim, a flicker-free experience is impossible to achieve). Here's how:
 - poll for completions using a timer and call `completefunc` once the completions are ready. Use the start column returned by the server in `completefunc`;
 - immediately display the last completions on the `TextChangedI` event to prevent the popup menu disappearing while waiting for the completions. This reduces flickering;
 - use the `InsertCharPre` event to close the completion menu just before inserting a character. This way the `TextChangedI` event is triggered when the character is inserted (this event is not fired when the completion menu is visible). This replaces the `refresh` option set to `always` in `completefunc` and the `s:cursor_moved` hack;
 - remap the backspace key to close the completion menu when deleting a character and thus triggering the `TextChangedI` event;
 - send a request with `force_semantic` set to `True` when forcing semantic completion instead of calling the omnifunc. This fixes the issue where there is no fuzzy matching for custom omnifuncs.

Here's a demo where I added a spin animation on the command line while loading the completions to show that it doesn't block the Vim UI:

![async-completion-for-real](https://cloud.githubusercontent.com/assets/10026824/26277295/0f16a718-3d86-11e7-90f3-8a56bbf53f9f.gif)

Fixes #961.
Fixes #1282.
Fixes #1881.
Fixes #2192.
Fixes #2500.
Fixes #2574.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/2657)
<!-- Reviewable:end -->
zzbot added a commit that referenced this issue Apr 14, 2018
…ble, r=puremourning

[READY] Do not disable omnifunc when filetype completion is disabled

Prior to PR #2657, it was possible to trigger Vim's omnifunc with `<C-Space>` even if semantic completion was disabled for the current filetype through the `g:ycm_filetype_specific_completion_to_disable` option. It worked because `<C-Space>` was mapped to `<C-X><C-O><C-P>`, which are the keys to trigger the omnifunc. PR #2657 changed that by making `<C-Space>` directly call the `SendCompletionRequest` function with `force_semantic` sets to `True`. This change was necessary to get fuzzy matching with the omnifunc (see issue #961) but broke the `<C-Space>` behavior when filetype completion is disabled. This PR restores that behavior.

Fixes #2950.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/2978)
<!-- Reviewable:end -->
@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 21, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants