Comment vimgolf enregistre-t-il toutes les frappes?

10

De temps en temps, j'aime participer à une partie de vimgolf . Cela peut être instructif.

Comment sont-ils capables d'enregistrer toutes les frappes? Ce doit être une fonction vim. N'importe qui sait comment faire ça. Il pourrait être utile de tout enregistrer dans certaines circonstances.

Mike
la source
1
Je viens de découvrir que nous avons une question assez similaire ici
statox

Réponses:

10

Ils utilisent probablement le paramètre intégré -w, voir :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}

Modifier comme @B Layer a souligné que le code réel utilise le -Wparamètre qui est fondamentalement le même que -wmais le fichier journal est écrasé au lieu d'y ajouter les touches ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}
statox
la source
Bien deviné! Ce n'est -Wpas -w(voir ma réponse) mais quand même ...
B Layer
@BLayer Bien joué J'étais trop paresseux pour regarder leur code :-) Je vais mettre à jour avec le doc -Wqui est fondamentalement le même.
statox
1
Oui. Il suffit d'ajouter ou d'écrire.
B Layer
Une (bonne) conjecture exclut et est acceptée sur une réponse bien documentée et basée sur des faits? Une grave injustice a été commise. :( ... LOL
B Layer
1
C'est un noble geste. J'accepte humblement votre vote, bon monsieur ou madame. Dilly dilly.
B Layer
14

Je ne pense pas que ce soit aussi simple que cela, mais vous pouvez regarder le code Ruby vous-même ici:

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

Je vois une classe pour le keylogging, pour un.

Voici la commande utilisée pour lancer vimdans 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 avait (presque) raison sur -w outfile... -W outfile, en fait, qui écrase le fichier dans lequel les caractères saisis sont envoyés plutôt que de lui être ajouté. Mais comme je l'ai dit, pas "tout à fait aussi simple" ... comparez le contenu de l'un de ces fichiers et ce qui est généré par l'outil vimgolf. Cela vient d' un problème de vimgolf réel ...

-W sortie une fois copiée puis collée ici:

GI0. ý`gvgý`ZZ

Plusieurs caractères non imprimables se sont "perdus dans la traduction".

-W sortie telle qu'elle apparaît à l'écran:

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

Eh bien, c'est plutôt moche.

sortie affichée / téléchargée de vimgolf:

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

Ahh, c'est mieux.


Mise à jour: J'ai passé quelques minutes à regarder de plus près les choses et à avoir quelques nouvelles informations.

Tout d'abord, la classe keylogger keylog.rb que je mentionne ci-dessus est en effet une pièce majeure du puzzle mais elle est en fait assez simple. Les codes-clés que Vim émet et qui sont enregistrés dans le -Wfichier journal sont soit un octet soit trois octets (indiqués par une première valeur d'octet de 0x80) et il existe une carte de hachage pour chacun des deux ensembles.

La version à un octet mappe la valeur d'octet à une représentation sous forme de chaîne du code clé tel que 0ou g. La version à trois octets est également mappée à une chaîne (par exemple <Esc>ou <C-V>) mais en utilisant comme clé les valeurs combinées des octets deux et trois. Il existe des exceptions / cas d'angle qui sont traités différemment, mais la grande majorité des codes clés sont résolus par de simples recherches dans ces deux cartes.

En voyant à quel point le code du keylogger était basique, je pouvais dire que quelque chose n'allait pas avec ce que je voyais dans les fichiers journaux du keycode (comme l'exemple collé ci-dessus). Il s'avère que j'aurais dû utiliser le fichier vimrc requis par les règles VimGolf. En particulier cette ligne

set t_RV= 

entraîne une journalisation correcte. L'exemple "apparaît à l'écran" ci-dessus ressemblerait en fait à ceci:

^VGI0. ^[gvg^AZZ

Maintenant, on peut voir la ligne droite de cette chaîne "brute" à la forme rendue de VimGolf.

Couche B
la source