vimgolfはすべてのキーストロークをどのように記録しますか?


10

時々私はvimgolfのラウンドに従事するのが好きです。それは啓発的です。

どのようにしてすべてのキーストロークを記録できますか?それは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}

Edit As @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
うん。追加するか書き込むだけです。
Bレイヤー

(良い)推測は裏付けられ、よく研究された事実に基づいた答えで受け入れられますか?重大な不正が行われました。:( ... LOL
Bレイヤー

1
これは高貴なジェスチャーです。私は謙虚にあなたの投票を受け入れます、良いサーかマダム。Dilly dilly。
Bレイヤー

14

それほど単純ではないと思いますが、Rubyコードを自分で確認できます。

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

1つは、キーロギング用のクラスです。

lib / vimgolf / cli.rbで起動vimするために使用されるコマンドは次のとおりです。

 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実際、入力された文字の送信先のファイルに追加するのではなく、ファイルを上書きします。しかし、私が言ったように、「それほど単純ではない」...それらのファイルの1つのコンテンツと、vimgolfツールによって生成されるものを比較してください。これは実際のvimgolf問題からのものです...

-W コピーしてここに貼り付けたときの出力:

GI0. ý`gvgý`ZZ

いくつかの非印刷文字が「翻訳で失われました」。

-W 画面に表示される出力:

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

まあ、それはちょっと醜いです。

vimgolfの表示/アップロードされた出力:

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

ああ、それは良いです。


更新:私は数分を少し詳しく調べて、いくつか新しい情報を得ました。

まず、上記のキーロガークラスkeylog.rbは確かにパズルの主要部分ですが、実際にはかなり単純です。Vimが発行し、-Wログファイルに保存されるキーコードは1バイトまたは3バイト(最初のバイト値0x80で示される)であり、2つのセットのそれぞれにハッシュマップがあります。

1バイトバージョンは、バイト値を、0またはなどのキーコードの文字列表現にマップしますg。3バイトバージョンも同様に文字列(<Esc>または<C-V>)にマップしますが、キーとしてバイト2と3の結合値を使用します。別の方法で処理されるいくつかの例外/コーナーケースがありますが、キーコードの大部分は、これら2つのマップでの単純なルックアップによって解決されます。

キーロガーコードの基本がどの程度かを確認すると、キーコードログファイルに表示されているもの(上記の例に貼り付けた例など)に問題があることがわかりました。VimGolfルールで必要なvimrcファイルを使用する必要があったことがわかりました。特にこの行

set t_RV= 

結果は正しいログになります。上記の「画面に表示される」例は、実際には次のようになります。

^VGI0. ^[gvg^AZZ

これで、この「生の」文字列からVimGolfのレンダリングされたフォームまでの直線を見ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.