मुझे नहीं लगता कि यह काफी सरल है, लेकिन आप रूबी कोड को खुद यहां देख सकते हैं:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
मैं कीलिंग के लिए एक वर्ग देखता हूं, एक के लिए।
यहां वह कमांड दिया गया है जिसका उपयोग lib / vimgolf / cli.rbvim
में लॉन्च करने के लिए किया जाता है :
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 समस्या से है ...
-W
आउटपुट जब कॉपी किया जाता है तो यहां चिपकाया जाता है:
GI0. ý`gvgý`ZZ
कई गैर-मुद्रण वर्णों को "अनुवाद में खो गया" मिला।
-W
आउटपुट ऑन-स्क्रीन पर दिखाई देता है:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
खैर, यह थोड़े बदसूरत है।
vimgolf प्रदर्शित / अपलोड किया गया आउटपुट:
<C-V>GI0. <Esc>gvg<C-A>ZZ
आह, यह बेहतर है।
अपडेट: मैंने कुछ मिनट बिताए और चीजों को थोड़ा करीब से देखा और कुछ नई जानकारी हासिल की।
सबसे पहले, keylogger वर्ग keylog.rb जिसका मैं ऊपर उल्लेख करता हूं, वास्तव में पहेली का एक प्रमुख टुकड़ा है लेकिन यह वास्तव में काफी सीधा है। कीमकोड जो विम का उत्सर्जन करता है और जो -W
लॉग फ़ाइल में सहेजे जाते हैं, वे या तो एक बाइट या तीन बाइट्स (0x80 के पहले बाइट मान द्वारा दर्शाए गए) होते हैं और दोनों सेटों में से प्रत्येक के लिए एक हैश मैप होता है।
एक-बाइट संस्करण बाइट मान को कीकोड के एक स्ट्रिंग प्रतिनिधित्व जैसे कि 0
या g
। तीन-बाइट संस्करण इसी तरह से एक स्ट्रिंग (जैसे <Esc>
या <C-V>
) के लिए मैप करता है, लेकिन बाइट्स के संयुक्त मूल्यों के रूप में दो और तीन का उपयोग करता है। कुछ अपवाद / कोने-मामले हैं जिन्हें अलग-अलग तरीके से संभाला जाता है, लेकिन अधिकांश कुंजीकोड को इन दो मानचित्रों में सरल लुकअप के माध्यम से हल किया जाता है।
कुंजी लॉगर कोड कितना बुनियादी था यह देखकर कि मैं कुछ बता सकता हूं कि मैं कीकोड लॉग फाइलों में क्या देख रहा था (जैसे कि ऊपर उदाहरण में चिपकाया गया था)। यह पता चला है कि मुझे VimGolf नियमों द्वारा आवश्यक vimrc फ़ाइल का उपयोग करना चाहिए था। विशेष रूप से इस लाइन में
set t_RV=
सही लॉगिंग में परिणाम। ऊपर "स्क्रीन पर दिखाई देता है" उदाहरण वास्तव में इस तरह दिखेगा:
^VGI0. ^[gvg^AZZ
अब कोई भी इस "कच्चे" तार से सीधी रेखा को विमगोल्फ के रेंडर रूप में देख सकता है।