60 lines
1.7 KiB
VimL
60 lines
1.7 KiB
VimL
scriptencoding utf-8
|
|
|
|
" Position of cursor relative to screen cell
|
|
function! coc#cursor#screen_pos() abort
|
|
let nr = winnr()
|
|
let [row, col] = win_screenpos(nr)
|
|
return [row + winline() - 2, col + wincol() - 2]
|
|
endfunction
|
|
|
|
function! coc#cursor#move_by_col(delta)
|
|
let pos = getcurpos()
|
|
call cursor(pos[1], pos[2] + a:delta)
|
|
endfunction
|
|
|
|
" Get cursor position.
|
|
function! coc#cursor#position()
|
|
return [line('.') - 1, strchars(strpart(getline('.'), 0, col('.') - 1))]
|
|
endfunction
|
|
|
|
" Move cursor to position.
|
|
function! coc#cursor#move_to(line, character) abort
|
|
let content = getline(a:line + 1)
|
|
let pre = strcharpart(content, 0, a:character)
|
|
let col = strlen(pre) + 1
|
|
call cursor(a:line + 1, col)
|
|
endfunction
|
|
|
|
" Character offset of current cursor, vim provide bytes offset only.
|
|
function! coc#cursor#char_offset() abort
|
|
let offset = 0
|
|
let lnum = line('.')
|
|
for i in range(1, lnum)
|
|
if i == lnum
|
|
let offset += strchars(strpart(getline('.'), 0, col('.')-1))
|
|
else
|
|
let offset += strchars(getline(i)) + 1
|
|
endif
|
|
endfor
|
|
return offset
|
|
endfunction
|
|
|
|
" Returns latest selection range
|
|
function! coc#cursor#get_selection(char) abort
|
|
let m = a:char ? 'char' : visualmode()
|
|
if empty(m)
|
|
return v:null
|
|
endif
|
|
let [_, sl, sc, soff] = getpos(m ==# 'char' ? "'[" : "'<")
|
|
let [_, el, ec, eoff] = getpos(m ==# 'char' ? "']" : "'>")
|
|
let start_idx = coc#string#get_character(getline(sl), sc)
|
|
if m ==# 'V'
|
|
return [sl - 1, start_idx, el, 0]
|
|
endif
|
|
let line = getline(el)
|
|
let end_idx = coc#string#get_character(line, ec)
|
|
if m !=# 'char'
|
|
let end_idx = end_idx == strchars(line) ? end_idx : end_idx + 1
|
|
endif
|
|
return [sl - 1, start_idx, el - 1, end_idx]
|
|
endfunction
|