Files
vim-matchup/autoload/matchup/pos.vim
2017-11-15 20:59:09 -05:00

117 lines
2.4 KiB
VimL

" vim match-up - matchit replacement and more
"
" 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#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(...) " {{{1
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
return l:cnum < strlen(getline(l:lnum))
\ ? [0, l:lnum, l:cnum+1, 0]
\ : [0, l:lnum+1, 1, 0]
endfunction
" }}}1
function! matchup#pos#prev(...) " {{{1
let [l:lnum, l:cnum; l:rest] = s:parse_args(a:000)
return l:cnum > 1
\ ? [0, l:lnum, l:cnum-1, 0]
\ : [0, max([l:lnum-1, 1]),
\ max([strlen(getline(l:lnum-1)), 1]), 0]
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