Korzystam z wtyczki vim-multiple-cursors .
Chciałbym umieścić kursory dokładnie tam, gdzie chcę. Na przykład ( [x]
są to pozycje kursora):
Lorem ipsum dolor sit amet[1], consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.
W Sublime Text zwykle umieszczam pierwszy kursor, a następnie przechodzę do następnej pozycji za pomocą klawiszy strzałek i umieszczam drugi.
Czy w VIM jest coś podobnego? Z tą wtyczką lub inną.
EDYTOWAĆ
Po komentarzu moje zainteresowanie pojawiło się podczas próby zapisu
\section[My first section in this book]{My first section in this book}
w .tex
pliku. Moją pierwszą reakcją było napisanie, \section[]{}
a następnie umieszczenie dwóch kursorów, aby napisać to samo w []
i {}
.
Innym przykładem byłoby dodanie _someStuff
po kilku różnych nazwach zmiennych. Na przykład obróć to:
variable1 = 2
my_variable2 = 12
var3 = 14
zaangażowany w to:
variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14
Z wieloma kursorami mogę to zrobić, wybierając kursor kolumny, a następnie przechodząc do końca słowa, a następnie wstawiając itd. Ale chyba łatwo byłoby wybrać dokładnie to, gdzie powinny być kursory.
źródło
Odpowiedzi:
Używanie wielu kursorów nie jest rzeczą Vimmer
Jak powiedziałem w komentarzach, używanie wielu kursorów (nawet z wtyczką) tak naprawdę nie „podąża drogą Vima”, całkowicie rozumiem, że jest atrakcyjne dla kogoś, kto pochodzi z Sublime-Text, ale często można znaleźć alternatywy, które są przynajmniej równie wydajny dzięki wbudowanym funkcjom Vima.
Oczywiście znalezienie tych alternatywnych rozwiązań nie zawsze jest łatwe i czasem zajmuje dużo czasu, ale będzie łatwiejsze dzięki doświadczeniu Vima i zobaczysz, że z czasem wiele kursorów będzie dla ciebie zupełnie bezużytecznych.
Fajnie, ale jak mogę znaleźć alternatywny sposób?
Nie ma uniwersalnej odpowiedzi, ponieważ zależy to w dużej mierze od tego, co próbujesz zrobić, postaram się tylko dać kilka wskazówek na temat pierwszych rzeczy do wypróbowania:
Polecenie kropki
.
Polecenie Kropka jest prawdopodobnie jednym z najpotężniejszych narzędzi w Vimie, po prostu pozwala nam powtórzyć ostatnią zmianę. Nie potrafiłem tego lepiej wyjaśnić niż Drew Neil w jego Practical Vim . Myślę, że każdy Vimmer powinien rozważyć przeczytanie tej książki.
Siłą tego polecenia jest to, że ostatnią zmianą może być akcja działająca na znaku, linii lub całym pliku. Na przykład zmianę można oddzielić od momentu przejścia do trybu wstawiania i powrotu do trybu normalnego.
Mając to na uwadze, łatwo jest robić to, co chciałeś zrobić z multikursorem:
Najpierw skonfiguruj nasze środowisko: napiszmy tak, jak sugerowałeś
\section[]{}
Następnie dokonaj powtarzalnej zmiany Kursor jest teraz włączony
}
, naciśnij,F[
aby wrócić do[
postaci. Następnie wejdź w tryb wstawiania za pomocąi
i wpiszMy first section in this book
i wróć do normalnego trybu za pomocąESC
:\section[My first section in this book]{}
I tu pojawia się magiczna część: piszmy,
f{
aby umieścić kursor na{
postaci i naciśnij,.
aby powtórzyć ostatnią zmianę:\section[My first section in this book]{My first section in this book}
Wszystkie wyzwania związane z poleceniem kropki polegają na nauczeniu się, jak wprowadzać powtarzalne zmiany: przyjdzie z grokkingiem Vima, ale podstawową sprawą jest zrozumienie, jak dokonać zmiany w powtarzalny sposób.
Na przykład, aby wstawić średnik na końcu linii, której wolisz używać
A;
zamiast$a;
. Dlaczego?Ponieważ
A;
tworzy akcję atomową, więc kiedy użyjesz.
w innej linii, bez względu na to, gdzie jesteś w linii, wstawisz średnik na końcu. Podczas gdy podczas używania$a;
dzielisz zmianę na dwie części,$a
a wstawienie;
tak, jeśli.
go użyjesz , wstawi średnik na bieżącej pozycji kursora.UWAGA Magiczna formuła w Vimie to
n.
. Naprawdę fajny przepływ pracy to:/pattern
n
aby przejść do następnego miejsca do edycji.
aby powtórzyć edycjęmakra
Makra są kolejnym niezwykle ważnym narzędziem w Vimie, ponieważ pozwala nagrywać sekwencję naciśnięć klawiszy i powtarzać je tak, jakbyś pisał je ponownie.
Jako przykład użyję twojego drugiego przypadku użycia:
Jeszcze raz ważne jest, aby dowiedzieć się, jak sprawić, by makra były wydajne (zaraz podam licznik):
Umieść kursor na słowie
variable1
i zacznij rejestrować makroqq
. Oznacza to „rozpocznij rejestrowanie wszystkich moich przyszłych naciśnięć klawiszy w rejestrze o nazwieq
”.Zacznij pisać od edycji:
0
iść na początku liniie
przejść na końcu pierwszego słowaa
dołączać za kursorem.someStuff
dodać żądany tekst<Esc>
aby zatrzymać wstawianiej
przejść do następnej liniiq
aby zatrzymać nagrywanie makraDostaniesz:
@q
. Ponieważ chcemy go wykonać dwukrotnie, możesz użyć2@q
i otrzymasz następujący wynik:UWAGA 1 Jak być może zauważyłeś, użycie
0ea
na początku makra było bardzo ważne. Rzeczywiście, gdybyś umieścił kursor na końcu pierwszego słowa przed zarejestrowaniem makra i ponownym uruchomieniem go, wynik byłby następujący:Jako kursor tekst zostałby wstawiony w miejscu kursora po zmianie linii (w tym przypadku na końcu linii)
UWAGA 2 Makra są niezwykle wydajne i możesz nawet tworzyć makra rekurencyjne, gdy czujesz się z nimi dobrze. Tutaj twoje makro mogło być:
Finał sam
@q
wywołałby makro zamiast używać2@q
; po prostu użyłbyś@q
i cała praca zostałaby wykonana.blok wizualny
Oto kolejna sztuczka, która nie dotyczy bezpośrednio twojego przypadku użycia, ale może być naprawdę przydatna do edycji dużej liczby wierszy jednocześnie. Pobierzmy fragment kodu CSS:
Co jeśli przeniósł ikonek z
images
docomponents
?Cóż można umieścić kursor na
i
odimages
i prasie<C-v>
. Spowoduje to uruchomienie trybu bloków wizualnych, który pozwala wybierać bloki. Teraz możesz wpisać,t/
aby wybrać słowo, które chcesz zmienić, i2j
wybrać wszystkie wystąpienia tego słowa.Następnie wystarczy wpisać,
c
aby zmienić słowo, a następniecomponents
. Po wyjściu z trybu wstawiania zobaczysz:Globalne polecenie
Globalne polecenie jest narzędziem, które pozwala zastosować polecenie trybu ex na liniach pasujących do wzorca, to kolejny dobry sposób na zastosowanie tej samej zmiany w innym miejscu bez potrzeby używania wielu kursorów.
Składnia jest następująca:
Aby uzyskać więcej informacji na temat
[range]
parametru, zobacz:h :range
. Nie będę go tutaj szczegółowo, przypomnę tylko, że%
reprezentuje cały plik,'<,'>
reprezentuje ostatni wybór i1,5
reprezentuje wiersze od 1 do 5 pliku.Ten parametr określa linie, które będą traktowane przez polecenie globalne. Jeśli nie zostanie określony żaden zakres,
%
domyślnie zostanie użyte globalne polecenie .Argument [wzorzec] to wzorzec wyszukiwania używany w wyszukiwarce. Ponieważ integruje historię wyszukiwania, możesz pozostawić to pole puste, a polecenie globalne użyje ostatniego wzorca wyszukiwania w historii wyszukiwania.
Na koniec parametr [polecenie] jest poleceniem ex, do czego prawdopodobnie jesteś przyzwyczajony.
Teraz zachowanie globalnego polecenia jest dość proste:
Ponieważ parametr [polecenie] jest poleceniem ex, możesz robić wiele rzeczy. Weźmy następujący pseudo kod, który nie jest całkiem interesujący i mamy wiele komunikatów do debugowania:
Powiedzmy teraz, że masz pewność, że ten kod działa i chcesz usunąć te bezużyteczne
echo
instrukcje:Możesz zastosować globalną komendę do całego pliku, więc będziesz musiał poprzedzić komendę
%
(lub bez, ponieważ%
jest to domyślny zakres).Wiesz, że wszystkie wiersze, które chcesz usunąć, pasują do wzorca
echo
Chcesz usunąć te wiersze, więc będziesz musiał użyć polecenia,
:delete
które można również skrócić jakod
Musisz po prostu użyć następującej funkcji:
Który można również skrócić jako
Zauważ, że
%
zniknął,global
jest skracany jakog
idelete
jakod
. Jak możesz sobie wyobrazić wynik jest następujący:UWAGA 1 Ważną kwestią, która zajęła mi trochę czasu, było uświadomienie sobie, że
normal
polecenie jest poleceniem ex, co oznacza, że można go używać z poleceniem globalnym. To może być naprawdę potężne: powiedzmy, że chcę powielić wszystkie linie zawierające echo, nie potrzebuję makra ani nawet magicznej formułyn.
. Mogę po prostu użyćI voila:
UWAGA 2 „Hej, co jeśli chcę użyć polecenia w wierszach, które nie pasują do określonego wzorca?”
global
mavglobal
skrócone polecenie przeciwne,v
które działa dokładnie tak samo,global
z tym wyjątkiem, że polecenie zostanie zastosowane do linii, które nie pasują do parametru [wzorzec]. W ten sposób, jeśli się ubiegamyW naszym poprzednim przykładzie otrzymujemy:
delete
Komenda została zastosowana na liniach, które nie zawartychecho
.Mam nadzieję, że te kilka wskazówek da ci pomysły, jak pozbyć się wtyczki z wieloma kursorami i używać Vima w sposób Vima ;-)
Jak możesz sobie wyobrazić, przykłady te są dość proste i mają na celu jedynie zademonstrowanie, że kiedy podążasz drogą Vima, naprawdę rzadko potrzebujesz kilku kursorów. Moja rada byłaby wtedy, gdy napotkasz sytuację, w której uważasz, że byłoby to przydatne, zapisz ją i poświęć trochę czasu na znalezienie lepszego rozwiązania. 99% czasu ostatecznie znajdziesz szybszy / bardziej wydajny sposób na zrobienie tego.
Powtórzę się jeszcze raz, ale naprawdę zachęcam do przeczytania Practical Vim autorstwa Drew Neila, ponieważ ta książka nie mówi o „Jak to zrobić ani o tym w Vimie”, ale o „Jak nauczyć się myśleć w sposób Vima” co pozwoli Ci w dobry sposób zbudować własne rozwiązanie przyszłych problemów.
PS Specjalne podziękowania dla @Alex Stragies za jego pracę edytorską i poprawki, które wprowadził do tego długiego postu.
źródło
gn
obiekcie tekstowym. Dotyczy niektórych przypadków użycia wielu kursorów. Wyszukaj za pomocą/
, następniedgn
lubcgn
, a następnie powtórz za pomocą.
.gn
, spróbuję dodać go później. Dzięki za awans!Podane mi przypadki użycia brzmią tak, jakbyś chciał poznać
.
polecenie klawisza (powtórz ostatnie polecenie edycji)i
, wstaw tekst,<ESC>
.
(Kropka) ==> Wstawiono identyczny tekst<ALT>-j.
Twój przykładowy tekst dla mnie rozwiązuje:
I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.
źródło
.
kluczowe polecenie, ale nigdy nie myślałem o takim użyciu. Zgadzam się, że to dobry sposób. Ale twoja odpowiedź tak naprawdę nie odnosi się do prawdziwego pytania, więc chyba nie należy go akceptować.Więcej sposobów Vima.
Pierwsze zadanie:
Przepływ pracy:
Drugie zadanie:
Komenda:
Wynik:
źródło