diff options
author | Shougo <Shougo.Matsu@gmail.com> | 2020-11-17 19:19:46 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-17 19:19:46 +0900 |
commit | 27c5ddba448e50e182985e1582dd519342986cef (patch) | |
tree | 377a7646eada185ca4300e25fd3fbd2bbe45d6e4 | |
parent | ddfc3eeb866c64e025a9f1e132b37b199a44973f (diff) | |
parent | ada81e90271441c3605d1f5e998a8015f5ae258d (diff) | |
download | deoplete.nvim-27c5ddba448e50e182985e1582dd519342986cef.zip |
Merge pull request #1146 from Shougo/recently_used
[RFC] Add recently_used sort feature
-rw-r--r-- | autoload/deoplete/handler.vim | 16 | ||||
-rw-r--r-- | autoload/deoplete/init.vim | 1 | ||||
-rw-r--r-- | doc/deoplete.txt | 2 | ||||
-rw-r--r-- | rplugin/python3/deoplete/deoplete.py | 1 | ||||
-rw-r--r-- | rplugin/python3/deoplete/filter/sorter_rank.py | 6 |
5 files changed, 24 insertions, 2 deletions
diff --git a/autoload/deoplete/handler.vim b/autoload/deoplete/handler.vim index b1895f1..e355063 100644 --- a/autoload/deoplete/handler.vim +++ b/autoload/deoplete/handler.vim @@ -363,11 +363,27 @@ endfunction function! s:on_complete_done() abort if get(v:completed_item, 'word', '') ==# '' + \ || !has_key(g:deoplete#_context, 'complete_str') return endif call deoplete#handler#_skip_next_completion() + let max_used = 100 + let g:deoplete#_recently_used = insert( + \ g:deoplete#_recently_used, + \ tolower(v:completed_item.word), + \ ) + let min_pattern_length = deoplete#custom#_get_option('min_pattern_length') + if len(g:deoplete#_context['complete_str']) > min_pattern_length + let g:deoplete#_recently_used = insert( + \ g:deoplete#_recently_used, + \ tolower(g:deoplete#_context['complete_str']), + \ ) + endif + let g:deoplete#_recently_used = deoplete#util#uniq( + \ g:deoplete#_recently_used)[: max_used] + let user_data = get(v:completed_item, 'user_data', '') if type(user_data) !=# v:t_string || user_data ==# '' return diff --git a/autoload/deoplete/init.vim b/autoload/deoplete/init.vim index d2380e7..cd9ccfa 100644 --- a/autoload/deoplete/init.vim +++ b/autoload/deoplete/init.vim @@ -112,6 +112,7 @@ function! s:init_internal_variables() abort call deoplete#init#_prev_completion() let g:deoplete#_context = {} + let g:deoplete#_recently_used = [] if !exists('g:deoplete#_logging') let g:deoplete#_logging = {} diff --git a/doc/deoplete.txt b/doc/deoplete.txt index 2a80d5a..a42c854 100644 --- a/doc/deoplete.txt +++ b/doc/deoplete.txt @@ -792,7 +792,7 @@ matcher_length *deoplete-filter-sorter_rank* sorter_rank Matched rank order sorter. The higher the head matched word - or already typed word. + or already typed or inserted word. The locality bonus feature is implemented like VSCode. *deoplete-filter-sorter_word* diff --git a/rplugin/python3/deoplete/deoplete.py b/rplugin/python3/deoplete/deoplete.py index f09dbae..3774e59 100644 --- a/rplugin/python3/deoplete/deoplete.py +++ b/rplugin/python3/deoplete/deoplete.py @@ -109,6 +109,7 @@ class Deoplete(logger.LoggingMixin): # error(self._vim, candidates) self._vim.vars['deoplete#_context'] = { 'complete_position': position, + 'complete_str': context['input'][position:], 'candidates': candidates, 'event': context['event'], 'input': context['input'], diff --git a/rplugin/python3/deoplete/filter/sorter_rank.py b/rplugin/python3/deoplete/filter/sorter_rank.py index f002aab..b7fc5d7 100644 --- a/rplugin/python3/deoplete/filter/sorter_rank.py +++ b/rplugin/python3/deoplete/filter/sorter_rank.py @@ -39,11 +39,15 @@ class Filter(Base): def filter(self, context: UserContext) -> Candidates: complete_str = context['complete_str'].lower() linenr = context['position'][1] + recently_used = self.vim.vars['deoplete#_recently_used'] def compare(x: Candidate) -> int: word = x['word'] - matched = int(complete_str in word.lower()) + lower = x['word'].lower() + matched = int(complete_str in lower) score = -matched * 40 + if [x for x in recently_used if lower.startswith(x)]: + score -= 1000 if word in self._cache: mru = min([abs(x - linenr) for x in self._cache[word]]) mru -= LINES_MAX |