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

如何在Vim中更改特定行号颜色,vim,vim-plugin,vim-syntax-highlighting,Vim,Vim Plugin,Vim Syntax Highlighting,我想这样做已经有一段时间了,有时当我打开一个文件时,我希望能够以不同的颜色突出显示某些行号。例如,假设我的LineNr为蓝色,而我当前的LineNr为红色。假设我在第25行,我是否可以在不离开当前行的情况下将第28-30行的LineNr颜色更改为绿色?作为一个快速回答,如果您不介意一次最多按8个对齐的组高亮显示,您可以使用matchaddpos({group},{pos})函数并创建一个命令,将高亮显示组应用于一系列行 command! -range -nargs=1 -complete=hig

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

作为一个快速回答,如果您不介意一次最多按8个对齐的组高亮显示,您可以使用
matchaddpos({group},{pos})
函数并创建一个命令,将
高亮显示组应用于一系列行

command! -range -nargs=1 -complete=highlight HiLine call matchaddpos(<f-args>, range(<line1>,<line2>))
请注意,补全适用于突出显示组的参数

要删除先前高亮显示的一组线,可以删除包含特定线的线。我找不到比检查所有
getmatches()
dicts和
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('.'))
在正常模式下键入
[count]hi
将突出显示光标上的
count
行。而
[count]hc
将删除行组
count
上的突出显示

补遗 我们可以使用
matchadd({group},{pattern})
在更大范围内工作,使用
\%xl
匹配行
x
。将调用matchaddpos(…
替换为

execute 'call matchadd(<f-args>, ''\%'.<line1>.'l\(.*\n\)\+\%'.(<line2>+1).'l'')'
execute'callmatchadd(,'\%'..'l\(.*\n\)\+\%.(+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]
让l:a=matchlist(get(l:match,'pattern','','^\\\%\(\d\+\)l.\\\%\(\d\+\)l$)

如果!为空(l:a)&&l:a[1]您可能希望显示使用范围为OP@D.BenKnoble对,已编辑。您知道为什么正则表达式匹配不能很好地用于长范围吗?例如
:%HiLine…
在缓冲区的中间部分不能很好地工作,或者在顶部,它突出显示当前视图,但向下移动,没有突出显示任何内容,等等…可能是短的再次使用正则表达式来突出显示
execute 'call matchadd(<f-args>, ''\%'.<line1>.'l\(.*\n\)\+\%'.(<line2>+1).'l'')'
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]