Niedawno zdałem sobie sprawę, jak Vim świetnie sprawdza się w golfie , szczególnie w złożoności Kołmogorowa . Ponadto, według meta vim, jest to całkowicie akceptowalny „język programowania” przynajmniej dla zakresu tej strony.
Jakie masz ogólne wskazówki na temat gry w golfa w Vim? Szukam pomysłów, które można by zastosować do problemów związanych z golfem i które są przynajmniej nieco specyficzne dla Vima (np. „Usuń komentarze” nie jest odpowiedzią).
Proszę zamieścić jedną wskazówkę na odpowiedź.
Odpowiedzi:
Uważaj na duże warianty typowych poleceń. Może to w prosty sposób zaoszczędzić jedno naciśnięcie klawisza w wielu kontekstach. Na przykład:
Innym jest użycie
G
zamiastgg
, ale tylko jeśli użyjesz liczby! Na przykład bez liczeniagg
przesuwa się na początek iG
przechodzi na koniec. Jednak z policzeniem oba poruszają się do określonej linii, więc5G
jest krótsza niż, ale równoważna5gg
.Innym jest użycie
H
zamiastgg
, ale ważne jest, aby pamiętać, że działa to tylko wtedy, gdy możesz zagwarantować, że żadne wejście nie zajmie więcej niż domyślna liczba wierszy (uważam, że jest to 24, ale może się różnić).źródło
$
jednak jest , więc przynajmniejC
iD
coś by oszczędziło).G
igg
nie są równoważne. Pierwszy idzie na koniec bufora, a drugi na początek.5G
Jest równoważne5gg
. Dodam więcej szczegółów na temat tego punktu.Za każdym razem, gdy polecenie nie powiedzie się, wyda odgłos ding, który anuluje bieżące makro. Możesz (ab) użyć tego, aby stworzyć prostą formę pętli. Na przykład, jeśli chcesz powtarzać naciśnięcia klawiszy,
<foobar>
dopóki bufor nie zawiera mniej niż 3 wiersze. Możesz to zrobićco znaczy:
Ważne jest, aby pamiętać, że jeśli testujesz to podczas sesji vim,
@q
może to mieć niezamierzone skutki uboczne, ponieważ makra są ładowane z.vim_profile
. Możesz obejść to na kilka różnych sposobów. Prawdopodobnie najlepszym obejściem jest uruchomienie vimaMożesz także usunąć swój
.viminfo
.Jeśli już uruchomiłeś vima, możesz pisać
na początku zerować makro.
Inne warunki, na które możesz zastąpić 3G to
lub
źródło
Są bardziej skrócone wersje ex poleceń, które myślisz. Na przykład prawdopodobnie już wiedziałeś, że
:global
można to skrócić:g
, ale czy wiesz, że:nnoremap
to jest równoważne:nn
?Dobrym pomysłem jest uruchomienie
:h :foo
wszystkich poleceń ex, których używasz w odpowiedzi, aby sprawdzić, czy jest krótsza wersja.źródło
jest zawsze równoważne z
który okazuje się być równoważny z
co zaskakujące. (Ogólnie rzecz biorąc, bez żadnych flag, ostatni ukośnik w
:s
wyrażeniu nigdy nie jest konieczny).źródło
:%s/x
nie usuwa każdego wystąpienia x, tylko pierwszy w każdej linii.:&&
do powtórzenia polecenia zastępczego i jego flag.Powiedzmy, że jesteś w trybie wstawiania i chcesz wykonać pojedyncze polecenie w trybie normalnym. Możesz napisać tak:
Nie rób tego w ten sposób. Zamiast tego użyj
<C-o>
, który wykonuje pojedyncze normalne polecenie, a następnie natychmiast powraca do trybu wstawiania.źródło
<CR>
póżniej,<foobar>
aby wysłać polecenie?:
,/
lub?
)Istnieją trzy operatory „zmiany przypadku”,
Ponieważ są to operatory, wykonują ruch, aby przekonwertować bieżący znak na małe litery, których byś użył
Tutaj pojawia się zabawna sztuczka. :) Jeśli chcesz zmienić wielkość liter pojedynczego znaku lub bieżącej linii, w trybie wizualnym jest krótsza o bajt. Na przykład
gul
jest równoważne zI
gu_
(_ jest bieżącą linią) jest równoważneTa sztuczka nie działa w przypadku przełączania, ponieważ
v?
uruchamia wyszukiwanie do tyłu w trybie wizualnym (podobnie jakv/
w przeciwnym kierunku), więcvg?
zamiast tego potrzebujesz . Jednak tutaj możesz użyć~
operatora, aby zaoszczędzić jeszcze więcej bajtów! (Dzięki @Doorknob za zwrócenie na to uwagi)Możesz zobaczyć tę sztuczkę w akcji na mojej odpowiedzi vim tutaj i na równoważnej odpowiedzi V na postu i.
źródło
~
, która przełącza wielkość znaków pod kursorem i przesuwa jedną w prawo!Alfabet w 10 naciśnięciach klawiszy
Wszystkie zasługi za tę technikę należą do Lynn, która jako pierwsza zastosowała ją w tej odpowiedzi . Piszę to tutaj dla potomności.
Użyj następujących dziesięciu naciśnięć klawiszy, aby pociągnąć za małe litery:
(Gdzie
␍
jest znak powrotu karetki, tzn. Klawisz Enter.)Wyjaśnienie
:h<_␍
otwiera sekcję pomocyv_b_<_example
(przykład wizualnego zaznaczenia blokowego), który zawiera tekstabcdefghijklmnopqrstuvwyxz
.jjY
przesuwa się do tej linii i szarpa ją, a następnieZZ
zamyka okno pomocy.źródło
Poznaj swoje rejestry
Ciągnięcie lub usuwanie tekstu do określonego rejestru (np.
"aY
), Aby użyć go później, nie zawsze jest konieczne. Vim ma kilka rejestrów, które są automatycznie zapełniane tematami różnych poleceń. Wpisz:help registers
je, aby zobaczyć je wszystkie, ale oto kilka szczególnych uwag:Rejestr bez nazwy:
""
- Ostatni tekst, który został szarpany lub usunięty.Rejestr numerowany
"0
- ostatni zrywany tekst.Rejestry numerowane
"1
-"9
- Ostatni usunięty tekst, chyba że jest krótszy niż jeden wiersz. Po każdym"1
napełnieniu jego poprzednia zawartość jest przesuwana do"2
i tak dalej.Mały rejestr usuwania:
"-
- Ostatni tekst krótszy niż jeden wiersz, który został usunięty.Ostatni wstawiony tekst:
".
W szczególności rejestry
"-
i"1
mogą być przydatne razem, umożliwiając usunięcie części tekstu za pomocą np.dd
Do"1
rejestru i usunięcie innego tekstu za pomocąD
do"-
(oczywiście semantyka nie jest identyczna, ale często nie musi być ).Wszystkie rejestry mogą być nieco trudne do śledzenia, ale możesz zobaczyć zawartość wszystkich swoich rejestrów w dowolnym momencie, pisząc
:registers
.źródło
To pojawiło się na czacie wcześniej, więc pomyślałem, że równie dobrze mogę opublikować to jako pełną wskazówkę.
<C-a>
oraz<C-x>
zwiększanie i zmniejszanie następnego numeru na linii. Jest to niezwykle przydatna funkcja dla niektórych prostych obliczeń matematycznych, ale pozwala także na porządny mały hack.Powiedzmy, że musisz przejść do następnej liczby. Na przykład musimy się zmienić
do
Oczywistym sposobem jest przeskoczenie do 2, a następnie:
Ponieważ jest to krótszy niż
Istnieje wiele różnych sposobów przejścia do 2. Na przykład:
Jak również na wiele innych sposobów.
Są to wszystkie 2 (lub więcej) naciśnięcia klawiszy. Ponieważ jednak
<C-a>
i<C-x>
nie tylko numery góra / dół, ale również przejść do następnego numeru, możemy wziąć bajt meczźródło
Ruchy golfisty
Często, jeśli pracujesz z blokiem tekstu (szczególnie w wyzwaniach ascii-art ), musisz przejść do pierwszego lub ostatniego znaku w buforze.
G
igg
są całkiem dobre, ale są irytujące rzeczy. Na przykład, aby uzyskać ostatni znak, potrzebujeszG$
igg
niekoniecznie umieścisz cię w pierwszej kolumnie, jeśli jest wiodąca biała spacja. Oto kilka ładniejszych ruchów, chociaż zauważ, że działają one tylko wtedy, gdy tekst nie ma pustych linii w środku:Pierwszy znak bufora:
{
jest lepszy niżgg0
. Jeśli na środku tekstu są puste linie, możesz także użyćgo
tego, który przeniesie Cię do pierwszego znaku w buforze, bez względu na wszystko.Ostatni znak bufora:
}
jest lepszy niżG$
Działają one również jako argument dla operatora, ale należy pamiętać, że są to ruchy charakterystyczne, a nie ruchy liniowe!
źródło
H
jest bardziej golfowy niżgg
H
nie jest wiarygodny. Jego zachowanie zależy od wielkości widocznego okna i miejsca w buforze. (Został ponownie mapowany w V, aby uniknąć tego zamieszania)Wykonuj obliczenia za pomocą rejestru wyrażeń
Możesz wykonywać obliczenia zarówno w trybie normalnym, jak i w trybie wstawiania.
Tryb normalny
W trybie normalnym, jeśli wpiszesz
@=
kursor przejdzie do wiersza polecenia, w którym można wprowadzić dowolne wyrażenie. Po naciśnięciu klawisza Enter wynik wyrażenia zostanie wykonany jako polecenie w trybie normalnym.Załóżmy na przykład, że chcesz przejść do środkowej kolumny bieżącego wiersza. Wywołanie funkcji
col('$')
zwraca liczbę kolumn w wierszu, dzięki czemu możemy to osiągnąć, wpisując następujące polecenie:Kiedy naciśniesz enter, kursor powróci do bufora i vim czeka na operatora (jak
|
) tak, jakbyś właśnie wprowadził liczbę. Ewentualnie możesz wprowadzić to:... ale to oczywiście więcej bajtów.
Tryb wstawiania
Rejestru wyrażeń można także użyć w trybie wstawiania, naciskając
<Ctrl-r>=
zamiast@=
. Działa tak samo w trybie normalnym, z wyjątkiem tego, że wpisane wyrażenie zostanie wykonane w trybie wstawiania. Na przykład jeśli wpiszesz<Ctrl-r>=col('$')<CR>
, liczba kolumn w bieżącym wierszu zostanie wstawiona pod kursorem, tak jakbyś go wpisał.Aby uzyskać więcej informacji na temat rejestru wyrażeń, wpisz
:help "=
.Ponowne użycie wyrażeń
Ostatnim wyrażenie użyte jest przechowywana w rejestrze ekspresyjnego
"=
. Wpisanie@=<CR>
w trybie normalnym lub<Ctrl-r>=<CR>
w trybie wstawiania ponownie oceni wyrażenie, umożliwiając korzystanie z nich podobnie do makr.Wykonuj obliczenia w zamianach
Możesz również oceniać wyrażenia, wykonując zamiany wyrażeń regularnych. Wszystko, co musisz zrobić, to rozpocząć zamianę
\=
. Załóżmy na przykład, że chcesz numerować linie w tym pliku:Wywołanie funkcji
line('.')
zwraca bieżący numer linii, więc zadanie jest łatwe. Wprowadzanie tego:... daje pożądany wynik:
Aby użyć przechwyconych grup w takim wyrażeniu, możesz użyć
submatch()
funkcji, gdzie np.submatch(0)
Jest równoważne\0
zwykłemu podstawieniu,submatch(1)
jest równoważne\1
, itp. Niestety, to zużywa wiele naciśnięć klawiszy.Aby uzyskać więcej informacji na temat podstawiania wyrażeń, wpisz
:help sub-replace-expression
.źródło
i1 <esc>bqqywjPb<C-a>@qq@q
jest rozwiązaniem w trybie normalnym, który jest o 5 bajtów krótszy. A jeśli jesteś na Uniksie, możesz to zrobić:%!nl
. Nadal dobre wskazówki!Możesz bezpośrednio zmodyfikować tekst makra, który może być znacznie krótszy niż złożony warunek. Załóżmy na przykład, że chcesz wkleić coś n razy, gdzie n oznacza dane wprowadzone przez użytkownika. Najpierw próbowałem to zrobić:
Wyjaśnienie:
To 18 naciśnięć klawiszy i naprawdę brzydki sposób na zrobienie tego. Zamiast tego przejdź do lokalizacji tego numeru i zrób to:
Wyjaśnienie:
To 9 naciśnięć klawiszy, ogromna poprawa.
Edytować:
Jeszcze krótsze jest uruchomienie makra dla twojego numeru, a następnie wpisz polecenie. Na przykład:
Wyjaśnienie:
7 uderzeń w klawisze.
źródło
D
, a niedd
. 2. Jeśli polecenie nie obejmuje rejestrów, możesz je skrócić. Na przykład, jeśli chcesz powtórzyć znakx
tyle razy, ile liczba pod kursorem, zamiast"qD@qix<esc>
, użyjD@"ix<esc>
.