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?

AlfredoVR
źródło
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>
    
romainl
źródło
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.

joeytwiddle
źródło
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?

Wieża
źródło
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

srini.venigalla
źródło
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)
SergioAraujo
źródło
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 .
Thor
źródło
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.

willmcpherson2
źródło