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?

Bartłomiej Semańczyk
źródło
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
Sven Marnach
źródło
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

Panie Eigenbart
źródło
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.

Andrey Orst
źródło
3

Przykład:

  1. one
> 2. two

z :m-2przełącznikiem (bieżąca linia - 2)

> 2. two
  1. one

z :m+1przełącznikiem (bieżąca linia + 1)

  1. one
> 2. two

Możesz to zmapować, jeśli chcesz.

cjadeveloper
źródło
1
To jest lepsza odpowiedź niż odpowiedź domyślna
Alex Bin Zhao
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.

ojosilva
źródło