3

2つのテキストファイルがあります。1つは現在作業中のファイルで、もう1つには行番号のリストが含まれています。私がやりたいのは、行番号が後者のファイルと一致する最初のファイルの行を強調表示することです。

例えば:

ファイル1:

I like eggs
I like meat
I don't like eggplant
My mom likes chocolate
I like chocolate too

File2:

2
4

この例では、これらの行を強調表示する必要があります。

I like meat
My mom likes chocolate

ありがとう!

4

1 に答える 1

5

を使用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
于 2012-12-03T08:56:20.083 に答える