Jak mam tylko dp lub tylko linie, a nie cały blok w Vim diff?

28

Obecnie używam opcji menu „Split Diff by ...” MacVima (Snapshot 64).

Plik jest mój Django settings.pyod wersji 1.3.1 do świeżego pliku od wersji 1.4.

Zrzut ekranu

Znam dwa podstawowe polecenia

  1. do „uzyskać” (i zastąpić) blok z drugiej strony.
  2. dp „umieścić” (i wymienić) blok na drugą stronę.

Ale te dwa polecenia zapisują cały blok, który w MacVimie jest fioletowymi pasemkami.

Jeśli spojrzysz na 2. blok, zobaczysz, że z linii 2 i 3 są tylko 2 różne słowa: mysitei hobbes3. Chcę tylko zastąpić wiersz, a nie cały blok.

Więc jakie jest polecenie do zamiany do doi dpna linię w przeciwieństwie do całego bloku, czy też muszę go ręcznie wpisać?

Pytanie bonusowe : Zauważyłem, że kiedy ręcznie edytuję blok, tracę fioletowe podświetlenie. Jak „odświeżyć” plik różnicowy, aby uwzględnić podświetlenia bez ponownego otwierania pliku?

Staraj się zachować odpowiedzi Vim-general w przeciwieństwie do MacVim-a.

hobbes3
źródło

Odpowiedzi:

30

Można to zrobić na wiele sposobów.

  1. Wybierz zakres linii w buforze docelowym, który chcesz uzyskać z bufora źródłowego i użyj :diffget. Na przykład możesz wizualnie wybrać zakres linii za pomocą V, a następnie wpisać :diffget.
  2. Wybierz zakres linii w buforze źródłowym, który chcesz umieścić w buforze docelowym i użyj :diffput. Na przykład, aby umieścić bieżącą linię w drugim buforze, wpisz :.diffput.
  3. Użyj szarpnięcia i włóż. Wybierz zakres linii w buforze źródłowym, który chcesz skopiować do bufora docelowego, pociągnij je za pomocą Y, przesuń kursor do bufora docelowego i umieść je w żądanym miejscu za pomocą plub P, a następnie usuń niepotrzebne linie.
  4. Yank jak wyżej, ale w buforze docelowym wybierz wizualnie zakres linii, które chcesz zastąpić (niekoniecznie taką samą liczbę linii) i wpisz "0p. Korzysta z rejestru 0 (zero), który zawsze zawiera tekst ostatniego szarpnięcia.

Aby „odświeżyć” wyświetlacz, aby pokazać właściwe podświetlenie, wykonaj :diffupdatelub po prostu :diffu. Czasami to nie wystarcza i musisz przesunąć kursor do drugiego okna, aby zakończyć odświeżanie.

Możesz przeczytać więcej o kopiowaniu różnic

:help copy-diffs
garyjohn
źródło
3

Chciałem również zmodyfikować jedną linię w danym momencie podczas różnicy. Więc stworzyłem prostą mapę i umieściłem je w moim pliku vimrc.

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

Możesz użyć do zamiast dg, ale bardziej przyzwyczajam się do myślenia „diffget” zamiast [o] btain.

Dla twojej premii po prostu dwukrotnie korzystam z innej prostej mapy:

nnoremap <silent> <leader>df :call DiffToggle()<CR>

Teraz df wyłączy / włączy tryb diff, więc po prostu wyłączam go i włączam ponownie.

A dodatkową opcją jest dodanie

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

Pozwoli ci to cofnąć literówkę lub niechcianą zmianę w innym pliku / oknie, ponieważ: cofnij po prostu cofniesz tylko zmianę w bieżącym oknie.

lucky85dog
źródło