特定の範囲にマッチする正規表現

textobj の範囲を視覚的に確認したかったのでちょっと書いてみた。

[ソース]

function! s:region_regex(first, last)
    if a:first == a:last
        return printf('\%%%dl\%%%dc', a:first[0], a:first[1])
    elseif a:first[0] == a:last[0]
        return printf('\%%%dl\%%>%dc\%%<%dc', a:first[0], a:first[1]-1, a:last[1]+1)
    elseif a:last[0] - a:first[0] == 1
        return  printf('\%%%dl\%%>%dc', a:first[0], a:first[1]-1)
\       . "\\|" . printf('\%%%dl\%%<%dc', a:last[0], a:last[1]+1)
    else
        return  printf('\%%%dl\%%>%dc', a:first[0], a:first[1]-1)
\       . "\\|" . printf('\%%>%dl\%%<%dl', a:first[0], a:last[0])
\       . "\\|" . printf('\%%%dl\%%<%dc', a:last[0], a:last[1]+1)
    endif
endfunction

echo s:region_regex([2,2], [4, 2])
echo s:region_regex([2,2], [2, 5])
echo s:region_regex([1,1], [1, 1])
echo s:region_regex([1,4], [2, 6])

[出力]

\%2l\%>1c\|\%>2l\%<4l\|\%4l\%<3c
\%2l\%>1c\%<6c
\%1l\%1c
\%1l\%>3c\|\%2l\%<7c


だいぶごちゃごちゃしていますが、要は \%l と \%c を組み合わせて正規表現を生成しています。