回答:
彼らはおそらく組み込みパラメータを使用します-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
(私の回答を参照)ではありませんが、それでも...
-W
は基本的に同じであるドキュメントで更新します。
それほど単純ではないと思いますが、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のレンダリングされたフォームまでの直線を見ることができます。