Bagaimana vimgolf merekam semua penekanan tombol?


10

Dari waktu ke waktu saya suka terlibat dalam putaran vimgolf . Itu bisa mencerahkan.

Bagaimana mereka bisa merekam semua penekanan tombol? Itu harus menjadi fitur vim. Ada yang tahu bagaimana melakukan itu. Mungkin berguna untuk merekam segala sesuatu dalam keadaan tertentu.


1
Saya baru tahu bahwa kita memiliki pertanyaan yang hampir serupa di sini
statox

Jawaban:


10

Mereka mungkin menggunakan parameter bawaan -w, lihat :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}

Sunting Seperti @B Layer menunjukkan kode aktual menggunakan -Wparameter yang pada dasarnya sama dengan -wtetapi file log ditimpa alih-alih menambahkan penekanan tombol untuk itu ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}

Tebakan yang bagus! Ini -Wbukan -w(lihat jawaban saya) tapi masih ...
B Lapisan

@BLayer Diputar dengan baik Saya terlalu malas untuk melihat kode mereka :-) Saya akan memperbarui dengan doc -Wyang pada dasarnya sama.
statox

1
Ya. Cukup tambahkan vs tulis.
B Layer

A (baik) tebakan mengungguli dan diterima atas jawaban yang diteliti dan berdasarkan fakta? Ketidakadilan yang serius telah terjadi. :( ... LOL
B Layer

1
Ini adalah gerakan yang mulia. Saya dengan rendah hati menerima suara Anda, tuan atau nyonya yang baik. Dilly dilly.
B Layer

14

Saya tidak berpikir itu sesederhana itu tetapi Anda dapat melihat sendiri kode Ruby di sini:

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

Saya melihat kelas untuk keylogging, untuk satu.

Inilah perintah yang digunakan untuk meluncurkan vimdi 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 (hampir) benar tentang -w outfile... -W outfile, sebenarnya, yang menimpa file yang diketik karakter yang dikirim daripada menambahkannya. Tapi seperti yang saya katakan, tidak "sesederhana itu" ... membandingkan konten dari salah satu file dan apa yang dihasilkan oleh alat vimgolf. Ini dari masalah vimgolf yang sebenarnya ...

-W output ketika disalin lalu ditempel di sini:

GI0. ý`gvgý`ZZ

Beberapa karakter non-cetak "hilang dalam terjemahan".

-W output seperti yang muncul di layar:

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

Yah, itu agak jelek.

vimgolf ditampilkan / diunggah keluaran:

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

Ahh, itu lebih baik.


Pembaruan: Saya menghabiskan beberapa menit mencari sesuatu yang lebih dekat dan memiliki beberapa informasi baru.

Pertama, keylogger kelas keylog.rb yang saya sebutkan di atas memang merupakan bagian utama dari teka-teki tetapi sebenarnya cukup mudah. Kode kunci yang dipancarkan Vim dan yang disimpan dalam -Wfile log adalah satu byte atau tiga byte (ditunjukkan oleh nilai byte pertama 0x80) dan ada peta hash untuk masing-masing dari dua set.

Versi satu-byte memetakan nilai byte ke representasi string dari kode kunci seperti 0atau g. Versi tiga byte sama memetakan string (misalnya <Esc>atau <C-V>) tetapi menggunakan sebagai kunci nilai gabungan byte dua dan tiga. Ada beberapa pengecualian / kasus sudut yang ditangani secara berbeda tetapi sebagian besar kode kunci diselesaikan melalui pencarian sederhana di kedua peta ini.

Melihat betapa mendasarnya kode logger kunci, saya dapat mengatakan ada sesuatu yang salah dengan apa yang saya lihat dalam file log kode kunci (seperti contoh yang ditempelkan di atas). Ternyata saya seharusnya menggunakan file vimrc yang diperlukan oleh aturan VimGolf. Khususnya baris ini

set t_RV= 

menghasilkan logging yang benar. Contoh "muncul di layar" di atas sebenarnya akan terlihat seperti ini:

^VGI0. ^[gvg^AZZ

Sekarang orang dapat melihat garis lurus dari string "mentah" ini ke bentuk yang diberikan VimGolf.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.