Tôi không nghĩ nó khá đơn giản nhưng bạn có thể tự mình xem mã Ruby ở đây:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
Tôi thấy một lớp học cho keylogging, cho một.
Đây là lệnh được sử dụng để khởi chạy vim
trong 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 đã (gần như) đúng về -w outfile
... -W outfile
, thực tế, nó ghi đè lên tệp mà các ký tự được nhập được gửi thay vì nối vào nó. Nhưng như tôi đã nói, không "hoàn toàn đơn giản" ... so sánh nội dung của một trong những tệp đó và những gì được tạo bởi công cụ vimgolf. Đây là từ một vấn đề vimgolf thực tế ...
-W
đầu ra khi sao chép rồi dán vào đây:
GI0. ý`gvgý`ZZ
Một số ký tự không in bị "mất dịch".
-W
đầu ra khi nó xuất hiện trên màn hình:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
Chà, thật là xấu xí.
vimgolf hiển thị / tải lên đầu ra:
<C-V>GI0. <Esc>gvg<C-A>ZZ
Ahh, tốt hơn rồi.
Cập nhật: Tôi đã dành một vài phút để xem xét kỹ hơn mọi thứ và có một vài thông tin mới.
Đầu tiên, lớp keylogger keylog.rb mà tôi đề cập ở trên thực sự là một phần chính của câu đố nhưng nó thực sự khá đơn giản. Các mã khóa mà Vim phát ra và được lưu trong -W
tệp nhật ký là một byte hoặc ba byte (được biểu thị bằng giá trị byte đầu tiên là 0x80) và có một bản đồ băm cho mỗi trong hai bộ.
Phiên bản một byte ánh xạ giá trị byte thành biểu diễn chuỗi của mã khóa, chẳng hạn như 0
hoặc g
. Phiên bản ba byte tương tự ánh xạ tới một chuỗi (ví dụ <Esc>
hoặc <C-V>
) nhưng sử dụng làm khóa cho các giá trị kết hợp của byte hai và ba. Có một số trường hợp ngoại lệ / trường hợp góc được xử lý khác nhau, nhưng phần lớn các mã khóa được giải quyết thông qua tra cứu đơn giản trong hai bản đồ này.
Xem mã cơ bản của mã logger như thế nào tôi có thể nói có gì đó không đúng với những gì tôi đã thấy trong các tệp nhật ký mã khóa (chẳng hạn như ví dụ được dán ở trên). Hóa ra tôi nên sử dụng tệp vimrc theo yêu cầu của quy tắc VimGolf. Đặc biệt dòng này
set t_RV=
kết quả trong việc đăng nhập chính xác. Ví dụ "xuất hiện trên màn hình" ở trên thực tế sẽ trông như thế này:
^VGI0. ^[gvg^AZZ
Bây giờ người ta có thể thấy đường thẳng từ chuỗi "thô" này đến dạng kết xuất của VimGolf.