如何在 Vim 中更改特定的行号颜色



我一直想这样做一段时间,有时当我打开文件时,我希望能够将某些行号突出显示为不同的颜色。例如,假设我的 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]

但对我来说,它在大范围内中断,我宁愿拥有第一个看起来更强大的解决方案。

最新更新