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 +4 -4
- data/README.md +2 -10
- data/lib/vimgolf/challenge.rb +1 -1
- data/lib/vimgolf/cli.rb +14 -2
- data/lib/vimgolf/keylog.rb +242 -229
- data/lib/vimgolf/version.rb +1 -1
- metadata +51 -51
- data/.gitignore +0 -5
- data/.gitmodules +0 -3
- data/.rspec +0 -0
- data/Gemfile +0 -4
- data/Rakefile +0 -10
- data/emacs/CHANGELOG.md +0 -58
- data/emacs/README.md +0 -69
- data/emacs/ROADMAP.md +0 -69
- data/emacs/features/emacs.feature +0 -24
- data/emacs/features/step-definitions/emacs-steps.el +0 -53
- data/emacs/features/support/env.el +0 -37
- data/emacs/todo.org +0 -45
- data/emacs/vimgolf.el +0 -488
- data/spec/challenge_spec.rb +0 -31
- data/spec/cli_spec.rb +0 -25
- data/spec/fixtures/4d19832d8ae121365c00000b.log +0 -1
- data/spec/fixtures/4d1a1c36567bac34a9000002.log +0 -1
- data/spec/fixtures/4d1a1c69567bac34a9000004.log +0 -1
- data/spec/fixtures/4d1a21e88ae121365c00000e.log +0 -1
- data/spec/fixtures/4d1a34ccfa85f32065000004.log +0 -1
- data/spec/helper.rb +0 -25
- data/spec/keylog_spec.rb +0 -16
- data/vimgolf.gemspec +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54dea0f839cd9e4b251b1b3d9f1b8d1be31fb0dc
|
4
|
+
data.tar.gz: 0e96fa1acc4894b104702e6492748742ea42204c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/vimgolf/challenge.rb
CHANGED
@@ -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.
|
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
|
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.
|
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
|
data/lib/vimgolf/keylog.rb
CHANGED
@@ -1,258 +1,271 @@
|
|
1
|
-
# encoding:
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
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
|
-
|
98
|
-
|
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
|
-
|
101
|
-
|
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
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
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
|
-
|
231
|
-
|
232
|
-
'<%02x-%02x>' % code.unpack('CC')
|
233
|
-
end
|
122
|
+
"kB" => "<S-Tab>",
|
123
|
+
"\xffX" => "<C-@>",
|
234
124
|
|
235
|
-
|
236
|
-
|
125
|
+
# This is how you escape literal 0x80
|
126
|
+
"\xfeX" => "<0x80>",
|
237
127
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
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
|
-
|
246
|
-
|
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
|
-
|
249
|
-
|
250
|
-
|
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
|
-
|
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
|
-
|
255
|
-
|
256
|
-
|
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
|