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.
Réponses:
Ils utilisent probablement le paramètre intégré
-w
, voir:h -w
:Modifier comme @B Layer a souligné que le code réel utilise le
-W
paramètre qui est fondamentalement le même que-w
mais le fichier journal est écrasé au lieu d'y ajouter les touches (:h -W
):la source
-W
pas-w
(voir ma réponse) mais quand même ...-W
qui est fondamentalement le même.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
vim
dans lib / vimgolf / cli.rb :@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:Plusieurs caractères non imprimables se sont "perdus dans la traduction".
-W
sortie telle qu'elle apparaît à l'écran:Eh bien, c'est plutôt moche.
sortie affichée / téléchargée de vimgolf:
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
-W
fichier 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
0
oug
. 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
entraîne une journalisation correcte. L'exemple "apparaît à l'écran" ci-dessus ressemblerait en fait à ceci:
Maintenant, on peut voir la ligne droite de cette chaîne "brute" à la forme rendue de VimGolf.
la source