Skip to content

Instantly share code, notes, and snippets.

@AndrewRadev
Created February 8, 2024 11:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrewRadev/50e498e912fd274a787d408d6d7d28f0 to your computer and use it in GitHub Desktop.
Save AndrewRadev/50e498e912fd274a787d408d6d7d28f0 to your computer and use it in GitHub Desktop.
Highlight ranges as you type them, proof-of-concept
" Save in ~/.vim/plugin/range_highlight.vim
augroup range_highlight
autocmd!
autocmd CmdlineChanged : call s:RangeHighlight()
autocmd CmdlineLeave : call s:RangeClear()
augroup END
let s:match_id = 0
function! s:RangeHighlight() abort
let command_line = getcmdline()
let start_line = 0
let end_line = 0
let two_lines_pattern = '^\(\d\+\),\(\d\+\)'
let single_line_pattern = '^\d\+'
if command_line =~ two_lines_pattern
let [_match, first, second; _rest] = matchlist(command_line, two_lines_pattern)
let start_line = str2nr(first)
let end_line = str2nr(second)
elseif command_line =~ single_line_pattern
let start_line = str2nr(matchstr(command_line, single_line_pattern))
let end_line = start_line
endif
if start_line > 0 && end_line > 0 && start_line <= end_line
call s:RangeClear()
let s:match_id = matchadd('Visual', '\%' .. start_line .. 'l\_.*\%' .. end_line .. 'l')
redraw
endif
endfunction
function! s:RangeClear() abort
if s:match_id > 0
call matchdelete(s:match_id)
let s:match_id = 0
endif
endfunction
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment