我一直想这样做,有时候,当我打开文件时,我希望能够以不同的颜色突出显示某些行号。例如,假设我的LineNr为蓝色,而我当前的LineNr为红色。假设我在第25行上,是否可以将第28-30行的LineNr颜色更改为绿色而无需离开当前行?
答案 0 :(得分:1)
作为一个快速的答案,如果您不介意一次仅由最多8个亮点组成的组突出显示,则可以使用matchaddpos({group}, {pos})
函数并创建命令以将highlight
组应用于一排线。
command! -range -nargs=1 -complete=highlight HiLine call matchaddpos(<f-args>, range(<line1>,<line2>))
例如,您可以使用哪种突出显示为'cursorline'
:
:28,30HiLine CursorLine
请注意,高亮组的自变量适用补全。
要删除以前突出显示的行组,可以删除包含特定行的行。除了遍历所有getmatches()
字典和matchdelete({id})
包含'posX'
键之一的行的字典之外,我找不到更简单的方法:
function! s:RemoveMatchOnLine(line) abort
for l:match in getmatches()
let l:matchlines = values(filter(copy(l:match), 'v:key =~# ''pos\d\+'''))
if index(l:matchlines, [a:line]) >= 0
call matchdelete(l:match['id'])
endif
endfor
endfunction
command! -nargs=? LoLine call <SID>RemoveMatchOnLine(<q-args> ? <q-args> : line('.'))
现在,您可以:LoLine
撤消当前行附近行上的突出显示,或者可以给它指定一个参数以指定另一行,因此您不必将光标移到那里:{{1 }}。
最后,您可以设置映射:
:LoLine 28
在正常模式下键入nnoremap <leader>hi :HiLine CursorLine<CR>
xnoremap <leader>hi :HiLine CursorLine<CR>
nnoremap <leader>hc :<c-u>execute 'LoLine ' . v:count<CR>
将会突出显示光标中的[count]<leader>hi
行。并且count
将删除行[count]<leader>hc
的组上的突出显示。
我们可以使用count
在更大的范围内工作,使用matchadd({group}, {pattern})
来匹配行\%xl
。将x
替换为
call matchaddpos(...
以及该函数的第2行和第3行
execute 'call matchadd(<f-args>, ''\%'.<line1>.'l\(.*\n\)\+\%'.(<line2>+1).'l'')'
但是对我来说,它在较大范围内中断,我希望拥有第一个似乎更可靠的解决方案。