vim使用外部文件上的行号高亮显示行

vim使用外部文件上的行号高亮显示行,vim,highlight,Vim,Highlight,我有两个文本文件,一个是我当前正在处理的文件,另一个包含行号列表。我想做的是突出显示第一个文件中的行,其中行号与后一个匹配 例如: 文件1: I like eggs I like meat I don't like eggplant My mom likes chocolate I like chocolate too 2 4 文件2: I like eggs I like meat I don't like eggplant My mom likes chocolate I like ch

我有两个文本文件,一个是我当前正在处理的文件,另一个包含行号列表。我想做的是突出显示第一个文件中的行,其中行号与后一个匹配

例如:

文件1:

I like eggs
I like meat
I don't like eggplant
My mom likes chocolate
I like chocolate too
2
4
文件2:

I like eggs
I like meat
I don't like eggplant
My mom likes chocolate
I like chocolate too
2
4
在此示例中,应突出显示这些行:

I like meat
My mom likes chocolate
谢谢

您可以使用
readfile()
读入行号,然后将它们转换为与这些行号匹配的正则表达式(例如
\%42l
)。突出显示可以通过
:match
matchadd()
完成

下面将所有这些压缩为一个自定义的
:MatchLinesFromFile
命令:

":MatchLinesFromFile {file}
"           Read line numbers from {file} and highlight all those
"           lines in the current window.
":MatchLinesFromFile    Remove the highlighting of line numbers.
"
function! s:MatchLinesFromFile( filespec )
    if exists('w:matchLinesId')
        silent! call matchdelete(w:matchLinesId)
        unlet w:matchLinesId
    endif
    if empty(a:filespec)
        return
    endif

    try
        let l:lnums =
        \   filter(
        \   map(
        \       readfile(a:filespec),
        \       'matchstr(v:val, "\\d\\+")'
        \   ),
        \   '! empty(v:val)'
        \)

        let l:pattern = join(
        \   map(l:lnums, '"\\%" . v:val . "l"'),
        \   '\|')

        let w:matchLinesId = matchadd('MatchLines',  l:pattern)
    catch /^Vim\%((\a\+)\)\=:E/
        " v:exception contains what is normally in v:errmsg, but with extra
        " exception source info prepended, which we cut away.
        let v:errmsg = substitute(v:exception, '^Vim\%((\a\+)\)\=:', '', '')
        echohl ErrorMsg
        echomsg v:errmsg
        echohl None
    endtry
endfunction
command! -bar -nargs=? -complete=file MatchLinesFromFile call <SID>MatchLinesFromFile(<q-args>)

highlight def link MatchLines Search
”:MatchLinesFromFile{file}
“从{file}中读取行号并突出显示所有行号
“当前窗口中的行。
“:MatchLinesFromFile删除行号的高亮显示。
"
函数!s:MatchLinesFromFile(filespec)
如果存在('w:matchLinesId')
静默!调用matchdelete(w:matchLinesId)
取消设置w:matchLinesId
恩迪夫
如果为空(a:filespec)
返回
恩迪夫
尝试
让我来说说=
\滤器(
\地图(
\readfile(a:filespec),
\'matchstr(v:val,\\d\\+“”)
\   ),
\“!empty(v:val)”
\)
让l:pattern=join(
\地图(l:lnums,“\\%”。v:val.“l”),
\   '\|')
设w:matchLinesId=matchadd('MatchLines',l:pattern)
catch/^Vim\%(\a\+)\=:E/
“v:exception包含v:errmsg中通常包含的内容,但带有额外的
“异常源信息已预先设置,我们将其删除。
让v:errmsg=substitute(v:exception,“^Vim\%(\a\+)\)\=:”,“,”)
echohl ErrorMsg
echomsg v:errmsg
无回声
末日
端功能
命令!-bar-nargs=?-complete=file MatchLinesFromFile调用MatchLinesFromFile()
突出显示def链接匹配线搜索