Jak zamienić dwie linie w vimie?


99

Mam to:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

Chcę to uzyskać:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

Czy istnieje sposób, aby to zrobić w szybki sposób za pomocą skrótów klawiaturowych?


Możesz rozważyć użycie innego edytora, jeśli nie znasz Vima. Można skonfigurować edytor git tylko stosując albo git config --global core.editor <whatever>, albo do wielu rzeczy na raz (w tym git), włączając export EDITOR=<whatever>w twojej .bashrc.
Sven Marnach

Odpowiedzi:


168

Aby zamienić bieżącą linię z następną, wpisz ddpw trybie poleceń.

  • dd - usuń linię (faktycznie nazywaną wycięciem w innych edytorach) i zapisz ją w rejestrze
  • p - wklej linię z rejestru

3
Przesuń kursor do pierwszego wiersza, a następnie wpisz ddp. Jeśli nie jesteś jeszcze w trybie poleceń, naciśnij, Escaby przejść do trybu poleceń.
Sven Marnach

32
ddusuwa bieżącą linię po skopiowaniu jej do „rejestru”. pkopiuje ("umieszcza") zawartość rejestru do twojego bufora po bieżącej linii. Podobnie możesz zamienić dwa znaki za pomocą xplub dwa słowa za pomocą dwwP.
Keith Thompson

@KeithThompson, niestety, nie jest tak łatwo zamienić dwa słowa.
CS

@CS Czy masz na myśli fakt, że dwwPnie działa to w ten sam sposób, jeśli dwa słowa znajdują się na końcu linii? (A zamiana ostatniego słowa w jednym wierszu z pierwszym słowem w następnym jest jeszcze trudniejsza.)
Keith Thompson,

1
@KeithThompson yeah, chociaż poczułem się trochę źle po komentarzu, ponieważ to dosłowny przypadek;)
CS

54

ddusuwa bieżącą linię, a następnie możesz wkleić usuniętą linię za pomocą p. Jest inny sposób używania m. Za pomocą mmożna przesuwać linie np

:m 1 przeniesie bieżącą linię po linii 1

:m 0 przeniesie bieżącą linię na górę

:m $ przeniesie bieżącą linię na dół

W twoim przykładzie umieść kursor w pierwszym wierszu i wpisz :m $

Więcej informacji: http://vim.wikia.com/wiki/Moving_lines_up_or_down


1
Dziękuję za wyjaśnienie dla non vim "tubylców" :-)
Bruno Bieri

2
To jest odpowiedź, której szukałem, aby poszerzyć swoją wiedzę o vimie.
Phemelo Khetho

Dzięki! To jest odpowiedź, której szukałem. Może to być jeszcze wygodniejsze podczas przesuwania wielu linii jednocześnie w trybie wizualnym.
Kareem Jeiroudi

10

Pomimo tego, że pytanie jest dość stare i oznaczone jako udzielone, chciałbym rozszerzyć odpowiedź, mówiąc, że możesz użyć poleceń trybu normalnego, które zostały dostarczone przez Svena Marnacha w następujący nnoremapsposób:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Umożliwi to przenoszenie linii za pomocą Ctrl+ Upi Ctrl+ Downw pliku. Jednak spowoduje to nadpisanie @"rejestru, który przechowuje ostatnio skopiowany ciąg / słowo / literę / itd. Więc dodając komendy „(reg) przed ddi p, możemy to naprawić:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Tutaj dodajemy "aprzed usunięciem i wklejaniem poleceń, aby zapisać naszą linię w @arejestrze, więc domyślny rejestr kopii nie zostanie nadpisany. Jednak może nadpisać zawartość @arejestru (kto wie, ale możesz go użyć do czegoś ważnego w swoim przypadku użycia, ale ten krok jest nieco paranoiczny, możesz go pominąć, jeśli chcesz), naprawmy to również:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>potrzebne, aby zapobiec wyświetlaniu naszych poleceń w wierszu komunikatów na dole).

Teraz mamy dwa mapowania, które pozwalają nam przesuwać linie w pliku za pomocą skrótów klawiaturowych. Możesz przedefiniować przyciski, ja używam Alt+ j/ k, które byłyby <A-j>i <A-k>dla tych poleceń. Jednak nie wszystkie emulatory terminali obsługują odwzorowania klawiszy Alt AFAIK.



1

Mapowania proponowane na stronie wiki Vim są w rzeczywistości najlepszym sposobem na odwzorowanie kombinacji klawiszy, które emulują sposób, w jaki Sublime i inne edytory implementują tę funkcję.

Obejmuje to akcję wcięcia po ruchu, co jest również świetne (to podwójne ==znaki równości , na wypadek, gdybyś tego nie chciał).

Obsługuje również tryby wizualne i wstawiania , dzięki czemu można przesuwać linie podczas edycji lub za pomocą bloków.

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

Osobiście zamapowałem je na <D-J>i <D-K>na moim Macu, zamiast <A-mapować je na Altklucz. W ten sposób używam Cmd+ Shift+ j/ k, co jest bardziej naturalne dla moich palców.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.