Jak mogę łatwo przesunąć linię?

47

Jakie jest polecenie (lub skrót), aby przesunąć linię w górę lub w dół w vimie? Mój obecny obieg pracy polega na szarpaniu (kopiowaniu) linii i usuwaniu tej linii, a następnie wstawianiu (wklejaniu) tej linii.

Vader
źródło
8
Ponieważ usuwanie faktycznie cięć można pominąć yank: ddkP, przesunięcie w dół jest łatwiejsze: ddp.
muru

Odpowiedzi:

52

Po pierwsze, nie musisz szarpać i usuwać; ten drugi umieści również usuniętą zawartość w rejestrze (domyślnym lub określonym). Dlatego ddp/ ddkPsą typowymi poleceniami do przesuwania linii o jeden w dół / w górę.

Alternatywnie możesz użyć :movepolecenia, tj. :move +1/ :move -2; nie blokuje to rejestru, a także można przenosić całe zakresy. Możesz łatwo zdefiniować kluczowe odwzorowania, aby to skrócić.

Jeśli nie masz nic przeciwko wtyczkom (i dodatkowemu komfortowi, który często się z nimi wiąże), zarówno nienaruszona wtyczka Tima Pope'a, jak i moja wtyczka LineJuggler zapewniają ]e/ mapują[e ruchy linii (i kilka innych; Tim do różnych zastosowań, mój koncentruje się na obsłudze linie)).

Ingo Karkat
źródło
36

Najłatwiej jest: :m+lub :m-2który jest skrótem, :movejak sugeruje Ingo.

Lub używając trybu wizualnego ( V), przecinając linię ( d/ x), a następnie wklej ją ( p- pod kursorem, Pnad kursorem) po przesunięciu kursora we właściwe miejsce przed wklejeniem (tak w skrócie to Vxp/ Vdp).

Przenosząc wiele linii w trybie wizualnym, musisz użyć :m '>+1(aby przesunąć jedną linię w dół) lub :m '<-2(aby przesunąć jedną linię w górę).


Oto przykładowe przydatne mapowanie ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

który jest podobny do Sublime Text ( Win / OSX ).

Oto kilka sugestii na vim wiki :

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

W trybie normalnym lub w trybie wstawiania naciśnij Alt-j, aby przesunąć bieżącą linię w dół, lub naciśnij Alt-k, aby przesunąć bieżącą linię w górę.

Po wizualnym wybraniu bloku linii (na przykład naciśnięciu V, a następnie przesunięciu kursora w dół), naciśnij Alt-j, aby przesunąć cały blok w dół, lub naciśnij Alt-k, aby przesunąć blok w górę.

Zobacz też:

kenorb
źródło
2
+1 dla linku wiki Vima. Nauczyłem się tam kilku rzeczy.
Gonçalo Ribeiro
Nie wiem dlaczego, ale działają bardzo dobrze w Gvim, ale nie działają zgodnie z oczekiwaniami w terminalu vim. (Wygląda na to, że to jest problem z tmux)
CodyChan
11

Jeśli chcę zamienić jedną linię z linią powyżej, zwykle wykonuję następujące czynności

ddkP

Wyjaśnienie

  • dd usunie linię i doda ją do rejestru domyślnego.
  • k przesunie się w górę linii (j przesunie się w dół linii)
  • P wklei powyżej bieżącej linii
venkatvb
źródło
3
Aby przesunąć bieżącą linię w dół, użyjddp
Qinjie
4

FWIW, oto, czego używałem od lat. Przesuwa bieżącą linię w górę i w dół w trybie normalnym lub wybór w trybie wizualnym, automatycznie dostosowując wcięcie.

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
romainl
źródło