" " Returns recent visual-mode range. " function! lsp#utils#range#_get_recent_visual_range() abort let l:start_pos = getpos("'<")[1 : 2] let l:end_pos = getpos("'>")[1 : 2] let l:end_pos[1] += 1 " To exclusive " Fix line selection. let l:end_line = getline(l:end_pos[0]) if l:end_pos[1] > strlen(l:end_line) let l:end_pos[1] = strlen(l:end_line) + 1 endif let l:range = {} let l:range['start'] = lsp#utils#position#vim_to_lsp('%', l:start_pos) let l:range['end'] = lsp#utils#position#vim_to_lsp('%', l:end_pos) return l:range endfunction " " Returns current line range. " function! lsp#utils#range#_get_current_line_range() abort let l:pos = getpos('.')[1 : 2] let l:range = {} let l:range['start'] = lsp#utils#position#vim_to_lsp('%', l:pos) let l:range['end'] = lsp#utils#position#vim_to_lsp('%', [l:pos[0], l:pos[1] + strlen(getline(l:pos[0])) + 1]) return l:range endfunction " Convert a LSP range to one or more vim match positions. " If the range spans over multiple lines, break it down to multiple " positions, one for each line. " Return a list of positions. function! lsp#utils#range#lsp_to_vim(bufnr, range) abort let l:position = [] let [l:start_line, l:start_col] = lsp#utils#position#lsp_to_vim(a:bufnr, a:range['start']) let [l:end_line, l:end_col] = lsp#utils#position#lsp_to_vim(a:bufnr, a:range['end']) if l:end_line == l:start_line let l:position = [[ \ l:start_line, \ l:start_col, \ l:end_col - l:start_col \ ]] else " First line let l:position = [[ \ l:start_line, \ l:start_col, \ 999 \ ]] " Last line call add(l:position, [ \ l:end_line, \ 1, \ l:end_col \ ]) " Lines in the middle let l:middle_lines = map( \ range(l:start_line + 1, l:end_line - 1), \ {_, l -> [l, 0, 999]} \ ) call extend(l:position, l:middle_lines) endif return l:position endfunction function! lsp#utils#range#get_range() abort let l:char = lsp#utils#to_char('%', line('$'), col('$')) return {'start': {'line': 0, 'character': 0}, 'end': {'line': line('$')-1, 'character': l:char}} endfunction function! lsp#utils#range#get_range_curline() abort let l:char = lsp#utils#to_char('%', line('.'), col('$')) return {'start': {'line': line('.')-1, 'character': 0}, 'end': {'line': line('.')-1, 'character': l:char}} endfunction