vimgolf 0.4.8 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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