Diese Lösung zeigt nicht den Unterschied zwischen den beiden Linien, sondern hebt sie hervor und ermöglicht es Ihnen, mit n
und N
wie folgt durch sie zu navigieren :
Fügen Sie dazu diese Funktion hinzu .vimrc
:
function! CompareLines(line1, line2)
let l1 = getline(a:line1)
let l2 = getline(a:line2)
let pattern = ""
for i in range(strlen(l1))
if strpart(l1, i, 1) != strpart(l2, i, 1)
if pattern != ""
let pattern = pattern . "\\|"
endif
let pattern = pattern . "\\%" . a:line1 . "l" . "\\%" . ( i+1 ) . "c"
let pattern = pattern . "\\|" . "\\%" . a:line2 . "l" . "\\%" . ( i+1 ) . "c"
endif
endfor
execute "let @/='" . pattern . "'"
set hlsearch
normal n
endfunction
Sie können die Funktion aufrufen, bei der :call CompareLines(1, 2)
die Argumente die Nummern der zu vergleichenden Zeilen sind.
So fügen Sie weitere Details zur Funktionsweise der Funktion hinzu:
- In den ersten Zeilen werden die zu vergleichenden Zeilen in einigen Variablen angezeigt.
Die Schleife durchläuft diese Zeichenfolgen. Jedes Zeichen der Zeichenfolgen wird verglichen und wenn sie nicht mit einem Muster des Formulars übereinstimmen \%Xl\%Yc
, wird der Variablen hinzugefügt, pattern
wobei X
und Y
die Zeile und die Spalte eines Zeichens sind.
(Siehe :h /ordinary-atom
und insbesondere die letzten Zeilen, in denen erklärt wird, dass das Muster \%23l
die Übereinstimmung mit der 23. Zeile und \%23c
der 23. Spalte zulässt. )
Sobald das Muster erstellt ist, wird es in das Suchregister eingefügt ( let @/=
erlauben Sie, den Inhalt des Registers zu definieren, und das Muster muss in Anführungszeichen gesetzt werden).
Schließlich set hlsearch
werden alle Übereinstimmungen des Musters hervorgehoben und normal n
der Cursor auf das erste andere Zeichen gesetzt.
Hinweis 1 Die Funktion ändert Ihren Suchverlauf.
Hinweis 2 Der Teil, der das Muster für die Suche verwendet, könnte wahrscheinlich erheblich verbessert werden.
Und als Bonus Fügen Sie diese Zeile zu Ihrer hinzu .vimrc
, um einen Befehl zu erstellen, der den Aufruf der Funktion beschleunigt:
command! -nargs=* CompLines call CompareLines(<f-args>)
Auf diese Weise können Sie einfach :CompLines 1 2
zwei Zeilen vergleichen.
BEARBEITEN Und hier ist eine verbesserte Version der Funktion und des Befehls. Der Unterschied besteht darin, dass Sie es auf drei verschiedene Arten aufrufen können:
:CL
unterscheidet die aktuelle Zeile und die folgende
:CL 23
unterscheidet die aktuelle Zeile und die Zeile 23
:CL 23 42
wird die Zeilen 23 und 42 unterscheiden
Hier ist der Code:
command! -nargs=* CL call CompareLines(<f-args>)
function! CompareLines(...)
" Check the number of arguments
" And get lines numbers
if len(a:000) == 0
let l1=line(".")
let l2=line(".")+1
elseif len(a:000) == 1
let l1 =line(".")
let l2 =a:1
elseif len(a:000) == 2
let l1 = a:1
let l2 = a:2
else
echom "bad number of arguments"
return;
endif
" Get the content of the lines
let line1 = getline(l1)
let line2 = getline(l2)
let pattern = ""
" Compare lines and create pattern of diff
for i in range(strlen(line1))
if strpart(line1, i, 1) != strpart(line2, i, 1)
if pattern != ""
let pattern = pattern . "\\|"
endif
let pattern = pattern . "\\%" . l1 . "l" . "\\%" . ( i+1 ) . "c"
let pattern = pattern . "\\|" . "\\%" . l2 . "l" . "\\%" . ( i+1 ) . "c"
endif
endfor
" Search and highlight the diff
execute "let @/='" . pattern . "'"
set hlsearch
normal n
endfunction
EDIT 2 Ich habe es zu einem Plugin gemacht . Sie können es mit einem normalen Plugin-Manager installieren mit (zB):
Plug 'statox/vim-compare-lines'