Я не думаю, що це все так просто, але ви можете самі подивитися на код Ruby:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
Я бачу клас для керування брелоками, для одного.
Ось команда, яка використовується для запуску vim
в 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 (майже майже) мав рацію щодо -w outfile
... -W outfile
насправді, що перезаписує файл, до якого надсилаються набрані символи, а не додає до нього. Але, як я вже сказав, не "зовсім так просто" ... порівняйте вміст одного з цих файлів і те, що отримується інструментом vimgolf. Це з актуальної проблеми vimgolf ...
-W
вихід, коли скопійовано, а потім вставлено сюди:
GI0. ý`gvgý`ZZ
Кілька недрукарських персонажів "загубилися в перекладі".
-W
виведіть на екран, як це з'явиться:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
Ну, це якось потворно.
vimgolf відображає / завантажує вихід:
<C-V>GI0. <Esc>gvg<C-A>ZZ
Ах, так краще.
Оновлення: Я провів кілька хвилин, щоб трохи придивитись до речей і мати пару нових відомостей.
По-перше, клас keylogger keylog.rb, який я згадував вище, справді є головною частиною головоломки, але насправді є досить простою. Ключові коди, які випускає Vim та які зберігаються у -W
файлі журналу, є або одним байтом, або трьома байтами (позначені значенням першого байту 0x80), і є хеш-карта для кожного з двох наборів.
Однобайтна версія відображає значення байту на рядкове представлення коду клавіш, такого як 0
або g
. Трибайтова версія аналогічно відображається у рядку (наприклад, <Esc>
або <C-V>
), але використовуючи в якості ключа комбіновані значення байтів два та три. Є деякі винятки / кутові випадки, які обробляються по-різному, але переважна більшість клавішних кодів вирішується за допомогою простих пошуку в цих двох картах.
Побачивши, наскільки основним був код реєстратора ключів, я міг сказати, що щось не так, як я бачив у файлах журналу ключових кодів (наприклад, вкладений вище приклад). Виявляється, я повинен був використовувати файл vimrc, необхідний правилами VimGolf. Зокрема ця лінія
set t_RV=
призводить до правильної реєстрації. Приклад "з'являється на екрані" вище насправді виглядатиме так:
^VGI0. ^[gvg^AZZ
Тепер можна побачити пряму лінію від цієї "сирої" рядка до наданої форми VimGolf.