Szybszy sposób przenoszenia bloku tekstu

25

Oto jak zwykle kopiuję blok tekstu lub kodu:

  1. Wybierz blok za pomocą trybu Visual ( V) i usuń go za pomocą d; lub jeśli jest to tylko jedna linia, po prostu użyj dd.
  2. Idź tam, gdzie chcę być tekst, jestem zbyt głupi, żeby pamiętać o różnicy między pi Ptak mam to prawo o 50% czasu. (jeśli się mylę: spróbuj ponownie).
  3. Czasami wcięcie wymaga dostosowania, więc ponownie przechodzę do trybu wizualnego Vi ponownie wybieram ten sam blok i używam go >lub <naprawiam.

Czy istnieje prostszy sposób? W niektórych edytorach widziałem, że możesz „podnieść” blok tekstu i przenieść go; oto przykład z Emacsa (ale widziałem to również w innych edytorach):

Emacs

A może istnieje inny (jeszcze lepszy) sposób?

Martin Tournoij
źródło
Jeśli chodzi o problem z wcięciem, możesz go rozwiązać, wklejając ]plub [pzamiast, plub P. W ten sposób blok, który wklejasz, będzie automatycznie wcięty.
Gonçalo Ribeiro
Możesz obejrzeć screencast autorstwa Drew Neila Bubblinga Text, który zaleca używanie vim-unimpaired .
Hotschke,

Odpowiedzi:

13

Jest do tego wtyczka: dragvisuals.vim .

Domyślnie nie wiąże żadnych kluczy, więc musisz to zrobić sam. Lubię mapować je na Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Jest również wyposażony w klucz bonusowy do zduplikowania bieżącego wyboru:

xmap <expr> D DVB_Duplicate()

Zalety tej wtyczki w porównaniu z innymi odpowiedziami:

  • Nie powoduje zniknięcia tekstu, jeśli spróbujesz przejść wyżej niż pierwsza linia.
  • Rozszerzy plik, jeśli przejdziesz poniżej ostatniego wiersza.
  • Poruszanie się w lewo / w prawo działa nieco lepiej.

Kolejną przydatną sztuczką, która to uzupełnia, są następujące skróty klawiszowe:

xnoremap > >gv
xnoremap < <gv

Spowoduje to ponowne wybranie ostatniego wyboru wizualnego po użyciu >w trybie Wizualnym, dzięki czemu można łatwiej dostosować wyrównanie (możesz także użyć klawiszy strzałek, ale spowoduje to przesunięcie o jedną postać, a nie o jedną shiftwidth).

Jay Thompson
źródło
1
Istnieje inna wtyczka, którą autor mojej sugerowanej wtyczki opisuje jako „znacznie ulepszoną przeróbkę moich dragvisuals.vim”: github.com/zirrostig/vim-schlepp
Jay Thompson
8

W kroku 3 możesz gv=zamiast tego użyć ( =oznacza wcięcie i gvoznacza „ponownie zaznacz ostatni wybór wizualny”).

W przypadku zachowania Emacsa dodanie mapowań do pliku .vimrc byłoby dość proste:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Następnie możesz używać klawiszy strzałek w górę i w dół, aby poruszać się po wizualnym zaznaczeniu linii. (Oczywiście możesz mapować także na różne klucze, jeśli nie znosisz strzał).

(Można to zrobić przy normalnym wyborze wizualnym i przesuwając je również w lewo i prawo: vnoremap <left> dhPgvhohoi vnoremap <right> dpgvlolo.)

Klamka
źródło
gvprzechodzi do ostatniego wyboru wizualnego, którym w tym przypadku byłby akapit, który został usunięty. czego mi brakuje?
Robert Smith
4

Możesz zmienić przypisanie niektórych klawiszy, aby przesuwać linie. Na przykład strzałki w górę i w dół, jeśli jesteś przyzwyczajony do poruszania się hjkl.

Np. Na .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, normalne polecenie przesunięcia linii

+1lub -2aby wskazać linię w górę lub w dół (-1 utrzymuje linię w tym samym miejscu)

gvaby ponownie wybrać ten sam tekst w VISUALtrybie

To rozwiązanie nie koliduje z rejestrami, więc każdy skopiowany tekst będzie nadal dostępny, a także ponownie sformatować kod, aby ustawić właściwe wcięcia itp.

Khelben
źródło
Jest to miłe, ale nie dla mnie, ponieważ nie lubię go używać =(często zmienia zbyt wiele niepowiązanego formatowania).
Martin Tournoij
3

Jest kilka wtyczek do tego, ale wolę vima- unimpaired Tima Pope'a ( github ) (Ingo Karkat LineJuggler jest podobny).

Wizualnie wybierasz blok tekstu, a następnie robisz ]e(e w celu wymiany), aby przesunąć blok w dół ( [ew innym kierunku). Użyj, .aby powtórzyć czynność (Masz zainstalowany program repeat.vim , prawda). Jeśli pójdziesz za daleko, po prostu cofnij za pośrednictwem u.

Teraz osobiście myślę pi Psą tak powszechnymi poleceniami, że najlepiej byłoby się ich nauczyć przed stworzeniem złych nawyków. Następnie możesz użyć ]pdo wklejenia tego samego wcięcia. Jeśli używasz niezniszczonego, możesz zrobić to, >paby wkleić poziom wcięcia głębiej lub =pwkleić i sformatować.

Jeśli masz trudności w zapamiętywaniu p, a Pto może pomóc myśleć o nich w kategoriach oi Opoleceń, które jest rodzajem symetrii.

Jak zauważyli inni, możesz użyć gvdo ponownego wyboru selekcji wizualnej. Jeśli jednak umieścisz / wkleisz tekst, stracisz swój wybór wizualny. Nie denerwuj się, ponieważ każda zmiana (i szarpnięcie!) Zostanie ustawiona '[i ']wokół zmienionego obszaru. Możesz więc wcinać za pomocą >'](czytaj: przesuń w prawo do końca ostatniej zmiany) i użyj, .aby powtarzać wcięcie, dopóki tekst nie znajdzie się we właściwym miejscu.

Aby uzyskać więcej pomocy, zobacz:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
Peter Rincker
źródło
2

Jeśli znasz numer wiersza, do którego chcesz przenieść blok tekstu, możesz użyć zakresu lub zaznaczenia wizualnego za pomocą :movepolecenia, aby przenieść tam blok tekstu .

Na przykład, jeśli mam następujący plik:

1 aaa
2 bbb
3 ccc
4 ddd

i chcę przesunąć linię a po linię c, umieszczam kursor na linii a i wchodzę :m3, a następnie linia jest przesuwana.

Działa to również z przesunięciami +/-. W powyższym przykładzie można osiągnąć ten sam wynik, :m+2przesuwając linię o 2 linie w dół.

W przypadku bloków tekstu jedyną różnicą jest dodanie zakresu lub zaznaczenia. Aby przenieść linie aaa i bbb na koniec pliku, użyj polecenia takiego jak :1,2m$($ = ostatnia linia) lub wizualnie wybierz linie i :m$.

Kupa
źródło
1
Aby uzyskać więcej wskazówek, :movezobacz także vim.wikia.com/wiki/Moving_lines_up_or_down lub Tip 29 Duplikuj lub przenieś linie za pomocą poleceń „: t” i „: m” w książce Practical Vim autorstwa D. Neila.
Hotschke,