123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- scriptencoding utf-8
- let s:is_vim = !has('nvim')
- let s:activated = 0
- let s:session_names = []
- let s:saved_ve = &t_ve
- let s:saved_cursor = &guicursor
- let s:gui = has('gui_running') || has('nvim')
- let s:char_map = {
- \ "\<Plug>": '<plug>',
- \ "\<Esc>": '<esc>',
- \ "\<Tab>": '<tab>',
- \ "\<S-Tab>": '<s-tab>',
- \ "\<bs>": '<bs>',
- \ "\<right>": '<right>',
- \ "\<left>": '<left>',
- \ "\<up>": '<up>',
- \ "\<down>": '<down>',
- \ "\<home>": '<home>',
- \ "\<end>": '<end>',
- \ "\<cr>": '<cr>',
- \ "\<PageUp>":'<PageUp>' ,
- \ "\<PageDown>":'<PageDown>' ,
- \ "\<FocusGained>":'<FocusGained>',
- \ "\<FocusLost>":'<FocusLost>',
- \ "\<ScrollWheelUp>": '<ScrollWheelUp>',
- \ "\<ScrollWheelDown>": '<ScrollWheelDown>',
- \ "\<LeftMouse>": '<LeftMouse>',
- \ "\<LeftDrag>": '<LeftDrag>',
- \ "\<LeftRelease>": '<LeftRelease>',
- \ "\<2-LeftMouse>": '<2-LeftMouse>',
- \ "\<C-a>": '<C-a>',
- \ "\<C-b>": '<C-b>',
- \ "\<C-c>": '<C-c>',
- \ "\<C-d>": '<C-d>',
- \ "\<C-e>": '<C-e>',
- \ "\<C-f>": '<C-f>',
- \ "\<C-g>": '<C-g>',
- \ "\<C-h>": '<C-h>',
- \ "\<C-j>": '<C-j>',
- \ "\<C-k>": '<C-k>',
- \ "\<C-l>": '<C-l>',
- \ "\<C-n>": '<C-n>',
- \ "\<C-o>": '<C-o>',
- \ "\<C-p>": '<C-p>',
- \ "\<C-q>": '<C-q>',
- \ "\<C-r>": '<C-r>',
- \ "\<C-s>": '<C-s>',
- \ "\<C-t>": '<C-t>',
- \ "\<C-u>": '<C-u>',
- \ "\<C-v>": '<C-v>',
- \ "\<C-w>": '<C-w>',
- \ "\<C-x>": '<C-x>',
- \ "\<C-y>": '<C-y>',
- \ "\<C-z>": '<C-z>',
- \ "\<A-a>": '<A-a>',
- \ "\<A-b>": '<A-b>',
- \ "\<A-c>": '<A-c>',
- \ "\<A-d>": '<A-d>',
- \ "\<A-e>": '<A-e>',
- \ "\<A-f>": '<A-f>',
- \ "\<A-g>": '<A-g>',
- \ "\<A-h>": '<A-h>',
- \ "\<A-i>": '<A-i>',
- \ "\<A-j>": '<A-j>',
- \ "\<A-k>": '<A-k>',
- \ "\<A-l>": '<A-l>',
- \ "\<A-m>": '<A-m>',
- \ "\<A-n>": '<A-n>',
- \ "\<A-o>": '<A-o>',
- \ "\<A-p>": '<A-p>',
- \ "\<A-q>": '<A-q>',
- \ "\<A-r>": '<A-r>',
- \ "\<A-s>": '<A-s>',
- \ "\<A-t>": '<A-t>',
- \ "\<A-u>": '<A-u>',
- \ "\<A-v>": '<A-v>',
- \ "\<A-w>": '<A-w>',
- \ "\<A-x>": '<A-x>',
- \ "\<A-y>": '<A-y>',
- \ "\<A-z>": '<A-z>',
- \ }
- function! coc#prompt#getc() abort
- let c = getchar()
- return type(c) is 0 ? nr2char(c) : c
- endfunction
- function! coc#prompt#getchar() abort
- let input = coc#prompt#getc()
- if 1 != &iminsert
- return input
- endif
- "a language keymap is activated, so input must be resolved to the mapped values.
- let partial_keymap = mapcheck(input, 'l')
- while partial_keymap !=# ''
- let dict = maparg(input, 'l', 0, 1)
- if empty(dict) || get(dict, 'expr', 0)
- return input
- endif
- let full_keymap = get(dict, 'rhs', '')
- if full_keymap ==# "" && len(input) >= 3 "HACK: assume there are no keymaps longer than 3.
- return input
- elseif full_keymap ==# partial_keymap
- return full_keymap
- endif
- let c = coc#prompt#getc()
- if c ==# "\<Esc>" || c ==# "\<CR>"
- "if the short sequence has a valid mapping, return that.
- if !empty(full_keymap)
- return full_keymap
- endif
- return input
- endif
- let input .= c
- let partial_keymap = mapcheck(input, 'l')
- endwhile
- return input
- endfunction
- function! coc#prompt#start_prompt(session) abort
- let s:session_names = s:filter(s:session_names, a:session)
- call add(s:session_names, a:session)
- if s:activated | return | endif
- if s:is_vim
- call s:start_prompt_vim()
- else
- call s:start_prompt()
- endif
- endfunction
- function! s:start_prompt_vim() abort
- call timer_start(10, {-> s:start_prompt()})
- endfunction
- function! s:start_prompt()
- if s:activated | return | endif
- if !get(g:, 'coc_disable_transparent_cursor', 0)
- if s:gui
- if has('nvim-0.5.0') && !empty(s:saved_cursor)
- set guicursor+=a:ver1-CocCursorTransparent/lCursor
- endif
- elseif s:is_vim
- set t_ve=
- endif
- endif
- let s:activated = 1
- try
- while s:activated
- let ch = coc#prompt#getchar()
- if ch ==# "\<FocusLost>" || ch ==# "\<FocusGained>" || ch ==# "\<CursorHold>"
- continue
- else
- let curr = s:current_session()
- let mapped = get(s:char_map, ch, ch)
- if !empty(curr)
- call coc#rpc#notify('InputChar', [curr, mapped, getcharmod()])
- endif
- if mapped == '<esc>'
- let s:session_names = []
- call s:reset()
- break
- endif
- endif
- endwhile
- catch /^Vim:Interrupt$/
- let s:activated = 0
- call coc#rpc#notify('InputChar', [s:current_session(), '<esc>'])
- return
- endtry
- let s:activated = 0
- endfunction
- function! coc#prompt#stop_prompt(session)
- let s:session_names = s:filter(s:session_names, a:session)
- if len(s:session_names)
- return
- endif
- if s:activated
- let s:activated = 0
- call s:reset()
- call feedkeys("\<esc>", 'int')
- endif
- endfunction
- function! coc#prompt#activated() abort
- return s:activated
- endfunction
- function! s:reset() abort
- if !get(g:, 'coc_disable_transparent_cursor',0)
- " neovim has bug with revert empty &guicursor
- if s:gui && !empty(s:saved_cursor)
- if has('nvim-0.5.0')
- set guicursor+=a:ver1-Cursor/lCursor
- let &guicursor = s:saved_cursor
- endif
- elseif s:is_vim
- let &t_ve = s:saved_ve
- endif
- endif
- echo ""
- endfunction
- function! s:current_session() abort
- if empty(s:session_names)
- return v:null
- endif
- return s:session_names[len(s:session_names) - 1]
- endfunction
- function! s:filter(list, id) abort
- return filter(copy(a:list), 'v:val !=# a:id')
- endfunction
|