Как vimgolf записывает все нажатия клавиш?

10

Время от времени мне нравится участвовать в раунде вимгольфа . Это может быть поучительно.

Как они могут записывать все нажатия клавиш? Это должно быть особенность vim. Кто-нибудь есть идеи, как это сделать. Это может пригодиться для записи всего при определенных обстоятельствах.

Майк
источник
1
Я только что узнал , что у нас есть довольно подобный вопрос здесь
statox

Ответы:

10

Они, вероятно, используют встроенный параметр -w, см . :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}

Редактировать Как @B Layer указал, что фактический код использует -Wпараметр, который в основном такой же, как, -wно файл журнала перезаписывается вместо добавления к нему нажатий клавиш ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}
statox
источник
Хорошая догадка! Это -Wне так -w(см. Мой ответ), но все же ...
Уровень B
@BLayer Хорошо играл, мне было лень смотреть их код :-) Я обновлю документацию, для -Wкоторой в основном то же самое.
statox
1
Ага. Просто добавить против записи.
Слой
(Хорошая) догадка опережает и принимается за хорошо изученный, основанный на фактах ответ? Серьезная несправедливость была совершена. :( ... LOL
B Слой
1
«Это благородный жест. Я смиренно принимаю ваш голос, добрый сэр или мадам. Дилли Дилли.
B Слой
14

Я не думаю, что это так просто, но вы можете посмотреть код 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. Это из актуальной проблемы с вимгольфом ...

-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.

B слой
источник