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

时间:2019-08-12 18:07:21

标签: vim vim-plugin vim-syntax-highlighting

我一直想这样做,有时候,当我打开文件时,我希望能够以不同的颜色突出显示某些行号。例如,假设我的LineNr为蓝色,而我当前的LineNr为红色。假设我在第25行上,是否可以将第28-30行的LineNr颜色更改为绿色而无需离开当前行?

1 个答案:

答案 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'')'

但是对我来说,它在较大范围内中断,我希望拥有第一个似乎更可靠的解决方案。