Як 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}

Гарна здогадка! Це -Wне -w(див. Мою відповідь), але все ж ...
B Layer

@BLayer Добре зіграв, я був ледачий, щоб подивитися на їхній код :-) Я оновлю док, для -Wякого в основному те саме.
statox

1
Так. Просто додайте vs write.
B Layer

А (гарна) здогадка перемагає і приймається через добре вивчену на фактах відповідь? Нанесена серйозна несправедливість. :( ... LOL
B Layer

1
- Це шляхетний жест. Я смиренно приймаю ваш голос, добрий пане або пані. Досить розвести.
B Layer

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. Це з актуальної проблеми 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.