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 wpisz My 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:
- wyszukaj miejsce, w którym chcesz dokonać edycji
/pattern
- dokonaj powtarzalnej edycji
- użyj,
n
aby przejść do następnego miejsca do edycji
- użyj,
.
aby powtórzyć edycję
- powtórz dwa ostatnie kroki: Jesteś królem świata (lub przynajmniej zmian)
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:
variable1 = 2
my_variable2 = 12
var3 = 14
Jeszcze raz ważne jest, aby dowiedzieć się, jak sprawić, by makra były wydajne (zaraz podam licznik):
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- Teraz możesz użyć makra, aby powtórzyć edycję. Gdy jesteś w odpowiedniej linii do edycji, możesz po prostu uruchomić makro za pomocą
@q
. Ponieważ chcemy go wykonać dwukrotnie, możesz użyć 2@q
i otrzymasz następujący wynik:
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
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:
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
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ć:
`0ea.someStuff<Esc>j@q`
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:
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
Co jeśli przeniósł ikonek z images
do components
?
Cóż można umieścić kursor na i
od images
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ć, i 2j
wybrać wszystkie wystąpienia tego słowa.
Następnie wystarczy wpisać, c
aby zmienić słowo, a następnie components
. Po wyjściu z trybu wstawiania zobaczysz:
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
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:
:[range] g / pattern / command
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 i 1,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:
- Iteruj przez wszystkie linie zdefiniowane w parametrze [zakres]
- Jeśli bieżąca linia odpowiada zdefiniowanemu wzorowi, zastosuj polecenie
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:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
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:
:%global/echo/delete
Który można również skrócić jako
:g/echo/d
Zauważ, że %
zniknął, global
jest skracany jako g
i delete
jako d
. Jak możesz sobie wyobrazić wynik jest następujący:
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
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ły n.
. Mogę po prostu użyć
:g/echo/normal YP
I voila:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
UWAGA 2 „Hej, co jeśli chcę użyć polecenia w wierszach, które nie pasują do określonego wzorca?”
global
ma vglobal
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ę ubiegamy
:v/echo/d
W naszym poprzednim przykładzie otrzymujemy:
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
delete
Komenda została zastosowana na liniach, które nie zawartych echo
.
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.