Czasami chcę edytować pewien wizualny blok tekstu w wielu wierszach.
Na przykład wziąłbym tekst, który wygląda następująco:
name
comment
phone
email
I niech tak to wygląda
vendor_name
vendor_comment
vendor_phone
vendor_email
Obecnie chciałbym to zrobić ...
- Wybierz wszystkie 4 wiersze wiersza bloku, naciskając, Va następnie jcztery razy.
- Wcięcie z >.
- Wróć jedną literę za pomocą h.
- Przejdź do trybu blokowania wizualnego za pomocą Ctrlv.
- Wybierz cztery wiersze w dół, naciskając jcztery razy. W tym momencie wybrałeś wizualne bloki 4x1 białych znaków (cztery rzędy i jedna kolumna).
- Prasa C. Zauważ, że to prawie wcięcie w lewo o jedną kolumnę.
- Wpisz
" vendor_"
bez cytatu. Zwróć uwagę na dodatkową przestrzeń, którą musieliśmy przywrócić. - Prasa Esc. To jeden z niewielu razy, kiedy Escwychodzę z trybu wstawiania. Ctrlcedytowałby tylko pierwszy wiersz.
- Powtórz krok 1.
- Wcięcie w drugą stronę za pomocą <.
Nie muszę wciskać, jeśli przed słowami jest co najmniej jedna kolumna białych znaków. Nie potrzebowałbym białych znaków, gdybym nie musiał wyczyścić bloku wizualnego c.
Ale jeśli muszę to wyczyścić, to czy jest sposób na to, co zrobiłem powyżej, bez tworzenia potrzebnych białych znaków z wcięciem?
Także dlaczego edytowanie wielu linii jednocześnie działa tylko po wyjściu z trybu wstawiania za pomocą Escover Ctrlc?
Oto bardziej skomplikowany przykład:
name = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone = models.CharField( max_length = 135, blank = True )
email = models.EmailField( blank = True )
do
name = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone = models.whatever.CharField( max_length = 135, blank = True )
email = models.whatever.EmailField( blank = True )
W tym przykładzie wykonałbym pionowy blok wizualny nad .
, a następnie włożyłem go ponownie w trybie wstawiania, tj .whatever.
. Wpisz . Mam nadzieję, że teraz widać wadę tej metody. Ograniczam się tylko do wybrania kolumny tekstu, które są takie same w pozycji pionowej .
:s/models\./\0whatever./
\0
z&
.Odpowiedzi:
n
INname
.I
(duże i).vendor_
. Uwaga: zaktualizuje ekran tylko w pierwszej linii - aż do Escnaciśnięcia (6.), w którym to momencie wszystkie linie zostaną zaktualizowane.I
Należy używać wielkich liter zamiast małychi
, ponieważ małe literyi
są interpretowane jako początek obiektu tekstowego , który sam w sobie jest przydatny, np. Do wybierania wewnątrz bloku znacznika (it
):źródło
j
lub^L
. Powinieneś zobaczyć, że Vim wcale nie był zajęty; to tylko czekało. Po drugie, spróbuj zmienić'timeout'
na niższą wartość, taką jak80
(zamiast domyślnej1000
) i zauważ, że upłynie ona szybciej.timeoutlen
nie jesttimeout
.A
zamiast zamiastI
, która wstawi się po wybranym bloku, a nie wcześniej. Jeśli twoje linie mają różne długości, to nie zadziała; Lubię używać do tego podstawienia pasującego do końca każdej linii, np. Wybierając niektóre linie i używając:s/$/inserted/
.Innym podejściem jest użycie polecenia .(
dot
) w połączeniu z I.vendor_
)Uważam, technika ta jest często szybciej niż w trybie wizualnym grupowego dla małych ilości dodatków i ma dodatkową zaletę, że jeśli nie trzeba wstawić tekst na każdej linii w zakresie można łatwo pominąć je, naciskając dodatkowe j„s .
Należy zauważyć, że w przypadku dużej liczby ciągłych dodatków podejście blokowe lub makro będzie prawdopodobnie lepsze.
źródło
Naciśnij:
Wpisz nowy tekst.
źródło
Esc
dla VIM noobów takich jak ja - zajęło mi trochę czasu, aby dowiedzieć się, że zmiany są propagowane „później”!v
? Mogę to zrobićCtrl+V --> A
, alev
zaznaczanie tekstu nie działa -A
tylko dołącza się do tej linii. Czy nie oba są wyborem? Również bardzo dziwne -A
dołącza się tylko do końca linii JEŚLI przedłużę blok wizualny do końca linii; w przeciwnym razie dołącza się tam, gdzie kończy się blok wizualny dla każdej linii. To tak, jakby nie rozpoznało różnicy międzya
iA
.c
zamiastC
, ale działało idealnie dobrze. DziękujęUżywałbym makra do rejestrowania moich działań, a następnie powtarzałbym je.
Masz teraz ładne makro.
Wpisz, 3@qaby wykonać makro trzy razy, aby wykonać resztę wierszy.
źródło
czy coś mi brakuje?
źródło
vender_
prefiks jest niepożądany.1,4s/^/vendor_/
V
i pisania:
. Przedrostek ed wyrażenie, za pomocą:'<,'>
którego ed stosuje się tylko do zaznaczenia za pomocą:'<,'>s/^/vendor_/
Zaktualizowano w styczniu 2016 r
Chociaż zaakceptowana odpowiedź jest świetnym rozwiązaniem, w rzeczywistości jest to nieco mniej naciśnięć klawiszy i skaluje się lepiej - zasadniczo w oparciu o przyjętą odpowiedź.
n
INname
.I
.vendor_
.Uwaga: liczba naciśnięć klawiszy jest mniejsza niż podana zaakceptowana odpowiedź (porównaj krok 3). Po prostu zliczamy liczbę j akcji do wykonania.
Jeśli masz włączone numery linii (jak pokazano powyżej) i znasz numer linii, do której chcesz przejść, krok 3 można zmienić na #G gdzie # to pożądany numer linii.
W naszym powyższym przykładzie byłoby to 4G. Jednak w przypadku kilku numerów linii wyraźne liczenie działa dobrze.
źródło
Chciałem skomentować wiele wierszy w pliku konfiguracyjnym na serwerze, który miał tylko vi (bez nano), więc metoda wizualna również była uciążliwa Oto jak to zrobiłem.
vi file
:set number!
lub:set number
:35,77s/^/#/
Uwaga: liczby są włącznie, wiersze od 35 do 77, oba zawarte zostaną zmodyfikowane.
Aby anulować komentarz / cofnąć to, po prostu użyj
:35,77s/^#//
Jeśli chcesz dodać słowo tekstowe jako komentarz po każdym wierszu kodu, możesz również użyć:
:35,77s/$/#test/
(dla języków takich jak Python):35,77s/;$/;\/\/test/
(dla języków takich jak Java)kredyty / referencje:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
źródło
Możesz również mieć przypadek użycia, w którym chcesz usunąć blok tekstu i zastąpić go.
Lubię to
Do
Możesz po prostu zablokować wizualnie zaznacz „Świat” w obu liniach.
Wpisz czmiany - teraz będziesz w trybie wstawiania.
Wstaw żądane rzeczy i naciśnij klawisz Escape.
Oba odbijają się w pionie. Działa tak samo jak „I”, z tą różnicą, że zastępuje blok nowym tekstem zamiast go wstawiać.
źródło
Załóżmy, że masz ten plik:
Chcesz dodać „vendor_” przed „name”, „comment”, „phone” i „email”, niezależnie od tego, gdzie występują w pliku .
c
Flag poprosi o potwierdzenie. Możesz to upuścić, jeśli nie chcesz monitu.źródło
Alternatywa, która może być bardziej elastyczna:
Przykład: Aby wprowadzić tekst XYZ na początku wiersza
Co tu się dzieje?
%
== Wykonaj w każdej liniinorm
== Wykonaj następujące klucze w trybie normalnymI
== Wstaw na początku liniiXYZ
== Tekst, który chcesz wprowadzićWięc uderzyłeś Enter i to się wykonuje.
Specyficzne dla twojego żądania:
Możesz również wybrać konkretny zakres:
Lub wykonaj w wybranym zakresie wizualnym:
źródło
ctrl-v ctrl-[
aby wstawić „Esc Esc”, co spowoduje powrót do „trybu normalnego” w celu wykonania normalnego polecenia. Właśnie przetestowałem to z'<,'>norm Iaa^[ysiw"
, gdzie^[
jest ucieczka Esc.źródło
źródło