Zaman zaman bir vimgolf turuna katılmayı severim . Aydınlatıcı olabilir.
Tüm tuş vuruşlarını nasıl kaydedebilirler? Bu bir vim özelliği olmalı. Bunu nasıl yapacağını bilen herhangi bir kimse. Belirli durumlarda her şeyi kaydetmek faydalı olabilir.
Zaman zaman bir vimgolf turuna katılmayı severim . Aydınlatıcı olabilir.
Tüm tuş vuruşlarını nasıl kaydedebilirler? Bu bir vim özelliği olmalı. Bunu nasıl yapacağını bilen herhangi bir kimse. Belirli durumlarda her şeyi kaydetmek faydalı olabilir.
Yanıtlar:
Muhtemelen yerleşik parametreyi kullanırlar -w
, bakınız :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 Olarak Düzenle Katmanı, gerçek kodun -W
temelde aynı olan parametreyi kullandığına dikkat çekti , -w
ancak tuş vuruşlarına eklemek yerine günlük dosyasının üzerine yazılır ( :h -W
):
-W {scriptout} Like -w, but do not append, overwrite an existing file.
{not in Vi}
-W
değil -w
... (benim cevap bakınız) ama yine de
-W
temelde aynı olan doc ile güncelleme edeceğiz .
Bu kadar basit olduğunu sanmıyorum ama Ruby koduna buradan bakabilirsiniz:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
Biri için keylogging için bir sınıf görüyorum.
İşte başlatılması için kullanılan komut var vim
içinde 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 (hemen hemen) haklıydı -w outfile
... -W outfile
aslında, yazılan karakterlerin eklenmesi yerine gönderildiği dosyanın üzerine yazar. Ama dediğim gibi, "bu kadar basit" değil ... bu dosyalardan birinin içeriğini ve vimgolf aracı tarafından üretilenleri karşılaştırın. Bu gerçek bir vimgolf probleminden ...
-W
kopyalandığında çıktı alın ve buraya yapıştırın:
GI0. ý`gvgý`ZZ
Basılı olmayan bazı karakterler "çeviride kayboldu".
-W
Ekranda göründüğü şekliyle çıktı alın:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
Bu biraz çirkin.
vimgolf görüntülenen / yüklenen çıktı:
<C-V>GI0. <Esc>gvg<C-A>ZZ
Ahh, bu daha iyi.
Güncelleme: İşlere biraz daha yakından bakarak birkaç dakika geçirdim ve birkaç yeni bilgi aldım.
İlk olarak, yukarıda bahsettiğim keylogger sınıfı keylog.rb aslında bulmacanın önemli bir parçası ama aslında oldukça basit. Vim'in yayınladığı ve -W
günlük dosyasına kaydedilen anahtar kodları ya bir bayt ya da üç bayttır (0x80'in ilk bayt değeri ile gösterilir) ve iki kümenin her biri için bir karma haritası vardır.
Tek baytlık sürüm, bayt değerini 0
veya gibi anahtar kodunun dize ile eşleşir g
. Üç baytlık sürüm benzer bir şekilde bir dizeyle (örneğin <Esc>
veya <C-V>
) eşleşir, ancak anahtar olarak iki ve üç baytın birleşik değerlerini kullanır. Farklı ele alınan bazı istisnalar / köşe vakaları vardır, ancak anahtar kodların büyük çoğunluğu bu iki haritada basit aramalarla çözülür.
Key logger kodunun ne kadar temel olduğunu görünce, anahtar kodu günlük dosyalarında (yukarıda yapıştırılan örnek gibi) gördüğüm şeyle ilgili bir sorun olduğunu söyleyebilirim. VimGolf kuralları için gerekli vimrc dosyasını kullanmış olmalıyım. Özellikle bu çizgi
set t_RV=
doğru günlüğe kaydetme ile sonuçlanır. Yukarıdaki "ekranda görünür" örneği aslında şöyle görünür:
^VGI0. ^[gvg^AZZ
Şimdi bu "ham" dizeden VimGolf'un oluşturulmuş formuna kadar olan düz çizgiyi görebilirsiniz.