summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShougo <Shougo.Matsu@gmail.com>2020-11-17 19:19:46 +0900
committerGitHub <noreply@github.com>2020-11-17 19:19:46 +0900
commit27c5ddba448e50e182985e1582dd519342986cef (patch)
tree377a7646eada185ca4300e25fd3fbd2bbe45d6e4
parentddfc3eeb866c64e025a9f1e132b37b199a44973f (diff)
parentada81e90271441c3605d1f5e998a8015f5ae258d (diff)
downloaddeoplete.nvim-27c5ddba448e50e182985e1582dd519342986cef.zip
Merge pull request #1146 from Shougo/recently_used
[RFC] Add recently_used sort feature
-rw-r--r--autoload/deoplete/handler.vim16
-rw-r--r--autoload/deoplete/init.vim1
-rw-r--r--doc/deoplete.txt2
-rw-r--r--rplugin/python3/deoplete/deoplete.py1
-rw-r--r--rplugin/python3/deoplete/filter/sorter_rank.py6
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