Używam Vima. Otwieram plik. Edytuję go i chcę zobaczyć, co edytowałem, zanim go zapiszę.
Jak mogę to zrobić w Vimie?
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Oto funkcja i polecenie pozwalające zobaczyć różnicę między aktualnie edytowanym plikiem a jego niezmodyfikowaną wersją w systemie plików. Po prostu umieść to w swoim vimrc lub w katalogu wtyczek, otwórz plik, wprowadź modyfikacje bez ich zapisywania i zrób
:DiffSaved
.function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
Aby wyjść z widoku różnic, możesz użyć
:diffoff
polecenia.Poniżej podobna funkcja, przystosowana do naśladowania
'cvs diff'
polecenia ...
:w !diff % -
lepszą, gdy używasz vima na ciągle zmieniającej się i dużej liczbie pudełek, dla których nie możesz łatwo zmienić .vimrc? (Pod warunkiem, że mają zainstalowany diff.)źródło
diff
.%
odnosi się do aktualnie otwartej ścieżki do pliku. Dlaczego to wszystko jest argumentem dla:w
polecenia? W jaki sposób-
zostaje przypisany do zawartości bufora roboczego? Czy w vimie jest to automatyczne, że zawartość bufora (a może określony zakres w buforze) jest przypisywana do stdin dla poleceń powłoki?:w
ponieważ zapisujemy plik do polecenia (onstdin
). W poleceniu-
mówi mu, aby czytałstdin
.:w !git diff % -
dla wersji kolorowanej, jeśli masz zainstalowany git!fatal: bad flag '-' used after filename
podczas uruchamiania:w !git diff % -
.Ponieważ niektórzy pytali o wyjaśnienie polecenia
Oto moja próba napisania bardziej szczegółowej odpowiedzi:
Jestem zakładając, że użytkownik pracuje w systemie z
cat
iecho
zainstalowany (np prawie każdy GNU / Linux, Mac OS, BSD i innych systemów UNIX-like).Powyższe polecenie działa w następujący sposób:
Składnia zapisywania pliku w vimie to:
Składnia wykonywania polecenia powłoki w vimie to:
Wewnątrz środowiska powłoki wydanego przez vima
%
zdarza się wskazać aktualną nazwę pliku. Możesz to sprawdzić, wykonując następujące czynności:Powinno to wypisać nazwę pliku (lub błąd, jeśli vim został uruchomiony bez nazwy pliku).
Używając cat możemy również wypisać zawartość pliku:
Powinno to zwrócić zawartość plików w ostatnim zapisanym stanie lub błąd, jeśli nigdy nie została zapisana.
Program diff potrafi czytać ze standardowego wejścia (stdin). Jego strona podręcznika zawiera następujące informacje:
Wykonanie polecenia zapisywania bez nazwy pliku, ale raczej polecenia powłoki za nim powoduje, że vim zapisuje zawartość plików na stdin powłoki zamiast zapisywać je w pliku fizycznym. Możesz to zweryfikować, wykonując
Powinno to zawsze drukować bieżącą zawartość plików (która zamiast tego została zapisana do pliku).
Składanie go razem (lub tl; dr): plik jest „zapisywany” na stdin, diff jest uruchamiany z nazwą pliku i standardowym wejściem jako wejściem.
Wiedząc o tym, można również porównać pliki z vimdiff robiąc coś takiego - to tylko pomysł, którego nie chcesz robić:
(Następnie otwórz tylko do odczytu i zamknij vimdiff za pomocą
:qall
)źródło
vim - -c ":vnew $1 |windo diffthis"
, uczynienie go wykonywalnym, zapisanie go w PATH, jak na przykład,vimdiffWithStdin
a następnie porównanie z następującym poleceniem w vimie::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Nie wiem, czy podobna sztuczka dotyczy okien.Zawsze lubię różnice - ładne, proste, działa.
źródło
:DiffChangesDiffToggle
.z vimrc_example.vim:
źródło
w !diff % -
jest to, że działa na zdalnych źródeł zbyt (na przykład:vim sftp://example.com/foo.txt
)Skorzystaj z następującego źródła i użyj polecenia: DIFF
źródło
Nie jest to dokładnie to, czego szukasz, ale SCMDiff.vim jest naprawdę fajny. Jedno naciśnięcie klawisza i różnicuje bieżący plik z wersją główną w repozytorium kontroli źródła. Ma współpracować z wieloma systemami SCMS. Używam go z konieczności.
źródło
Istnieje wtyczka oparta na różnych odpowiedziach tutaj: https://github.com/gangleri/vim-diffsaved
Dostarcza
:w !diff % -
metody i bardziej zaangażowanejdiffthis
.Poza tym undotree pozwala na to również, ale także znacznie więcej (różnice między różnymi punktami kontrolnymi cofania). Podobny do Gundo .
źródło
Mogę polecić histwin wtyczkę .
Chociaż nie różni się to od aktualnie zapisanej wersji pliku (podobnie jak inne odpowiedzi), może zmienić vimdiff od czasu rozpoczęcia edycji , a nawet odtworzyć zmiany w kolejności. Różnica pokazuje, czy oszczędzasz w międzyczasie.
Dodatkowo wyświetla listę wszystkich cofniętych gałęzi historii i umożliwia przełączanie lub różnicowanie między nimi.
PS: Chociaż wtyczka nie śledzi automatycznie momentów w historii edycji od każdej zmiany pliku, możesz jawnie „oznaczyć” moment, w którym zapisujesz plik, aby móc później z nim vimdiff, jeśli chcesz. Może można to zautomatyzować?
źródło
Jeśli chcesz użyć vim do porównania, tak jak w vimdiff, możesz zrobić coś takiego:
Edytuj swój plik .vimrc i dodaj:
Od tego momentu zobaczysz swoje zmiany i możesz wyjść z widoku różnic za pomocą
qall
podobnie jak w vimdiff, naciskając F8 w trybie poleceń. Zastąp F8 dowolnym kluczem.Edycja: Dodano -M, aby zabronić jakiejkolwiek modyfikacji, ponieważ nie jest zapisywana.
źródło
Vim: Error reading input, exiting...
jakieś pomysły co tu jest nie tak?git obsługuje następujące polecenie
:w !git diff --no-index -- % -
zamapuj go na polecenie, dodając następujący kod do pliku ~ / .vimrc
command GitDiff execute "w !git diff --no-index -- % -"
Teraz wykonanie
:GitDiff
staje się poręcznym małym poleceniem do szybkiego pokazania różnic przed każdym zapisem.źródło
Możesz sprawić, że vim utworzy ostatnią kopię zapasową i oryginalną kopię zapasową za pomocą:
Następnie możesz je otworzyć w podziale:
A stamtąd:
Jeśli nie masz resztek, ale chcesz vimdiff, możesz również zrobić:
a następnie wykonaj: diffthis na każdym splicie
źródło
Zmiany właśnie edytowany [ bufor ], czyli tych, które różnią się od ostatniej zapisanej wersji (w pracy dir ectory), mogą się różnić z ostatniej wersji indeksu ( Git ). Zmapowałem oba:
Przykład vimdiff vs Gdiff.
Ponadto do łatwego
vimdiff
pliku homonimów w innej ścieżce:źródło
Gdiff
jeśli to możliwe, a inaczej (np. Nie projekt Git), a następnie wykonaj:vimdiff
. Ztry-catch-endtry
. Ale w ten sposób:DiffWithSaved
w projekcie Git brakuje.Postępuj zgodnie z powyższymi sugestiami, że używam git diff, który bardzo mi się podoba:
źródło