/dev/blog
Bez Hermoso, Software Engineer @ Square
If you are writing a custom function in Vimscript that operates on a range,
you may not want to rely on the '<,'>
range to get the visual selection
because it can also refer the previous selection which you are no longer
interested in.
To ensure that you are only operating on the current visual selection, mark
your function as a range function by adding range
after the argument list:
"Convert GitHub-Flavored Markdown syntax-highlighting to Liquid syntax-highlighting.
function! ConvertToLiquidHighlighting() range
silent! execute a:firstline . "," . a:lastline . 's/^```\([a-z]\+\)$/{% highlight \1 %}/g'
silent! execute a:firstline . "," . a:lastline . 's/^```$/{% endhighlight %}/g'
endfunction
"Convert within visual selection
vnoremap <leader>H :call ConvertToLiquidHighlighting()<cr>
"Convert entire file
nnoremap <leader>H :0,$call ConvertToLiquidHighlighting()<cr>
With the range
keyword in place, the a:firstline
and a:lastline
will be available within
the function and will contain the line numbers of
the current visual selection’s first line and the last line, respectively.
:help func-range
for more info.