From f41a2df34be90ccfcfcd4ca4b4b2c4e0d92608be Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Tue, 8 Sep 2020 22:50:49 +0800 Subject: [PATCH] Fix autocomplete layer options (#3786) close https://github.com/SpaceVim/SpaceVim/issues/3783 --- autoload/SpaceVim/layers/autocomplete.vim | 44 +++++++++++++++++------ config/plugins/deoplete.vim | 3 ++ config/plugins/neocomplete.vim | 4 +++ docs/cn/layers/autocomplete.md | 6 ++-- docs/layers/autocomplete.md | 8 +++-- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/autoload/SpaceVim/layers/autocomplete.vim b/autoload/SpaceVim/layers/autocomplete.vim index cec44a662..9e8c1a70d 100644 --- a/autoload/SpaceVim/layers/autocomplete.vim +++ b/autoload/SpaceVim/layers/autocomplete.vim @@ -26,6 +26,18 @@ " directory is `~/.SpaceVim/snippets/`. If `g:spacevim_force_global_config = 1`, " SpaceVim will not append `./.SpaceVim/snippets` as default snippets directory. + +if exists('s:return_key_behavior') + finish +else + let s:return_key_behavior = 'smart' + let s:tab_key_behavior = 'smart' + let g:_spacevim_key_sequence = 'nil' + let s:key_sequence_delay = 1 + let g:_spacevim_autocomplete_delay = 50 + let s:timeoutlen = &timeoutlen +endif + function! SpaceVim#layers#autocomplete#plugins() abort let plugins = [ \ [g:_spacevim_root_dir . 'bundle/vim-snippets', { 'on_event' : 'InsertEnter', 'loadconf_before' : 1}], @@ -116,7 +128,6 @@ function! SpaceVim#layers#autocomplete#plugins() abort return plugins endfunction - function! SpaceVim#layers#autocomplete#config() abort if g:spacevim_autocomplete_parens imap ( @@ -183,14 +194,19 @@ function! SpaceVim#layers#autocomplete#config() abort elseif g:spacevim_snippet_engine ==# 'ultisnips' call SpaceVim#mapping#space#def('nnoremap', ['i', 's'], 'Unite ultisnips', 'insert snippets', 1) endif + if !empty(g:_spacevim_key_sequence) + if g:spacevim_escape_key_binding !=# g:_spacevim_key_sequence + augroup spacevim_layer_autocomplete + autocmd! + autocmd InsertEnter * call s:apply_sequence_delay() + autocmd InsertLeave * call s:restore_sequence_delay() + augroup END + else + call SpaceVim#logger#warn('Can not use same value for escape_key_binding and auto_completion_complete_with_key_sequence') + endif + endif endfunction -let s:return_key_behavior = 'smart' -let s:tab_key_behavior = 'smart' -let s:key_sequence = 'nil' -let s:key_sequence_delay = 0.1 -let g:_spacevim_autocomplete_delay = 50 - function! SpaceVim#layers#autocomplete#set_variable(var) abort let s:return_key_behavior = get(a:var, @@ -203,12 +219,12 @@ function! SpaceVim#layers#autocomplete#set_variable(var) abort \ get(a:var, \ 'auto-completion-tab-key-behavior', \ s:tab_key_behavior)) - let s:key_sequence = get(a:var, + let g:_spacevim_key_sequence = get(a:var, \ 'auto_completion_complete_with_key_sequence', \ get(a:var, \ 'auto-completion-complete-with-key-sequence', - \ s:key_sequence)) - let s:key_sequence_delay = get(a:var, + \ g:_spacevim_key_sequence)) + let g:_spacevim_key_sequence_delay = get(a:var, \ 'auto_completion_complete_with_key_sequence_delay', \ get(a:var, \ 'auto-completion-complete-with-key-sequence-delay', @@ -233,6 +249,14 @@ function! SpaceVim#layers#autocomplete#getprfile() abort +endfunction + +function! s:apply_sequence_delay() abort + let &timeoutlen = s:key_sequence_delay * 1000 +endfunction + +function! s:restore_sequence_delay() abort + let &timeoutlen = s:timeoutlen endfunction " vim:set et sw=2 cc=80: diff --git a/config/plugins/deoplete.vim b/config/plugins/deoplete.vim index e75c3bb20..c59b4aec0 100644 --- a/config/plugins/deoplete.vim +++ b/config/plugins/deoplete.vim @@ -125,6 +125,9 @@ call deoplete#custom#option('sources', {'cs': ['omnisharp']}) " public settings call deoplete#custom#source('_', 'matchers', ['matcher_full_fuzzy']) call deoplete#custom#source('file/include', 'matchers', ['matcher_head']) +if !empty(g:_spacevim_key_sequence) && g:spacevim_escape_key_binding !=# g:_spacevim_key_sequence + exe printf('inoremap %s deoplete#manual_complete()', g:_spacevim_key_sequence) +endif if g:spacevim_autocomplete_parens && exists('g:loaded_delimitMate') imap deoplete#smart_close_popup()."delimitMateBS" diff --git a/config/plugins/neocomplete.vim b/config/plugins/neocomplete.vim index 1bccaf6d7..804a49fa2 100644 --- a/config/plugins/neocomplete.vim +++ b/config/plugins/neocomplete.vim @@ -68,3 +68,7 @@ inoremap neocomplete#smart_close_popup()."\" inoremap neocomplete#smart_close_popup()."\" inoremap neocomplete#close_popup() inoremap neocomplete#cancel_popup() + +if !empty(g:_spacevim_key_sequence) && g:spacevim_escape_key_binding !=# g:_spacevim_key_sequence + exe printf('imap %s (neocomplete_auto_refresh)', g:_spacevim_key_sequence) +endif diff --git a/docs/cn/layers/autocomplete.md b/docs/cn/layers/autocomplete.md index 0ddbacadf..664d013f7 100644 --- a/docs/cn/layers/autocomplete.md +++ b/docs/cn/layers/autocomplete.md @@ -136,8 +136,10 @@ SpaceVim 选项 `snippet_engine` 设置为 `ultisnips`,将使用 [UltiSnips](h - `cycle` 循环模式,自动再补全列表之间循环 - `nil` 当设为 nil 时,该行为和 `Tab` 的默认行为一致 3. `auto_completion_delay` 设置自动补全延迟时间,默认 50 毫秒 -4. `auto_completion_complete_with_key_sequence` 设置一个手动补全的由两个字符构成的按键序列,如果你按下这个序列足够快,将会启动补全;如果这一选项的值是 `nil` ,这一特性将被禁用。 -5. `auto_completion_complete_with_key_sequence_delay` 设置手动补全按键序列延迟时间,默认是 0.1 +4. `auto_completion_complete_with_key_sequence` 设置一个手动补全的由两个字符构成的按键序列, + 如果你按下这个序列足够快,将会启动补全;如果这一选项的值是 `nil` ,这一特性将被禁用。 + **NOTE:** 该选项不可以与全局选项 `escape_key_binding` 使用同一个值。 +5. `auto_completion_complete_with_key_sequence_delay` 设置手动补全按键序列延迟时间,默认是 1 秒。 自动补全模块默认载入状态如下: diff --git a/docs/layers/autocomplete.md b/docs/layers/autocomplete.md index 51c9faad8..d2cf116c9 100644 --- a/docs/layers/autocomplete.md +++ b/docs/layers/autocomplete.md @@ -118,21 +118,23 @@ You can customize the user experience of autocompletion with the following layer - `complete` completes with the current selection - `smart` completes with current selection and expand snippet or argvs - `nil` - By default it is `complete`. + By default it is `complete`. 2. `auto_completion_tab_key_behavior` set the action to perform when the `TAB` key is pressed, the possible values are: - `smart` cycle candidates, expand snippets, jump parameters - `complete` completes with the current selection - `cycle` completes the common prefix and cycle between candidates - `nil` insert a carriage return - By default it is `complete`. + By default it is `complete`. 3. `auto_completion_delay` is a number to delay the completion after input in milliseconds, by default it is 50 ms. 4. `auto_completion_complete_with_key_sequence` is a string of two characters denoting a key sequence that will perform a `complete` action if the sequence as been entered quickly enough. If its value is `nil` then the feature is disabled. + **NOTE:** This option should not has same value as `escape_key_binding` 5. `auto_completion_complete_with_key_sequence_delay` is the number of seconds to wait for -the autocompletion key sequence to be entered. The default value is 0.1 seconds. + the autocompletion key sequence to be entered. The default value is 1 seconds. + This option is used for vim's `timeoutlen` option in insert mode. The default configuration of the layer is: