我一直想这样做一段时间,有时当我打开文件时,我希望能够将某些行号突出显示为不同的颜色。例如,假设我的 LineNr 是蓝色的,而我的当前 LineNr 是红色的。假设我在第 25 行,无论如何我可以在不离开当前行的情况下将第 28-30 行的 LineNr 颜色更改为绿色吗?
作为快速答案,如果您不介意一次仅按最多 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 =~# ''posd+'''))
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
撤消当前行附近行的突出显示,也可以为其提供一个参数以指定另一行,这样您就不必将光标移动到那里::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(...
替换为
execute 'call matchadd(<f-args>, ''%'.<line1>.'l(.*n)+%'.(<line2>+1).'l'')'
以及函数的第 2 行和第 3 行
let l:a = matchlist(get(l:match,'pattern',''), '^\%(d+)l.*\%(d+)l$')
if !empty(l:a) && l:a[1] <= a:line && a:line <= l:a[2]
但对我来说,它在大范围内中断,我宁愿拥有第一个看起来更强大的解决方案。