mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 09:30:04 +08:00
144 lines
3.0 KiB
VimL
144 lines
3.0 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#pos#set_cursor(...) " {{{1
|
|
call cursor(s:parse_args(a:000))
|
|
endfunction
|
|
|
|
" }}}1
|
|
" function! matchup#pos#get_cursor() {{{1
|
|
if exists('*getcurpos')
|
|
function! matchup#pos#get_cursor()
|
|
return getcurpos()
|
|
endfunction
|
|
else
|
|
function! matchup#pos#get_cursor()
|
|
return getpos('.')
|
|
endfunction
|
|
endif
|
|
|
|
" }}}1
|
|
|
|
" }}}1
|
|
function! matchup#pos#get_cursor_line() " {{{1
|
|
let l:pos = matchup#pos#get_cursor()
|
|
return l:pos[1]
|
|
endfunction
|
|
|
|
" }}}1
|
|
|
|
function! matchup#pos#(...) abort " {{{1
|
|
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
|
|
return [l:lnum, l:cnum]
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#val(...) " {{{1
|
|
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
|
|
|
|
return 100000*l:lnum + min([l:cnum, 90000])
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#next_eol(...) " {{{1
|
|
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
|
|
|
|
if l:cnum > strlen(getline(l:lnum))
|
|
return [0, l:lnum+1, 1, 0]
|
|
endif
|
|
|
|
let l:next = matchup#pos#next(l:lnum, l:cnum)
|
|
if l:next[1] > l:lnum
|
|
return [0, l:lnum, l:cnum+1, 0]
|
|
endif
|
|
return l:next
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#next(...) " {{{1
|
|
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
|
|
|
|
let l:line = getline(l:lnum)
|
|
let l:charlen = matchend(l:line[l:cnum-1:], '.')
|
|
if l:charlen >= 0 && l:cnum + l:charlen <= strlen(l:line)
|
|
return [0, l:lnum, l:cnum + l:charlen, 0]
|
|
else
|
|
return [0, l:lnum+1, 1, 0]
|
|
endif
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#prev(...) " {{{1
|
|
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
|
|
|
|
if l:cnum > 1
|
|
return [0, l:lnum, match(getline(l:lnum)[0:l:cnum-2], '.$') + 1, 0]
|
|
else
|
|
return [0, max([l:lnum-1, 1]),
|
|
\ max([strlen(getline(l:lnum-1)), 1]), 0]
|
|
endif
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#larger(pos1, pos2) " {{{1
|
|
return matchup#pos#val(a:pos1) > matchup#pos#val(a:pos2)
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#equal(p1, p2) " {{{1
|
|
let l:pos1 = s:parse_args(a:p1)
|
|
let l:pos2 = s:parse_args(a:p2)
|
|
return l:pos1[:1] == l:pos2[:1]
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#smaller(pos1, pos2) " {{{1
|
|
return matchup#pos#val(a:pos1) < matchup#pos#val(a:pos2)
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#pos#smaller_or_equal(pos1, pos2) " {{{1
|
|
return matchup#pos#smaller(a:pos1, a:pos2)
|
|
\ || matchup#pos#equal(a:pos1, a:pos2)
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! s:parse_args(args) " {{{1
|
|
"
|
|
" The arguments should be in one of the following forms (when unpacked):
|
|
"
|
|
" [lnum, cnum]
|
|
" [bufnum, lnum, cnum, ...]
|
|
" {'lnum' : lnum, 'cnum' : cnum}
|
|
"
|
|
|
|
if len(a:args) > 1
|
|
return s:parse_args([a:args])
|
|
elseif len(a:args) == 1
|
|
if type(a:args[0]) == type({})
|
|
return [get(a:args[0], 'lnum'), get(a:args[0], 'cnum')]
|
|
else
|
|
if len(a:args[0]) == 2
|
|
return a:args[0]
|
|
else
|
|
return a:args[0][1:]
|
|
endif
|
|
endif
|
|
else
|
|
return a:args
|
|
endif
|
|
endfunction
|
|
|
|
" }}}1
|
|
|
|
let &cpo = s:save_cpo
|
|
|
|
" vim: fdm=marker sw=2
|
|
|