Jak Vimgolf rejestruje wszystkie naciśnięcia klawiszy?


10

Od czasu do czasu lubię angażować się w rundę vimgolfa . To może być pouczające.

Jak są w stanie zarejestrować wszystkie naciśnięcia klawiszy? To musi być funkcja vima. Każdy ma pomysł, jak to zrobić. Przydałoby się nagrać wszystko w określonych okolicznościach.


1
Właśnie dowiedziałem się, że mamy dość podobne pytanie tutaj
statox

Odpowiedzi:


10

Prawdopodobnie używają wbudowanego parametru -w, patrz :h -w:

-w {scriptout}  All the characters that you type are recorded in the file
        "scriptout", until you exit Vim.  This is useful if you want
        to create a script file to be used with "vim -s" or
        ":source!".  When the "scriptout" file already exists, new
        characters are appended.  See also |complex-repeat|.
        {scriptout} cannot start with a digit.
        {not in Vi}

Edytuj, jak wskazała warstwa @B, faktyczny kod używa -Wparametru, który jest w zasadzie taki sam, -wale plik dziennika jest zastępowany zamiast dodawać do niego naciśnięcia klawiszy ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}

Zgadnij! To -Wnie jest -w(patrz moja odpowiedź), ale nadal ...
B Layer

@BLayer Dobrze zagrane Byłem zbyt leniwy, aby spojrzeć na ich kod :-) Zaktualizuję dokument, dla -Wktórego w zasadzie jest to samo.
statox

1
Tak. Po prostu dopisz vs napisz.
B Layer

(Dobre) odgadnięcie i akceptacja na podstawie dobrze zbadanej, opartej na faktach odpowiedzi? Dokonano poważnej niesprawiedliwości. :( ... LOL
B Layer

1
„To szlachetny gest. Pokornie przyjmuję twój głos, dobry panie lub pani. Dilly dilly.
B Warstwa

14

Nie sądzę, żeby to było takie proste, ale możesz sam zobaczyć kod Ruby:

https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf

Na przykład widzę klasę do keyloggera.

Oto polecenie używane do uruchomienia vimw lib / vimgolf / cli.rb :

 vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin --nofork -i NONE +0 
    -u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}

@statox miał (prawie) rację co do -w outfile... -W outfile, w rzeczywistości nadpisuje plik, do którego wysyłane są wpisywane znaki, zamiast go dołączać. Ale, jak powiedziałem, nie jest to „takie proste” ... porównaj zawartość jednego z tych plików i tego, co generuje narzędzie vimgolf. Wynika to z rzeczywistego problemu z vimgolfem ...

-W wyjście po skopiowaniu, a następnie wklejeniu tutaj:

GI0. ý`gvgý`ZZ

Kilka znaków niedrukowalnych „zagubiło się w tłumaczeniu”.

-W wyjście, jak pojawia się na ekranie:

^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ

Cóż, to trochę brzydkie.

vimgolf wyświetlał / przesyłał dane wyjściowe:

<C-V>GI0. <Esc>gvg<C-A>ZZ

Ahh, tak jest lepiej.


Aktualizacja: Spędziłem kilka minut, przyglądając się nieco bliżej i mam kilka nowych informacji.

Po pierwsze, keylogger klasy keylog.rb, o którym wspomniałem powyżej, jest rzeczywiście istotnym elementem układanki, ale w rzeczywistości jest dość prosty. Kody kluczy, które Vim emituje i które są zapisane w -Wpliku dziennika to albo jeden bajt, albo trzy bajty (wskazane przez pierwszą wartość bajtu 0x80), a dla każdego z dwóch zestawów jest mapa hash.

Wersja jednobajtowa odwzorowuje wartość bajtu na ciąg znaków reprezentujący kod klucza, taki jak 0lub g. Wersja trzy bajtowa podobnie mapuje na ciąg znaków (np. <Esc>Lub <C-V>), ale używa jako klucza połączonych wartości bajtów dwa i trzy. Istnieją pewne wyjątki / przypadki narożne, które są obsługiwane inaczej, ale zdecydowana większość kodów klawiszy jest rozwiązywana poprzez proste wyszukiwania na tych dwóch mapach.

Widząc, jak podstawowy był kod rejestratora kluczy, mogłem stwierdzić, że coś jest nie tak z tym, co widziałem w plikach dziennika kodu klucza (na przykład przyklejonym powyżej). Okazuje się, że powinienem był użyć pliku vimrc wymaganego przez reguły VimGolf. W szczególności ta linia

set t_RV= 

powoduje prawidłowe rejestrowanie. Powyższy przykład „pojawia się na ekranie” wygląda tak:

^VGI0. ^[gvg^AZZ

Teraz widać linię prostą od tego „surowego” ciągu do renderowanej postaci VimGolfa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.