vimgolf 0.4.8 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa977b97d4db6d04b7f55abf4c6b672cd4694c8b
4
- data.tar.gz: 07474b8eb02fca5466750c11ae4fa3bc1b5a3032
3
+ metadata.gz: 54dea0f839cd9e4b251b1b3d9f1b8d1be31fb0dc
4
+ data.tar.gz: 0e96fa1acc4894b104702e6492748742ea42204c
5
5
  SHA512:
6
- metadata.gz: 945130f0b1a0d47727dfcebbde3855b0bc305deb52806367b850fcc581ff3d005aed6eea2ef9a0eebb0de48f440abe42529f7f887a81179990ad190ae183d853
7
- data.tar.gz: da3aa69104147971b20f5741c3ceeb91cdc965f2a81e6fdae1f0e67fb864dda65d9b1bf664247587b3e8538a8ddf34a58525bf2b7625d2fe78dc509d0e0172d0
6
+ metadata.gz: 2d413648da95e0c81b4f0668841605732e8265d373f56c5a98afd771d304ed547b19d8f2551e4cd007bbed2ab77d0607c2b81eedb90d22735c6159eb74b46e12
7
+ data.tar.gz: bf03e208e358a3522d4c0fb6e3fcbb301a44b6202f3f9b9900c1d3a8e78820558ea7783b5ee208d180f5b22c0cfd79a687ed462ff372846158ab87cf84f20714
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # [VimGolf.com](http://www.vimgolf.com) Client
1
+ # [VimGolf.com](http://www.vimgolf.com) CLI Client
2
2
 
3
3
  Real Vim ninjas count every keystroke - do you? Head on over to vimgolf.com, pick a challenge, and show us what you've got!
4
4
 
@@ -14,16 +14,8 @@ When you launch a challenge from the command line, it will be downloaded from th
14
14
  $> gem install vimgolf
15
15
 
16
16
  (Go to vimgolf.com, sign in, and grab your API key)
17
- $> vimgolf setup
17
+ $> vimgolf setup
18
18
 
19
19
  (Pick a challenge on vimgolf.com)
20
20
  $> vimgolf put [challenge ID]
21
21
  ```
22
-
23
- **Emacs**: yes, it is true, you can [play vimgolf in emacs too](https://github.com/igrigorik/vimgolf/tree/master/emacs)!
24
-
25
- Patches, tips and ideas are welcome!
26
-
27
- ## License
28
-
29
- (MIT License) - Copyright (c) 2010 Ilya Grigorik
@@ -91,7 +91,7 @@ module VimGolf
91
91
 
92
92
  proxy.start(url.host, url.port) do |http|
93
93
  request = Net::HTTP::Post.new(url.request_uri)
94
- request.set_form_data({"challenge_id" => @id, "apikey" => Config.load['key'], "entry" => IO.read(log_path)})
94
+ request.set_form_data({"challenge_id" => @id, "apikey" => Config.load['key'], "entry" => IO.binread(log_path)})
95
95
  request["Accept"] = "application/json"
96
96
 
97
97
  res = http.request(request)
data/lib/vimgolf/cli.rb CHANGED
@@ -32,6 +32,15 @@ module VimGolf
32
32
  super
33
33
  end
34
34
 
35
+ desc "version", "print version of Vimgolf client"
36
+ long_desc <<-DESC
37
+ Print version of the Vimgolf client.
38
+ DESC
39
+
40
+ def version
41
+ VimGolf.ui.info "Client #{Vimgolf::VERSION}"
42
+ end
43
+
35
44
  desc "setup", "configure your VimGolf credentials"
36
45
  long_desc <<-DESC
37
46
  To participate in the challenge please go to vimgolf.com and register an
@@ -109,12 +118,15 @@ module VimGolf
109
118
  # -u vimrc - load vimgolf .vimrc to level the playing field
110
119
  # -U NONE - don't load .gvimrc
111
120
  # -W logfile - keylog file (overwrites if already exists)
112
- vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin --nofork -i NONE +0 -u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}
121
+ vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin -i NONE +0 -u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}
122
+ if GOLFVIM == "gvim"
123
+ vimcmd += %W{ --nofork}
124
+ end
113
125
  debug(vimcmd)
114
126
  system(*vimcmd) # assembled as an array, bypasses the shell
115
127
 
116
128
  if $?.exitstatus.zero?
117
- log = Keylog.new(IO.read(challenge.log_path))
129
+ log = Keylog.new(IO.binread(challenge.log_path))
118
130
 
119
131
  VimGolf.ui.info "\nHere are your keystrokes:"
120
132
  VimGolf.ui.print_log log
@@ -1,258 +1,271 @@
1
- # encoding: UTF-8
1
+ # encoding: ASCII-8BIT
2
+ # Force encoding of string literals. Must match solution text.
2
3
 
3
4
  module VimGolf
4
5
  class Keylog
5
6
  include Enumerable
6
7
 
7
- alias_method :convert , :to_s
8
- alias_method :score , :count
9
-
10
- def initialize(input)
11
- @input = input
8
+ def initialize(input, time=Time.now.utc)
9
+ # Force encoding of solution text. Must match string literals.
10
+ # .force_encoding CHANGES THE ORIGINAL STRING!
11
+ @input = input.force_encoding(Encoding::ASCII_8BIT)
12
+ @time = time
12
13
  end
13
14
 
14
15
  def to_s(sep = '')
15
16
  to_a.join(sep)
16
17
  end
17
18
 
19
+ alias_method :convert , :to_s
20
+ alias_method :score , :count
21
+
18
22
  def each
19
23
  scanner = StringScanner.new(@input)
20
- output = ""
21
-
22
- until scanner.eos?
23
- c = scanner.get_byte
24
- n = c.unpack('C').first
25
-
26
- out_char = \
27
- case n
28
-
29
- # Special platform-independent encoding stuff
30
- when 0x80
31
- code = scanner.get_byte + scanner.get_byte
32
24
 
33
- # This list has been populated by looking at
34
- # :h terminal-options and vim source files:
35
- # keymap.h and misc2.c
36
- case code
37
- when "k1"; "<F1>"
38
- when "k2"; "<F2>"
39
- when "k3"; "<F3>"
40
- when "k4"; "<F4>"
41
- when "k5"; "<F5>"
42
- when "k6"; "<F6>"
43
- when "k7"; "<F7>"
44
- when "k8"; "<F8>"
45
- when "k9"; "<F9>"
46
- when "k;"; "<F10>"
47
- when "F1"; "<F11>"
48
- when "F2"; "<F12>"
49
- when "F3"; "<F13>"
50
- when "F4"; "<F14>"
51
- when "F5"; "<F15>"
52
- when "F6"; "<F16>"
53
- when "F7"; "<F17>"
54
- when "F8"; "<F18>"
55
- when "F9"; "<F19>"
56
-
57
- when "%1"; "<Help>"
58
- when "&8"; "<Undo>"
59
- when "#2"; "<S-Home>"
60
- when "*7"; "<S-End>"
61
- when "K1"; "<kHome>"
62
- when "K4"; "<kEnd>"
63
- when "K3"; "<kPageUp>"
64
- when "K5"; "<kPageDown>"
65
- when "K6"; "<kPlus>"
66
- when "K7"; "<kMinus>"
67
- when "K8"; "<kDivide>"
68
- when "K9"; "<kMultiply>"
69
- when "KA"; "<kEnter>"
70
- when "KB"; "<kPoint>"
71
- when "KC"; "<k0>"
72
- when "KD"; "<k1>"
73
- when "KE"; "<k2>"
74
- when "KF"; "<k3>"
75
- when "KG"; "<k4>"
76
- when "KH"; "<k5>"
77
- when "KI"; "<k6>"
78
- when "KJ"; "<k7>"
79
- when "KK"; "<k8>"
80
- when "KL"; "<k9>"
81
-
82
- when "kP"; "<PageUp>"
83
- when "kN"; "<PageDown>"
84
- when "kh"; "<Home>"
85
- when "@7"; "<End>"
86
- when "kI"; "<Insert>"
87
- when "kD"; "<Del>"
88
- when "kb"; "<BS>"
25
+ # A Vim keycode is either a single byte, or a 3-byte sequence starting
26
+ # with 0x80.
27
+ while (c = scanner.get_byte)
28
+ n = c.ord
29
+ if n == 0x80
30
+ b2, b3 = scanner.get_byte, scanner.get_byte
31
+ if b2 == "\xfd" && b3 >= "\x38" && @time.between?(*NO_SNIFF_DATE_RANGE)
32
+ # Should we account for KE_SNIFF removal?
33
+ b3 = (b3.ord + 1).chr
34
+ end
35
+ code = KC_MBYTE[b2+b3]
36
+ yield code if code # ignore "nil" keystrokes (like window focus)
37
+ else
38
+ yield KC_1BYTE[n]
39
+ end
40
+ end
41
+ end
89
42
 
90
- when "ku"; "<Up>"
91
- when "kd"; "<Down>"
92
- when "kl"; "<Left>"
93
- when "kr"; "<Right>"
94
- when "#4"; "<S-Left>"
95
- when "%i"; "<S-Right>"
43
+ # Quick lookup array for single-byte keycodes
44
+ KC_1BYTE = []
45
+ (0..255).each {|n| KC_1BYTE.push("<%#04x>" % n)} # Fallback for non-ASCII
46
+ (1..127).each {|n| KC_1BYTE[n] = "<C-#{(n ^ 0x40).chr}>"}
47
+ (32..126).each {|c| KC_1BYTE[c] = c.chr } # Printing chars
48
+ KC_1BYTE[0x1b] = "<Esc>" # Special names for a few control chars
49
+ KC_1BYTE[0x0d] = "<CR>"
50
+ KC_1BYTE[0x0a] = "<NL>"
51
+ KC_1BYTE[0x09] = "<Tab>"
96
52
 
97
- when "kB"; "<S-Tab>"
98
- when "\xffX"; "<C-@>"
53
+ # Between these dates, assume KE_SNIFF is removed.
54
+ NO_SNIFF_DATE_RANGE = [Time.utc(2016, 4), Time.utc(2017, 7)]
99
55
 
100
- # This is how you escape literal 0x80
101
- when "\xfeX"; "<0x80>"
56
+ KC_MBYTE = Hash.new do |_h,k|
57
+ '<' + k.bytes.map {|b| "%02x" % b}.join('-') + '>' # For missing keycodes
58
+ end.update({
59
+ # This list has been populated by looking at
60
+ # :h terminal-options and vim source files:
61
+ # keymap.h and misc2.c
62
+ "k1" => "<F1>",
63
+ "k2" => "<F2>",
64
+ "k3" => "<F3>",
65
+ "k4" => "<F4>",
66
+ "k5" => "<F5>",
67
+ "k6" => "<F6>",
68
+ "k7" => "<F7>",
69
+ "k8" => "<F8>",
70
+ "k9" => "<F9>",
71
+ "k;" => "<F10>",
72
+ "F1" => "<F11>",
73
+ "F2" => "<F12>",
74
+ "F3" => "<F13>",
75
+ "F4" => "<F14>",
76
+ "F5" => "<F15>",
77
+ "F6" => "<F16>",
78
+ "F7" => "<F17>",
79
+ "F8" => "<F18>",
80
+ "F9" => "<F19>",
102
81
 
103
- # These rarely-used modifiers should be combined with the next
104
- # stroke (like <S-Space>), but let's put them here for now
105
- when "\xfc\x02"; "<S->"
106
- when "\xfc\x04"; "<C->"
107
- when "\xfc\x06"; "<C-S->"
108
- when "\xfc\x08"; "<A->"
109
- when "\xfc\x0a"; "<A-S->"
110
- when "\xfc\x0c"; "<C-A>"
111
- when "\xfc\x0e"; "<C-A-S->"
112
- when "\xfc\x10"; "<M->"
113
- when "\xfc\x12"; "<M-S->"
114
- when "\xfc\x14"; "<M-C->"
115
- when "\xfc\x16"; "<M-C-S->"
116
- when "\xfc\x18"; "<M-A->"
117
- when "\xfc\x1a"; "<M-A-S->"
118
- when "\xfc\x1c"; "<M-C-A>"
119
- when "\xfc\x1e"; "<M-C-A-S->"
82
+ "%1" => "<Help>",
83
+ "&8" => "<Undo>",
84
+ "#2" => "<S-Home>",
85
+ "*7" => "<S-End>",
86
+ "K1" => "<kHome>",
87
+ "K4" => "<kEnd>",
88
+ "K3" => "<kPageUp>",
89
+ "K5" => "<kPageDown>",
90
+ "K6" => "<kPlus>",
91
+ "K7" => "<kMinus>",
92
+ "K8" => "<kDivide>",
93
+ "K9" => "<kMultiply>",
94
+ "KA" => "<kEnter>",
95
+ "KB" => "<kPoint>",
96
+ "KC" => "<k0>",
97
+ "KD" => "<k1>",
98
+ "KE" => "<k2>",
99
+ "KF" => "<k3>",
100
+ "KG" => "<k4>",
101
+ "KH" => "<k5>",
102
+ "KI" => "<k6>",
103
+ "KJ" => "<k7>",
104
+ "KK" => "<k8>",
105
+ "KL" => "<k9>",
120
106
 
121
- when "\xfd\x4"; "<S-Up>"
122
- when "\xfd\x5"; "<S-Down>"
123
- when "\xfd\x6"; "<S-F1>"
124
- when "\xfd\x7"; "<S-F2>"
125
- when "\xfd\x8"; "<S-F3>"
126
- when "\xfd\x9"; "<S-F4>"
127
- when "\xfd\xa"; "<S-F5>"
128
- when "\xfd\xb"; "<S-F6>"
129
- when "\xfd\xc"; "<S-F7>"
130
- when "\xfd\xd"; "<S-F9>"
131
- when "\xfd\xe"; "<S-F10>"
132
- when "\xfd\xf"; "<S-F10>"
133
- when "\xfd\x10"; "<S-F11>"
134
- when "\xfd\x11"; "<S-F12>"
135
- when "\xfd\x12"; "<S-F13>"
136
- when "\xfd\x13"; "<S-F14>"
137
- when "\xfd\x14"; "<S-F15>"
138
- when "\xfd\x15"; "<S-F16>"
139
- when "\xfd\x16"; "<S-F17>"
140
- when "\xfd\x17"; "<S-F18>"
141
- when "\xfd\x18"; "<S-F19>"
142
- when "\xfd\x19"; "<S-F20>"
143
- when "\xfd\x1a"; "<S-F21>"
144
- when "\xfd\x1b"; "<S-F22>"
145
- when "\xfd\x1c"; "<S-F23>"
146
- when "\xfd\x1d"; "<S-F24>"
147
- when "\xfd\x1e"; "<S-F25>"
148
- when "\xfd\x1f"; "<S-F26>"
149
- when "\xfd\x20"; "<S-F27>"
150
- when "\xfd\x21"; "<S-F28>"
151
- when "\xfd\x22"; "<S-F29>"
152
- when "\xfd\x23"; "<S-F30>"
153
- when "\xfd\x24"; "<S-F31>"
154
- when "\xfd\x25"; "<S-F32>"
155
- when "\xfd\x26"; "<S-F33>"
156
- when "\xfd\x27"; "<S-F34>"
157
- when "\xfd\x28"; "<S-F35>"
158
- when "\xfd\x29"; "<S-F36>"
159
- when "\xfd\x2a"; "<S-F37>"
160
- when "\xfd\x2b"; "<Mouse>"
161
- when "\xfd\x2c"; "<LeftMouse>"
162
- when "\xfd\x2d"; "<LeftDrag>"
163
- when "\xfd\x2e"; "<LeftRelease>"
164
- when "\xfd\x2f"; "<MiddleMouse>"
165
- when "\xfd\x30"; "<MiddleDrag>"
166
- when "\xfd\x31"; "<MiddleRelease>"
167
- when "\xfd\x32"; "<RightMouse>"
168
- when "\xfd\x33"; "<RightDrag>"
169
- when "\xfd\x34"; "<RightRelease>"
170
- when "\xfd\x35"; nil # KE_IGNORE
171
- #when "\xfd\x36"; "KE_TAB"
172
- #when "\xfd\x37"; "KE_S_TAB_OLD"
173
- #when "\xfd\x38"; "KE_SNIFF"
174
- #when "\xfd\x39"; "KE_XF1"
175
- #when "\xfd\x3a"; "KE_XF2"
176
- #when "\xfd\x3b"; "KE_XF3"
177
- #when "\xfd\x3c"; "KE_XF4"
178
- #when "\xfd\x3d"; "KE_XEND"
179
- #when "\xfd\x3e"; "KE_ZEND"
180
- #when "\xfd\x3f"; "KE_XHOME"
181
- #when "\xfd\x40"; "KE_ZHOME"
182
- #when "\xfd\x41"; "KE_XUP"
183
- #when "\xfd\x42"; "KE_XDOWN"
184
- #when "\xfd\x43"; "KE_XLEFT"
185
- #when "\xfd\x44"; "KE_XRIGHT"
186
- #when "\xfd\x45"; "KE_LEFTMOUSE_NM"
187
- #when "\xfd\x46"; "KE_LEFTRELEASE_NM"
188
- #when "\xfd\x47"; "KE_S_XF1"
189
- #when "\xfd\x48"; "KE_S_XF2"
190
- #when "\xfd\x49"; "KE_S_XF3"
191
- #when "\xfd\x4a"; "KE_S_XF4"
192
- when "\xfd\x4b"; "<ScrollWheelUp>"
193
- when "\xfd\x4c"; "<ScrollWheelDown>"
107
+ "kP" => "<PageUp>",
108
+ "kN" => "<PageDown>",
109
+ "kh" => "<Home>",
110
+ "@7" => "<End>",
111
+ "kI" => "<Insert>",
112
+ "kD" => "<Del>",
113
+ "kb" => "<BS>",
194
114
 
195
- # Horizontal scroll wheel support was added in Vim 7.3c. These
196
- # 2 entries shifted the rest of the KS_EXTRA mappings down 2.
197
- # Though Vim 7.2 is rare today, it was common soon after
198
- # vimgolf.com was launched. In cases where the 7.3 code is
199
- # never used but the 7.2 code was common, it makes sense to use
200
- # the 7.2 code. There are conflicts though, so some legacy
201
- # keycodes have to stay wrong.
202
- when "\xfd\x4d"; "<ScrollWheelRight>"
203
- when "\xfd\x4e"; "<ScrollWheelLeft>"
204
- when "\xfd\x4f"; "<kInsert>"
205
- when "\xfd\x50"; "<kDel>"
206
- when "\xfd\x51"; "<0x9b>" # :help <CSI>
207
- #when "\xfd\x52"; "KE_SNR"
208
- #when "\xfd\x53"; "KE_PLUG" # never used
209
- when "\xfd\x53"; "<C-Left>" # 7.2 compat
210
- #when "\xfd\x54"; "KE_CMDWIN" # never used
211
- when "\xfd\x54"; "<C-Right>" # 7.2 compat
212
- when "\xfd\x55"; "<C-Left>" # 7.2 <C-Home> conflict
213
- when "\xfd\x56"; "<C-Right>" # 7.2 <C-End> conflict
214
- when "\xfd\x57"; "<C-Home>"
215
- when "\xfd\x58"; "<C-End>"
216
- #when "\xfd\x59"; "KE_X1MOUSE"
217
- #when "\xfd\x5a"; "KE_X1DRAG"
218
- #when "\xfd\x5b"; "KE_X1RELEASE"
219
- #when "\xfd\x5c"; "KE_X2MOUSE"
220
- #when "\xfd\x5d"; "KE_X2DRAG"
221
- #when "\xfd\x5e"; "KE_X2RELEASE"
222
- when "\xfd\x5e"; nil # 7.2 compat (I think?)
223
- #when "\xfd\x5f"; "KE_DROP"
224
- #when "\xfd\x60"; "KE_CURSORHOLD"
225
- when "\xfd\x60"; nil # 7.2 Focus Gained compat
226
- #when "\xfd\x61"; "KE_NOP"
227
- when "\xfd\x62"; nil # Focus Gained (GVIM)
228
- when "\xfd\x63"; nil # Focus Lost (GVIM)
115
+ "ku" => "<Up>",
116
+ "kd" => "<Down>",
117
+ "kl" => "<Left>",
118
+ "kr" => "<Right>",
119
+ "#4" => "<S-Left>",
120
+ "%i" => "<S-Right>",
229
121
 
230
- else
231
- #puts "Unknown Vim code: #{code.inspect}"
232
- '<%02x-%02x>' % code.unpack('CC')
233
- end
122
+ "kB" => "<S-Tab>",
123
+ "\xffX" => "<C-@>",
234
124
 
235
- # Printable ASCII
236
- when 32..126; c
125
+ # This is how you escape literal 0x80
126
+ "\xfeX" => "<0x80>",
237
127
 
238
- # Control characters with special names
239
- when 0; "<Nul>"
240
- when 9; "<Tab>"
241
- when 10; "<NL>"
242
- when 13; "<CR>"
243
- when 27; "<Esc>"
128
+ # These rarely-used modifiers should be combined with the next
129
+ # stroke (like <S-Space>), but let's put them here for now
130
+ "\xfc\x02" => "<S->",
131
+ "\xfc\x04" => "<C->",
132
+ "\xfc\x06" => "<C-S->",
133
+ "\xfc\x08" => "<A->",
134
+ "\xfc\x0a" => "<A-S->",
135
+ "\xfc\x0c" => "<C-A>",
136
+ "\xfc\x0e" => "<C-A-S->",
137
+ "\xfc\x10" => "<M->",
138
+ "\xfc\x12" => "<M-S->",
139
+ "\xfc\x14" => "<M-C->",
140
+ "\xfc\x16" => "<M-C-S->",
141
+ "\xfc\x18" => "<M-A->",
142
+ "\xfc\x1a" => "<M-A-S->",
143
+ "\xfc\x1c" => "<M-C-A>",
144
+ "\xfc\x1e" => "<M-C-A-S->",
244
145
 
245
- # Otherwise, use <C-x> format. Flip bit 7
246
- when 0..127; "<C-#{(n ^ 0x40).chr}>"
146
+ # KS_EXTRA keycodes (starting with 0x80 0xfd) are defined by an enum in
147
+ # Vim's keymap.h. Sometimes, a new Vim adds or removes a keycode, which
148
+ # changes the binary representation of every keycode after it. Very
149
+ # annoying.
150
+ "\xfd\x4" => "<S-Up>",
151
+ "\xfd\x5" => "<S-Down>",
152
+ "\xfd\x6" => "<S-F1>",
153
+ "\xfd\x7" => "<S-F2>",
154
+ "\xfd\x8" => "<S-F3>",
155
+ "\xfd\x9" => "<S-F4>",
156
+ "\xfd\xa" => "<S-F5>",
157
+ "\xfd\xb" => "<S-F6>",
158
+ "\xfd\xc" => "<S-F7>",
159
+ "\xfd\xd" => "<S-F9>",
160
+ "\xfd\xe" => "<S-F10>",
161
+ "\xfd\xf" => "<S-F10>",
162
+ "\xfd\x10" => "<S-F11>",
163
+ "\xfd\x11" => "<S-F12>",
164
+ "\xfd\x12" => "<S-F13>",
165
+ "\xfd\x13" => "<S-F14>",
166
+ "\xfd\x14" => "<S-F15>",
167
+ "\xfd\x15" => "<S-F16>",
168
+ "\xfd\x16" => "<S-F17>",
169
+ "\xfd\x17" => "<S-F18>",
170
+ "\xfd\x18" => "<S-F19>",
171
+ "\xfd\x19" => "<S-F20>",
172
+ "\xfd\x1a" => "<S-F21>",
173
+ "\xfd\x1b" => "<S-F22>",
174
+ "\xfd\x1c" => "<S-F23>",
175
+ "\xfd\x1d" => "<S-F24>",
176
+ "\xfd\x1e" => "<S-F25>",
177
+ "\xfd\x1f" => "<S-F26>",
178
+ "\xfd\x20" => "<S-F27>",
179
+ "\xfd\x21" => "<S-F28>",
180
+ "\xfd\x22" => "<S-F29>",
181
+ "\xfd\x23" => "<S-F30>",
182
+ "\xfd\x24" => "<S-F31>",
183
+ "\xfd\x25" => "<S-F32>",
184
+ "\xfd\x26" => "<S-F33>",
185
+ "\xfd\x27" => "<S-F34>",
186
+ "\xfd\x28" => "<S-F35>",
187
+ "\xfd\x29" => "<S-F36>",
188
+ "\xfd\x2a" => "<S-F37>",
189
+ "\xfd\x2b" => "<Mouse>",
190
+ "\xfd\x2c" => "<LeftMouse>",
191
+ "\xfd\x2d" => "<LeftDrag>",
192
+ "\xfd\x2e" => "<LeftRelease>",
193
+ "\xfd\x2f" => "<MiddleMouse>",
194
+ "\xfd\x30" => "<MiddleDrag>",
195
+ "\xfd\x31" => "<MiddleRelease>",
196
+ "\xfd\x32" => "<RightMouse>",
197
+ "\xfd\x33" => "<RightDrag>",
198
+ "\xfd\x34" => "<RightRelease>",
199
+ "\xfd\x35" => nil, # KE_IGNORE
200
+ #"\xfd\x36" => "KE_TAB",
201
+ #"\xfd\x37" => "KE_S_TAB_OLD",
247
202
 
248
- else
249
- #puts "Unexpected extended ASCII: #{'%#04x' % n}"
250
- '<%#04x>' % n
203
+ # Vim 7.4.1433 removed KE_SNIFF. Unfortunately, this changed the
204
+ # offset of every keycode after it.
205
+ # Vim 8.0.0697 added back a KE_SNIFF_UNUSED to fill in for the
206
+ # removed KE_SNIFF.
207
+ # Keycodes after this point should be accurate for vim < 7.4.1433
208
+ # and vim > 8.0.0697.
209
+ #"\xfd\x38" => "KE_SNIFF",
210
+ #"\xfd\x39" => "KE_XF1",
211
+ #"\xfd\x3a" => "KE_XF2",
212
+ #"\xfd\x3b" => "KE_XF3",
213
+ #"\xfd\x3c" => "KE_XF4",
214
+ #"\xfd\x3d" => "KE_XEND",
215
+ #"\xfd\x3e" => "KE_ZEND",
216
+ #"\xfd\x3f" => "KE_XHOME",
217
+ #"\xfd\x40" => "KE_ZHOME",
218
+ #"\xfd\x41" => "KE_XUP",
219
+ #"\xfd\x42" => "KE_XDOWN",
220
+ #"\xfd\x43" => "KE_XLEFT",
221
+ #"\xfd\x44" => "KE_XRIGHT",
222
+ #"\xfd\x45" => "KE_LEFTMOUSE_NM",
223
+ #"\xfd\x46" => "KE_LEFTRELEASE_NM",
224
+ #"\xfd\x47" => "KE_S_XF1",
225
+ #"\xfd\x48" => "KE_S_XF2",
226
+ #"\xfd\x49" => "KE_S_XF3",
227
+ #"\xfd\x4a" => "KE_S_XF4",
228
+ "\xfd\x4b" => "<ScrollWheelUp>",
229
+ "\xfd\x4c" => "<ScrollWheelDown>",
251
230
 
252
- end
231
+ # Horizontal scroll wheel support was added in Vim 7.3c. These
232
+ # 2 entries shifted the rest of the KS_EXTRA mappings down 2.
233
+ # Though Vim 7.2 is rare today, it was common soon after
234
+ # vimgolf.com was launched. In cases where the 7.3 code is
235
+ # never used but the 7.2 code was common, it makes sense to use
236
+ # the 7.2 code. There are conflicts though, so some legacy
237
+ # keycodes have to stay wrong.
238
+ "\xfd\x4d" => "<ScrollWheelRight>",
239
+ "\xfd\x4e" => "<ScrollWheelLeft>",
240
+ "\xfd\x4f" => "<kInsert>",
241
+ "\xfd\x50" => "<kDel>",
242
+ "\xfd\x51" => "<0x9b>", # :help <CSI>
243
+ #"\xfd\x52" => "KE_SNR",
244
+ #"\xfd\x53" => "KE_PLUG", # never used
245
+ "\xfd\x53" => "<C-Left>", # 7.2 compat
246
+ #"\xfd\x54" => "KE_CMDWIN", # never used
247
+ "\xfd\x54" => "<C-Right>", # 7.2 compat
248
+ "\xfd\x55" => "<C-Left>", # 7.2 <C-Home> conflict
249
+ "\xfd\x56" => "<C-Right>", # 7.2 <C-End> conflict
250
+ "\xfd\x57" => "<C-Home>",
251
+ "\xfd\x58" => "<C-End>",
252
+ #"\xfd\x59" => "KE_X1MOUSE",
253
+ #"\xfd\x5a" => "KE_X1DRAG",
254
+ #"\xfd\x5b" => "KE_X1RELEASE",
255
+ #"\xfd\x5c" => "KE_X2MOUSE",
256
+ #"\xfd\x5d" => "KE_X2DRAG",
257
+ #"\xfd\x5e" => "KE_X2RELEASE",
258
+ "\xfd\x5e" => nil, # 7.2 compat (I think?)
259
+ #"\xfd\x5f" => "KE_DROP",
260
+ #"\xfd\x60" => "KE_CURSORHOLD",
253
261
 
254
- yield out_char if out_char
255
- end
256
- end
262
+ # If you use gvim, you'll get an entry in your keylog every time the
263
+ # window gains or loses focus. These "keystrokes" should not show and
264
+ # should not be counted.
265
+ "\xfd\x60" => nil, # 7.2 Focus Gained compat
266
+ "\xfd\x61" => nil, # Focus Gained (GVIM) (>7.4.1433)
267
+ "\xfd\x62" => nil, # Focus Gained (GVIM)
268
+ "\xfd\x63" => nil, # Focus Lost (GVIM)
269
+ })
257
270
  end
258
271
  end