Vim edycja wielowierszowa jak w sublimetext?


140

Zacząłem używać gvima i nie do końca rozumiem, jak działa edycja wielowierszowa w gvimie.

Na przykład:

Oryginalny tekst:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ wszystko jest zaznaczone, a następnie naciskam I, aby wykonać wstawkę wielowierszową.

Moim zamiarem jest wstawienie cudzysłowów jak w pierwszym wierszu, a następnie naciśnięcie Esc:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Co się stało? Spodziewałem się zachowania podobnego do tego w sublimetext:

wprowadź opis obrazu tutaj

Jeśli nie wiesz, jak to działa, po prostu powtarza akcje dla każdej linii. Jak to osiągnąć? A co tu robi vim?


Po prostu nagraj makro klawiatury, aby zmienić pierwszą linię, a następnie odtwórz makro dla wszystkich pozostałych linii.
— high5

Odpowiedzi:


223

Zrób sobie przysługę, upuszczając warstwę zgodności z systemem Windows.

Normalnym skrótem do wejścia w tryb Visual-Block jest <C-v>.

Inni zajmowali się nagrywaniem makr, oto kilka innych pomysłów:

Używa tylko trybu wizualnego blokowania .

  1. Umieść kursor na drugim słowie:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Naciśnij, <C-v>aby przejść do trybu blokowania wizualnego i rozszerz wybór w dół:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Uderz, I"<Esc>aby uzyskać:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. Umieść kursor na ostatnim znaku trzeciego słowa:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Naciśnij, <C-v>aby przejść do trybu blokowania wizualnego i rozszerz wybór w dół:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Uderz, A"<Esc>aby uzyskać:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Z trybem Visual-Block i Surround.vim .

  1. Umieść kursor na drugim słowie:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Naciśnij, <C-v>aby przejść do trybu blokowania wizualnego i rozszerz wybór w dół i w prawo:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Kliknij, S"aby otoczyć swój wybór „:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Z trybem linii wizualnej i :normal.

  1. Naciśnij, Vaby zaznaczyć całą linię i rozwinąć ją w dół:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Wykonaj to polecenie: :'<,'>norm ^wi"<C-v><Esc>eea"<CR>aby uzyskać:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]pozwala na wykonywanie poleceń trybu normalnego na szeregu linii ( '<,'>część jest dodawana automatycznie przez Vima i oznacza "działaj na wybranym obszarze")

    • ^ umieszcza kursor na pierwszym znaku wiersza

    • w przechodzi do następnego słowa

    • i"wstawia "przed kursorem

    • <C-v><Esc>jest sposobem Vima na wprowadzenie znaku sterującego w tym kontekście, tutaj jest <Esc>używany do wyjścia z trybu wstawiania

    • ee przechodzi na koniec następnego słowa

    • a"dodaje "po kursorze

    • <CR> wykonuje polecenie

    Używając Surround.vim, powyższe polecenie staje się

    :'<,'>norm ^wvees"<CR>
    

8
W przypadku kroków 4 i 5 radziłbym nacisnąć, gvaby przywrócić poprzedni wizualny wybór, a następnie przejść w poziomie, być może z 2e. (Im więcej linii, tym cenniejsze gv!)
— joeytwiddle

4
surround.vim używa małego sw trybie normalnym, ale dużego Sw trybie wizualnym, więc w kroku 3 metody surround.vim naciśnięcia klawiszy powinny byćS"
— joeytwiddle

1
Punkt 3 visual-block + Surround.vim powinien być S", a nies"
— zool

1
Zamiast wykonywania kroków 5 i 6 trybu Visual-Block możesz po prostu umieścić kursor po trzecim słowie i nacisnąć ..
— Jonas

2
To fajne, ale działa to tylko w niektórych przypadkach, gdy znaki, które chcesz edytować w różnych wierszach, znajdują się dokładnie w tej samej pozycji poziomej w każdym wierszu, a edytowane wiersze znajdują się jeden po drugim. Nie możemy wybrać, gdzie wejść w trybie edycji, w której linii w Vimie? Możemy w Sublimie ... EDYCJA: Właściwie druga odpowiedź jest tym, czego szukałem
— Alexandre Bourlier

30

To kilka dobrych, gotowych rozwiązań podanych powyżej, ale możemy również wypróbować niektóre wtyczki, które zapewniają wiele kursorów, takich jak Sublime.

Myślę, że ten wygląda obiecująco:

Przez jakiś czas wydawało się, że jest porzucony, ale w 2014 r. Miał swój wkład.

Jest dość potężny, chociaż trochę czasu zajęło mi przyzwyczajenie się do przepływu (który jest dość podobny do Sublime, ale nadal modalny jak Vim).

Z mojego doświadczenia wynika, że ​​jeśli masz zainstalowanych wiele innych wtyczek, możesz napotkać pewne konflikty!

Istnieje kilka innych prób tej funkcji:

Nie krępuj się edytować, jeśli zauważysz, że którykolwiek z tych elementów ulega poprawie.


Wygląda na to, że github.com/osyo-manga/vim-over jest obecnie najbardziej aktywną grupą.
— Wernight

Świetnie, właśnie tego szukałem
— Alexandre Bourlier

1
Po przetestowaniu większości z nich hlissner / vim-multiedit wydaje się najlepszym AFAIAC
— Alexandre Bourlier

1
Sprawdź mg979 / vim-visual-multi jako dobry zamiennik dla vim-multiple-cursors
— Mushex Antaranian

29

Jest na to kilka sposobów w Vimie. Nie wiem jednak, które są najbardziej podobne do Sublime Text.


Pierwszym byłby tryb wstawiania wielowierszowego . Umieść kursor na drugim „a” w pierwszym wierszu, naciśnij Ctrl-V, zaznacz wszystkie wiersze, a następnie naciśnij Ii wstaw podwójny cudzysłów. Naciśnięcie <esc>spowoduje powtórzenie operacji na każdej linii.


Drugi to makra. Umieść kursor na pierwszym znaku i zacznij rejestrować makro za pomocą qa. Idź w prawo za pomocą llll, wejdź w tryb wstawiania za pomocą a, umieść podwójny cudzysłów, wyjdź z trybu wstawiania i wróć do początku wiersza za pomocą <home>(lub odpowiednika). Naciśnij, jaby przejść o jeden wiersz w dół. Zatrzymaj nagrywanie za pomocą q. Następnie powtórz makro za pomocą @a. Kilka razy.


Czy którekolwiek z powyższych podejść działa dla Ciebie?


15

jeśli użyjesz polecenia „global”, możesz powtórzyć to, co możesz zrobić w jednym trybie online w dowolnej liczbie wierszy.

:g/<search>/.<your ex command>

przykład:

:g/foo/.s/bar/baz/g

Powyższe polecenie znajduje wszystkie linie, które mają foo, i zamienia wszystkie wystąpienia bar w tej linii na baz.

:g/.*/

zrobi na każdej linii


1
To jest tak przydatne, że nie wiedziałem o tym. Wydaje się tak potężne i sprytne połączenie poleceń.
— 0xc0de

Dla wygody napisałem małą funkcję, która pobiera słowo pod kursorem (lub wizualnie wybrane słowo), monituje o zamianę, a następnie uruchamia :gopisane tutaj polecenie. Lubię /gcprosić o „potwierdzenia”, aby móc trafić ylub ndla każdej wymiany lub azmienić je wszystkie.
— joeytwiddle

11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

W kroku 3 Inie można przejść do trybu wstawiania, czy wiesz, dlaczego tak się dzieje?
— Ninja

Spróbuj załadować vima bez wtyczek: vim -u NONEi spróbuj ponownie wykonać żądaną akcję, może to być jakaś mapa lub wtyczka zmieniająca zachowanie twojego vima.
— SergioAraujo

6

Nie jestem pewien, co vimrobi, ale to ciekawy efekt. Sposób, w jaki opisujesz to, czego chcesz, bardziej przypomina działanie makr ( :help macro). Coś takiego zrobiłoby to, co chcesz z makrami (zaczynając w trybie normalnym):

  1. qa: aZarejestruj makro do zarejestrowania.
  2. 0w: 0idź do początku wiersza, wprzeskocz o jedno słowo.
  3. i"<Esc>: Wejdź w tryb wstawiania, wstaw a "i wróć do trybu normalnego.
  4. 2e: Przejdź na koniec drugiego słowa.
  5. a"<Esc>: Dołącz plik ".
  6. jq Przejdź do następnego wiersza i zakończ nagrywanie makra.

Razem wzięte: qa0wi"<Esc>2ea"<Esc>

Teraz możesz wykonać makro za pomocą @a, powtórzyć ostatnie makro za pomocą @@. Aby zastosować się do reszty pliku, zrób coś, 99@aco przy założeniu, że nie masz więcej niż 99 linii, wykonanie makra zakończy się, gdy osiągnie koniec pliku.

Oto jak osiągnąć to, czego chcesz visual-block-mode(zaczynając w trybie normalnym):

  1. Przejdź do miejsca, w którym chcesz umieścić pierwszą wycenę.
  2. Enter visual-block-mode, wybierz linie, na które chcesz wpłynąć, Gaby przejść do końca pliku.
  3. Hit I"<Esc>.
  4. Przejdź do następnego miejsca, w którym chcesz wstawić ".
  5. Chcesz powtórzyć to, co właśnie zrobiłeś ., wystarczy prosta .

4
Nie ma potrzeby 99 @ a. Jeśli chcesz wykonać makro w każdej linii pliku, spróbuj:% norm! @za.
— Rook

Bez kropek (to tylko końce zdań, a nie część poleceń)
— Wieża

9999@amoże być brzydki, ale pisanie jest o wiele łatwiejsze niż :%norm! @ai nie uruchamia się ponownie w właśnie edytowanym wierszu. Mimo wszystko dobrze to wiedzieć. :)
— joeytwiddle

1

Moje rozwiązanie polega na użyciu tych dwóch mapowań:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Jak ich używać:

  1. Wybierz swoje linie. Jeśli chcę zaznaczyć kolejne 12 wierszy, po prostu naciskamV12j
  2. naciśnij <leader>n
  3. Wprowadź zmiany w linii
  4. Upewnij się, że jesteś w trybie normalnym, a następnie naciśnij <leader>m

Aby dokonać kolejnej edycji, nie musisz ponownie dokonywać wyboru. Po prostu naciśnij <leader>n, wprowadź zmiany i naciśnij, <leader>maby zastosować.


Jak to działa:

  • <Esc><Esc>0qq Wyjdź z wizualnej selekcji, przejdź na początek wiersza i zacznij nagrywać makro.

  • q Zatrzymaj nagrywanie makra.

  • :'<,'>-1normal!@q<CR> Od początku selekcji wizualnej do linii przed końcem odtwórz makro w każdej linii.

  • <Down> Wróć do ostatniej linii.


Możesz także zmapować ten sam klawisz, ale dla różnych trybów:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Chociaż zakłóca to twoją możliwość wprowadzenia kolejnej edycji. Będziesz musiał ponownie wybrać swoje linie.

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.