In che modo vimgolf registra tutte le sequenze di tasti?


10

Di tanto in tanto mi piace impegnarmi in un giro di vimgolf . Può essere illuminante.

Come sono in grado di registrare tutte le sequenze di tasti? Deve essere una funzione vim. Qualcuno ha idea di come farlo. Potrebbe tornare utile registrare tutto in determinate circostanze.


1
Ho appena scoperto che abbiamo una domanda molto simile qui
statox

Risposte:


10

Probabilmente usano il parametro incorporato -w, vedi :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}

Modifica Come ha sottolineato @B Layer, il codice effettivo utilizza il -Wparametro che è sostanzialmente lo stesso -wma il file di registro viene sovrascritto invece di aggiungere i tasti premuti ( :h -W):

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

Ottima ipotesi! E ' -Wnon -w(vedi la mia risposta), ma ancora ...
B Strato

@BLayer Bene, ero troppo pigro per guardare il loro codice :-) Aggiornerò con il documento per il -Wquale è sostanzialmente lo stesso.
statox

1
Sì. Basta aggiungere vs scrivere.
B Layer,

Una (buona) ipotesi si vota e viene accettata su una risposta ben studiata e basata sui fatti? Una grave ingiustizia è stata fatta. :( ... LOL
B Layer

1
È un gesto nobile. Accetto umilmente il tuo voto, buon signore o signora. Dilly dilly.
B Layer

14

Non credo sia abbastanza semplice, ma puoi guardare tu stesso il codice Ruby qui:

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

Vedo un corso per keylogging, per uno.

Ecco il comando che viene utilizzato per avviare vimin 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 aveva (quasi) ragione su -w outfile... -W outfile, in realtà, che sovrascrive il file a cui vengono inviati i caratteri digitati anziché aggiungerlo ad esso. Ma come ho già detto, non "abbastanza semplice" ... confronta il contenuto di uno di quei file e ciò che viene generato dallo strumento vimgolf. Questo proviene da un vero problema di Vimgolf ...

-W output quando copiato e incollato qui:

GI0. ý`gvgý`ZZ

Diversi personaggi non stampabili si sono "persi nella traduzione".

-W output come appare sullo schermo:

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

Beh, è ​​un po 'brutto.

vimgolf ha visualizzato / caricato l'output:

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

Ah, va meglio.


Aggiornamento: ho trascorso alcuni minuti a guardare un po 'più da vicino le cose e ho un paio di nuove informazioni.

Innanzitutto, la classe keylog.rb di keylogger che menziono sopra è davvero un pezzo importante del puzzle, ma in realtà è abbastanza semplice. I codici chiave che Vim emette e che vengono salvati nel -Wfile di registro sono costituiti da un byte o tre byte (indicati da un primo valore di byte di 0x80) e esiste una mappa hash per ciascuno dei due set.

La versione a un byte associa il valore del byte a una rappresentazione in formato stringa del codice chiave come 0o g. La versione a tre byte si associa in modo simile a una stringa (ad es. <Esc>O <C-V>) ma utilizzando come chiave i valori combinati dei byte due e tre. Esistono alcune eccezioni / casi angolari che vengono gestiti in modo diverso, ma la stragrande maggioranza dei codici chiave viene risolta attraverso semplici ricerche in queste due mappe.

Vedendo quanto fosse basilare il codice del key logger, potevo dire che qualcosa non andava in quello che stavo vedendo nei file di log del keycode (come nell'esempio incollato sopra). Si scopre che avrei dovuto usare il file vimrc richiesto dalle regole di VimGolf. In particolare questa linea

set t_RV= 

risulta nella registrazione corretta. L'esempio "appare sullo schermo" sopra in realtà sarebbe simile al seguente:

^VGI0. ^[gvg^AZZ

Ora si può vedere la linea retta da questa stringa "grezza" alla forma renderizzata di VimGolf.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.