Wie zeichnet Vimgolf alle Tastenanschläge auf?


10

Von Zeit zu Zeit mache ich gerne eine Runde Vimgolf . Es kann aufschlussreich sein.

Wie können sie alle Tastenanschläge aufzeichnen? Das muss ein vim-Feature sein. Jeder eine Idee, wie das geht. Unter bestimmten Umständen kann es nützlich sein, alles aufzuzeichnen.


1
Ich habe gerade herausgefunden, dass wir hier eine ziemlich ähnliche Frage haben
statox

Antworten:


10

Sie verwenden wahrscheinlich den eingebauten Parameter -w, siehe :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}

Bearbeiten Wie @B Layer hervorhob, verwendet der eigentliche Code den -WParameter, der im Grunde der gleiche ist wie der, -waber die Protokolldatei wird überschrieben, anstatt die Tastenanschläge daran anzuhängen ( :h -W):

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

Gut geraten! Es ist -Wnicht -w(siehe meine Antwort), aber immer noch ...
B Layer

@BLayer Gut gespielt Ich war zu faul, um mir ihren Code anzusehen :-) Ich werde mit dem Dokument aktualisieren, für -Wdas im Grunde das gleiche ist.
Statox

1
Ja. Einfach anhängen oder schreiben.
B-Schicht

Eine (gute) Vermutung überstimmt und wird über eine gut recherchierte, faktenbasierte Antwort akzeptiert? Eine schwere Ungerechtigkeit wurde begangen. :( ... LOL
B Schicht

1
Es ist eine edle Geste. Ich akzeptiere demütig Ihre Stimme, guter Herr oder Frau. Dilly dilly.
B-Schicht

14

Ich denke nicht, dass es so einfach ist, aber Sie können den Ruby-Code hier selbst ansehen:

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

Zum einen sehe ich eine Klasse für Keylogging.

Hier ist der Befehl, der zum Starten vimin lib / vimgolf / cli.rb verwendet wird :

 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 hatte (fast) recht mit -w outfile... -W outfileeigentlich, was die Datei überschreibt, an die die eingegebenen Zeichen gesendet werden, anstatt sie anzuhängen. Aber wie gesagt, nicht "ganz so einfach" ... vergleichen Sie den Inhalt einer dieser Dateien und was vom vimgolf-Tool generiert wird. Dies ist von einem tatsächlichen Vimgolf-Problem ...

-W Ausgabe beim Kopieren und Einfügen hier:

GI0. ý`gvgý`ZZ

Mehrere nicht druckbare Zeichen gingen "in der Übersetzung verloren".

-W Ausgabe so, wie sie auf dem Bildschirm angezeigt wird:

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

Das ist irgendwie hässlich.

vimgolf angezeigte / hochgeladene Ausgabe:

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

Ahh, das ist besser.


Update: Ich habe ein paar Minuten damit verbracht, mir die Dinge etwas genauer anzusehen und ein paar neue Informationen zu haben.

Erstens ist die oben erwähnte Keylogger-Klasse keylog.rb zwar ein wichtiger Teil des Puzzles, aber eigentlich ziemlich einfach. Die von Vim ausgegebenen und in der -WProtokolldatei gespeicherten Schlüsselcodes sind entweder ein Byte oder drei Bytes (angezeigt durch einen ersten Bytewert von 0x80), und für jeden der beiden Sätze gibt es eine Hash-Zuordnung.

Die Ein-Byte-Version ordnet den Byte-Wert einer Zeichenfolgendarstellung des Schlüsselcodes wie 0oder zu g. Die Drei-Byte-Version wird in ähnlicher Weise einer Zeichenfolge (z. B. <Esc>oder <C-V>) zugeordnet, verwendet jedoch als Schlüssel die kombinierten Werte der Bytes zwei und drei. Es gibt einige Ausnahmen / Eckfälle, die unterschiedlich behandelt werden, aber die überwiegende Mehrheit der Schlüsselcodes wird durch einfache Suchvorgänge in diesen beiden Karten gelöst.

Als ich sah, wie grundlegend der Schlüsselprotokollcode war, konnte ich feststellen, dass etwas mit dem, was ich in den Schlüsselcode-Protokolldateien sah, nicht stimmte (wie im oben eingefügten Beispiel). Es stellt sich heraus, dass ich die nach den VimGolf-Regeln erforderliche vimrc-Datei hätte verwenden sollen. Insbesondere diese Linie

set t_RV= 

führt zur korrekten Protokollierung. Das obige Beispiel "erscheint auf dem Bildschirm" würde tatsächlich so aussehen:

^VGI0. ^[gvg^AZZ

Jetzt kann man die gerade Linie von dieser "rohen" Zeichenfolge zu VimGolfs gerenderter Form sehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.