1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 06:20:05 +08:00
SpaceVim/bundle/vim-matchup/autoload/matchup.vim
2020-06-13 14:06:35 +08:00

363 lines
11 KiB
VimL

" vim match-up - even better matching
"
" Maintainer: Andy Massimino
" Email: a@normed.space
"
let s:save_cpo = &cpo
set cpo&vim
function! matchup#init()
call matchup#perf#tic('loading')
call s:init_options()
call s:init_modules()
call s:init_default_mappings()
call matchup#perf#toc('loading', 'init_done')
endfunction
function! s:init_options()
call s:init_option('matchup_matchparen_enabled',
\ !(&t_Co < 8 && !has('gui_running')))
let l:offs = {'method': 'status'}
if !get(g:, 'matchup_matchparen_status_offscreen', 1)
let l:offs = {}
endif
if get(g:, 'matchup_matchparen_status_offscreen_manual', 0)
let l:offs.method = 'status_manual'
endif
if exists('g:matchup_matchparen_scrolloff')
let l:offs.scrolloff = g:matchup_matchparen_scrolloff
endif
call s:init_option('matchup_matchparen_offscreen', l:offs)
call s:init_option('matchup_matchparen_singleton', 0)
call s:init_option('matchup_matchparen_deferred', 0)
call s:init_option('matchup_matchparen_deferred_show_delay', 50)
call s:init_option('matchup_matchparen_deferred_hide_delay', 700)
call s:init_option('matchup_matchparen_deferred_fade_time', 0)
call s:init_option('matchup_matchparen_stopline', 400)
call s:init_option('matchup_matchparen_pumvisible', 1)
call s:init_option('matchup_matchparen_nomode', '')
call s:init_option('matchup_matchparen_hi_surround_always', 0)
call s:init_option('matchup_matchparen_hi_background', 0)
call s:init_option('matchup_matchparen_timeout',
\ get(g:, 'matchparen_timeout', 300))
call s:init_option('matchup_matchparen_insert_timeout',
\ get(g:, 'matchparen_insert_timeout', 60))
call s:init_option('matchup_delim_count_fail', 0)
call s:init_option('matchup_delim_count_max', 8)
call s:init_option('matchup_delim_start_plaintext', 1)
call s:init_option('matchup_delim_noskips', 0)
call s:init_option('matchup_motion_enabled', 1)
call s:init_option('matchup_motion_cursor_end', 1)
call s:init_option('matchup_motion_override_Npercent', 6)
call s:init_option('matchup_text_obj_enabled', 1)
call s:init_option('matchup_text_obj_linewise_operators', ['d', 'y'])
call s:init_option('matchup_transmute_enabled', 0)
call s:init_option('matchup_transmute_breakundo', 0)
call s:init_option('matchup_mouse_enabled', 1)
call s:init_option('matchup_surround_enabled', 0)
call s:init_option('matchup_where_enabled', 1)
call s:init_option('matchup_where_separator', '')
call s:init_option('matchup_matchpref', {})
endfunction
function! s:init_option(option, default)
let l:option = 'g:' . a:option
if !exists(l:option)
let {l:option} = a:default
endif
endfunction
function! s:init_modules()
for l:mod in [ 'loader', 'matchparen' ]
if !get(g:, 'matchup_'.l:mod.'_enabled', 1)
continue
endif
call matchup#perf#tic('loading_module')
call matchup#{l:mod}#init_module()
call matchup#perf#toc('loading_module', l:mod)
endfor
call s:motion_init_module()
call s:text_obj_init_module()
call s:misc_init_module()
call s:surround_init_module()
call s:where_init_module()
endfunction
function! s:init_oldstyle_ops() " {{{1
if get(g:, 'matchup_motion_enabled', 0)
\ || get(g:, 'matchup_text_obj_enabled', 0)
for l:opforce in ['', 'v', 'V', '<c-v>']
call s:map('onore', '<expr> <plug>(matchup-o_'.l:opforce.')',
\ '<sid>force('''.l:opforce.''')')
endfor
endif
if get(g:, 'matchup_motion_enabled', 0)
for l:opforce in ['', 'v', 'V', '<c-v>']
call s:map('o', l:opforce.'%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-%)')
call s:map('o', l:opforce.'g%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-g%)')
call s:map('o', l:opforce.']%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-]%)')
call s:map('o', l:opforce.'[%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-[%)')
call s:map('o', l:opforce.'z%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-z%)')
endfor
endif
if get(g:, 'matchup_text_obj_enabled', 0)
for l:opforce in ['', 'v', 'V', '<c-v>']
call s:map('o', l:opforce.'i%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-i%)')
call s:map('o', l:opforce.'a%',
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-a%)')
endfor
endif
endfunction
function! s:make_oldstyle_omaps(lhs, rhs)
if !s:old_style_ops
return 0
endif
for l:opforce in ['', 'v', 'V', '<c-v>']
silent! execute 'omap' l:opforce.a:lhs
\ '<plug>(matchup-o_'.l:opforce.')<plug>(matchup-'.a:rhs.')'
endfor
return 1
endfunction
let s:old_style_ops = !has('patch-8.1.0648')
let g:v_motion_force = ''
function! s:force(wise)
let g:v_motion_force = a:wise
return ''
endfunction
function! matchup#motion_force() abort
if !s:old_style_ops
let l:mode = mode(1)
let g:v_motion_force = len(l:mode) >= 3
\ && l:mode[0:1] ==# 'no' ? l:mode[2] : ''
endif
return g:v_motion_force
endfunction
" }}}1
function! s:init_default_mappings()
if !get(g:,'matchup_mappings_enabled', 1) | return | endif
function! s:map(mode, lhs, rhs, ...)
if !hasmapto(a:rhs, a:mode)
\ && ((a:0 > 0) || (maparg(a:lhs, a:mode) ==# ''))
silent execute a:mode . 'map <silent> ' a:lhs a:rhs
endif
endfunction
if s:old_style_ops
call s:init_oldstyle_ops()
endif
" these won't conflict since matchit should not be loaded at this point
if get(g:, 'matchup_motion_enabled', 0)
call s:map('n', '%', '<plug>(matchup-%)' )
call s:map('n', 'g%', '<plug>(matchup-g%)')
call s:map('x', '%', '<plug>(matchup-%)' )
call s:map('x', 'g%', '<plug>(matchup-g%)')
call s:map('n', ']%', '<plug>(matchup-]%)')
call s:map('n', '[%', '<plug>(matchup-[%)')
call s:map('x', ']%', '<plug>(matchup-]%)')
call s:map('x', '[%', '<plug>(matchup-[%)')
call s:map('n', 'z%', '<plug>(matchup-z%)')
call s:map('x', 'z%', '<plug>(matchup-z%)')
if !s:old_style_ops
call s:map('o', '%', '<plug>(matchup-%)')
call s:map('o', 'g%', '<plug>(matchup-g%)')
call s:map('o', ']%', '<plug>(matchup-]%)')
call s:map('o', '[%', '<plug>(matchup-[%)')
call s:map('o', 'z%', '<plug>(matchup-z%)')
endif
call s:map('i', '<c-g>%', '<plug>(matchup-c_g%)')
endif
if get(g:, 'matchup_text_obj_enabled', 0)
call s:map('x', 'i%', '<plug>(matchup-i%)')
call s:map('x', 'a%', '<plug>(matchup-a%)')
if !s:old_style_ops
call s:map('o', 'i%', '<plug>(matchup-i%)')
call s:map('o', 'a%', '<plug>(matchup-a%)')
endif
endif
if get(g:, 'matchup_mouse_enabled', 1)
call s:map('n', '<2-LeftMouse>', '<plug>(matchup-double-click)')
endif
if get(g:, 'matchup_surround_enabled', 0)
call s:map('n', 'ds%', '<plug>(matchup-ds%)')
call s:map('n', 'cs%', '<plug>(matchup-cs%)')
endif
endfunction
" module initialization
function! s:motion_init_module() " {{{1
if !g:matchup_motion_enabled | return | endif
call matchup#perf#tic('loading_module')
" gets the current forced motion type
nnoremap <silent><expr> <sid>(wise)
\ empty(g:v_motion_force) ? 'v' : g:v_motion_force
" the basic motions % and g%
nnoremap <silent> <plug>(matchup-%)
\ :<c-u>call matchup#motion#find_matching_pair(0, 1)<cr>
nnoremap <silent> <plug>(matchup-g%)
\ :<c-u>call matchup#motion#find_matching_pair(0, 0)<cr>
" visual and operator-pending
xnoremap <silent> <sid>(matchup-%)
\ :<c-u>call matchup#motion#find_matching_pair(1, 1)<cr>
xmap <silent> <plug>(matchup-%) <sid>(matchup-%)
onoremap <silent> <plug>(matchup-%)
\ :<c-u>call matchup#motion#op('%')<cr>
xnoremap <silent> <sid>(matchup-g%)
\ :<c-u>call matchup#motion#find_matching_pair(1, 0)<cr>
xmap <silent> <plug>(matchup-g%) <sid>(matchup-g%)
onoremap <silent> <plug>(matchup-g%)
\ :<c-u>call matchup#motion#op('g%')<cr>
" ]% and [%
nnoremap <silent> <plug>(matchup-]%)
\ :<c-u>call matchup#motion#find_unmatched(0, 1)<cr>
nnoremap <silent> <plug>(matchup-[%)
\ :<c-u>call matchup#motion#find_unmatched(0, 0)<cr>
xnoremap <silent> <sid>(matchup-]%)
\ :<c-u>call matchup#motion#find_unmatched(1, 1)<cr>
xnoremap <silent> <sid>(matchup-[%)
\ :<c-u>call matchup#motion#find_unmatched(1, 0)<cr>
xmap <plug>(matchup-]%) <sid>(matchup-]%)
xmap <plug>(matchup-[%) <sid>(matchup-[%)
onoremap <silent> <plug>(matchup-]%)
\ :<c-u>call matchup#motion#op(']%')<cr>
onoremap <silent> <plug>(matchup-[%)
\ :<c-u>call matchup#motion#op('[%')<cr>
" jump inside z%
nnoremap <silent> <plug>(matchup-z%)
\ :<c-u>call matchup#motion#jump_inside(0)<cr>
xnoremap <silent> <sid>(matchup-z%)
\ :<c-u>call matchup#motion#jump_inside(1)<cr>
xmap <silent> <plug>(matchup-z%) <sid>(matchup-z%)
onoremap <silent> <plug>(matchup-z%)
\ :<c-u>call matchup#motion#op('z%')<cr>
inoremap <silent> <plug>(matchup-c_g%)
\ <c-\><c-o>:call matchup#motion#insert_mode()<cr>
call matchup#perf#toc('loading_module', 'motion')
endfunction
" TODO redo this
function! s:snr()
return str2nr(matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_snr$'))
endfunction
let s:sid = printf("\<SNR>%d_", s:snr())
function! matchup#motion_sid()
return s:sid
endfunction
" }}}1
function! s:text_obj_init_module() " {{{1
if !g:matchup_text_obj_enabled | return | endif
call matchup#perf#tic('loading_module')
for [l:map, l:name, l:opt] in [
\ ['%', 'delimited', 'delim_all'],
\]
let l:p1 = 'noremap <silent> <plug>(matchup-'
let l:p2 = l:map . ') :<c-u>call matchup#text_obj#' . l:name
let l:p3 = empty(l:opt) ? ')<cr>' : ', ''' . l:opt . ''')<cr>'
execute 'x' . l:p1 . 'i' . l:p2 . '(1, 1' . l:p3
execute 'x' . l:p1 . 'a' . l:p2 . '(0, 1' . l:p3
execute 'o' . l:p1 . 'i' . l:p2 . '(1, 0' . l:p3
execute 'o' . l:p1 . 'a' . l:p2 . '(0, 0' . l:p3
endfor
nnoremap <silent> <plug>(matchup-double-click)
\ :<c-u>call matchup#text_obj#double_click()<cr>
call matchup#perf#toc('loading_module', 'motion')
endfunction
" }}}1
function! s:misc_init_module() " {{{1
call matchup#perf#tic('loading_module')
command! MatchupReload call matchup#misc#reload()
nnoremap <plug>(matchup-reload) :<c-u>MatchupReload<cr>
call matchup#perf#toc('loading_module', 'misc')
endfunction
" }}}1
function! s:surround_init_module() " {{{1
if !g:matchup_surround_enabled | return | endif
call matchup#perf#tic('loading_module')
for [l:map, l:name, l:opt] in [
\ ['%', 'delimited', 'delim_all'],
\]
let l:p1 = 'noremap <silent> <plug>(matchup-'
let l:p2 = l:map . ') :<c-u>call matchup#surround#' . l:name
let l:p3 = empty(l:opt) ? ')<cr>' : ', ''' . l:opt . ''')<cr>'
execute 'n' . l:p1 . 'ds' . l:p2 . '(0, "d"' . l:p3
execute 'n' . l:p1 . 'cs' . l:p2 . '(0, "c"' . l:p3
endfor
call matchup#perf#toc('loading_module', 'surround')
endfunction
" }}}1
function! s:where_init_module() " {{{1
if !g:matchup_where_enabled | return | endif
command! -nargs=? -bang MatchupWhereAmI
\ call matchup#where#print('<bang>' . <q-args>)
endfunction
" }}}1
let &cpo = s:save_cpo
" vim: fdm=marker sw=2