mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 19:00:06 +08:00
cd6ea298f2
* Add incsearch.vim into bundle dir * Fix java neoformat config close #3573 * Use echom instead in pull.vim
123 lines
4.0 KiB
VimL
123 lines
4.0 KiB
VimL
"=============================================================================
|
|
" FILE: autoload/incsearch/over/extend.vim
|
|
" AUTHOR: haya14busa
|
|
" License: MIT license
|
|
"=============================================================================
|
|
scriptencoding utf-8
|
|
let s:save_cpo = &cpo
|
|
set cpo&vim
|
|
|
|
let s:TRUE = !0
|
|
let s:FALSE = 0
|
|
let s:non_escaped_backslash = '\m\%(\%(^\|[^\\]\)\%(\\\\\)*\)\@<=\\'
|
|
|
|
let s:U = incsearch#util#import()
|
|
|
|
function! incsearch#over#extend#enrich(cli) abort
|
|
return extend(a:cli, s:cli)
|
|
endfunction
|
|
|
|
let s:cli = {
|
|
\ '_does_exit_from_incsearch': s:FALSE,
|
|
\ '_return_cmd': '',
|
|
\ '_converter_cache': {}
|
|
\ }
|
|
|
|
function! s:cli._generate_command(input) abort
|
|
let is_cancel = self.exit_code()
|
|
if is_cancel
|
|
return s:U.is_visual(self._mode) ? '\<ESC>gv' : "\<ESC>"
|
|
else
|
|
call self._call_execute_event()
|
|
let [pattern, offset] = incsearch#parse_pattern(a:input, self._base_key)
|
|
" TODO: implement convert input method
|
|
let p = self._combine_pattern(self._convert(pattern), offset)
|
|
return self._build_search_cmd(p)
|
|
endif
|
|
endfunction
|
|
|
|
" @return search cmd
|
|
function! s:cli._build_search_cmd(pattern, ...) abort
|
|
let mode = get(a:, 1, self._mode)
|
|
let op = (mode ==# 'no') ? v:operator
|
|
\ : s:U.is_visual(mode) ? 'gv'
|
|
\ : ''
|
|
let zv = (&foldopen =~# '\vsearch|all' && mode !=# 'no' ? 'zv' : '')
|
|
" NOTE:
|
|
" Should I consider o_v, o_V, and o_CTRL-V cases and do not
|
|
" <Esc>? <Esc> exists for flexible v:count with using s:cli._vcount1,
|
|
" but, if you do not move the cursor while incremental searching,
|
|
" there are no need to use <Esc>.
|
|
let esc = self._has_count ? "\<Esc>" : ''
|
|
let register = esc is# '' ? '' : '"' . v:register
|
|
let cnt = self._vcount1 is# 1 ? '' : self._vcount1
|
|
let prefix = esc . register . (esc is# '' ? '' : op) . cnt
|
|
return printf("%s%s%s\<CR>%s", prefix, self._base_key, a:pattern, zv)
|
|
endfunction
|
|
|
|
"" Call on_execute_pre and on_execute event
|
|
" assume current position is the destination and a:cli._w is the position to
|
|
" start search
|
|
function! s:cli._call_execute_event(...) abort
|
|
let view = get(a:, 1, winsaveview())
|
|
try
|
|
call winrestview(self._w)
|
|
call self.callevent('on_execute_pre')
|
|
finally
|
|
call winrestview(view)
|
|
endtry
|
|
call self.callevent('on_execute')
|
|
endfunction
|
|
|
|
function! s:cli._parse_pattern() abort
|
|
if v:version == 704 && !has('patch421')
|
|
" Ignore \ze* which clash vim 7.4 without 421 patch
|
|
" Assume `\m`
|
|
let [p, o] = incsearch#parse_pattern(self.getline(), self._base_key)
|
|
let p = (p =~# s:non_escaped_backslash . 'z[se]\%(\*\|\\+\)' ? '' : p)
|
|
return [p, o]
|
|
else
|
|
return incsearch#parse_pattern(self.getline(), self._base_key)
|
|
endif
|
|
endfunction
|
|
|
|
function! s:cli._combine_pattern(pattern, offset) abort
|
|
return empty(a:offset) ? a:pattern : a:pattern . self._base_key . a:offset
|
|
endfunction
|
|
|
|
function! s:cli._convert(pattern) abort
|
|
if a:pattern is# ''
|
|
return a:pattern
|
|
elseif empty(self._converters)
|
|
return incsearch#magic() . a:pattern
|
|
elseif has_key(self._converter_cache, a:pattern)
|
|
return self._converter_cache[a:pattern]
|
|
else
|
|
let ps = [incsearch#magic() . a:pattern]
|
|
for l:Converter in self._converters
|
|
let l:Convert = type(l:Converter) is type(function('function'))
|
|
\ ? l:Converter : l:Converter.convert
|
|
let ps += [l:Convert(a:pattern)]
|
|
unlet l:Converter
|
|
endfor
|
|
" Converters may return upper case even if a:pattern doesn't contain upper
|
|
" case letter, so prepend case flag explicitly
|
|
" let case = incsearch#detect_case(a:pattern)
|
|
let case = incsearch#detect_case(a:pattern)
|
|
let self._converter_cache[a:pattern] = case . s:U.regexp_join(ps)
|
|
return self._converter_cache[a:pattern]
|
|
endif
|
|
endfunction
|
|
|
|
function! s:cli._exit_incsearch(...) abort
|
|
let cmd = get(a:, 1, '')
|
|
let self._return_cmd = cmd
|
|
let self._does_exit_from_incsearch = s:TRUE
|
|
call self.exit()
|
|
endfunction
|
|
|
|
let &cpo = s:save_cpo
|
|
unlet s:save_cpo
|
|
" __END__
|
|
" vim: expandtab softtabstop=2 shiftwidth=2 foldmethod=marker
|