vimgolf 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +13 -16
- data/Rakefile +8 -0
- data/emacs/README.md +69 -0
- data/emacs/ROADMAP.md +69 -0
- data/emacs/vimgolf.el +343 -0
- data/lib/vimgolf.rb +2 -1
- data/lib/vimgolf/challenge.rb +108 -0
- data/lib/vimgolf/cli.rb +43 -104
- data/lib/vimgolf/keylog.rb +144 -24
- data/lib/vimgolf/ui.rb +26 -10
- data/lib/vimgolf/version.rb +1 -1
- data/spec/challenge_spec.rb +31 -0
- data/spec/cli_spec.rb +1 -17
- data/spec/helper.rb +1 -1
- data/spec/keylog_spec.rb +4 -3
- data/vimgolf.gemspec +3 -2
- metadata +85 -89
data/lib/vimgolf.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
module VimGolf
|
2
|
+
class Challenge
|
3
|
+
attr_reader :id, :type
|
4
|
+
|
5
|
+
def self.path(path)
|
6
|
+
@@path = path if path
|
7
|
+
@@path
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(id)
|
11
|
+
@id = id
|
12
|
+
end
|
13
|
+
|
14
|
+
def download
|
15
|
+
begin
|
16
|
+
url = URI.parse("#{GOLFHOST}/challenges/#{@id}.yaml")
|
17
|
+
req = Net::HTTP::Get.new(url.path)
|
18
|
+
|
19
|
+
proxy_url, proxy_user, proxy_pass = get_proxy
|
20
|
+
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
21
|
+
res = proxy.start(url.host, url.port) { |http| http.request(req) }
|
22
|
+
|
23
|
+
@data = YAML.load(res.body)
|
24
|
+
|
25
|
+
if !@data.is_a? Hash
|
26
|
+
raise
|
27
|
+
|
28
|
+
elsif @data['client'] != Vimgolf::VERSION
|
29
|
+
VimGolf.ui.error "Client version mismatch. Installed: #{Vimgolf::VERSION}, Required: #{@data['client']}."
|
30
|
+
VimGolf.ui.error "\t gem install vimgolf"
|
31
|
+
raise "Bad Version"
|
32
|
+
end
|
33
|
+
|
34
|
+
@type = @data['in']['type']
|
35
|
+
save
|
36
|
+
start
|
37
|
+
rescue Exception => e
|
38
|
+
debug(e)
|
39
|
+
raise "Uh oh, couldn't download or parse challenge, please verify your challenge id & client version."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def start
|
44
|
+
File.open(work_path, "w") {|f| f.puts @data['in']['data']}
|
45
|
+
end
|
46
|
+
|
47
|
+
def save
|
48
|
+
File.open(input_path, "w") {|f| f.puts @data['in']['data']}
|
49
|
+
File.open(output_path, "w") {|f| f.puts @data['out']['data']}
|
50
|
+
File.open(vimrc_path, "w") {|f| f.puts @data['vimrc']}
|
51
|
+
end
|
52
|
+
|
53
|
+
def upload
|
54
|
+
begin
|
55
|
+
url = URI.parse("#{GOLFHOST}/entry.yaml")
|
56
|
+
|
57
|
+
proxy_url, proxy_user, proxy_pass = get_proxy
|
58
|
+
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
59
|
+
|
60
|
+
proxy.start(url.host, url.port) do |http|
|
61
|
+
request = Net::HTTP::Post.new(url.request_uri)
|
62
|
+
request.set_form_data({"challenge_id" => @id, "apikey" => Config.load['key'], "entry" => IO.read(log_path)})
|
63
|
+
request["Accept"] = "text/yaml"
|
64
|
+
|
65
|
+
res = http.request(request)
|
66
|
+
res = YAML.load(res.body)
|
67
|
+
|
68
|
+
raise if !res.is_a? Hash
|
69
|
+
res['status'].to_sym
|
70
|
+
|
71
|
+
end
|
72
|
+
rescue Exception => e
|
73
|
+
debug(e)
|
74
|
+
raise "Uh oh, entry upload has failed, please check your key."
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def input_path; path + ".#{@type}"; end
|
79
|
+
def work_path; path + ".work.#{@type}"; end
|
80
|
+
def output_path; path + ".output"; end
|
81
|
+
def log_path; path + ".log"; end
|
82
|
+
def vimrc_path; path + ".golfrc"; end
|
83
|
+
|
84
|
+
def path
|
85
|
+
@@path + "/#{@id}"
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
def get_proxy
|
90
|
+
begin
|
91
|
+
proxy_url = URI.parse(PROXY)
|
92
|
+
rescue Exception => e
|
93
|
+
VimGolf.ui.error "Invalid proxy uri in http_proxy environment variable - will try to run with out proxy"
|
94
|
+
proxy_url = URI.parse("");
|
95
|
+
end
|
96
|
+
|
97
|
+
proxy_url.port ||= 80
|
98
|
+
proxy_user, proxy_pass = proxy_url.userinfo.split(/:/) if proxy_url.userinfo
|
99
|
+
|
100
|
+
return proxy_url, proxy_user, proxy_pass
|
101
|
+
end
|
102
|
+
|
103
|
+
def debug(msg)
|
104
|
+
p [caller.first, msg] if GOLFDEBUG
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
data/lib/vimgolf/cli.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
module VimGolf
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
GOLFDIFF
|
6
|
-
|
7
|
-
|
3
|
+
GOLFDEBUG = ENV['GOLFDEBUG'].to_sym rescue false
|
4
|
+
GOLFHOST = ENV['GOLFHOST'] || "http://vimgolf.com"
|
5
|
+
GOLFDIFF = ENV['GOLFDIFF'] || 'diff'
|
6
|
+
GOLFSHOWDIFF = ENV['GOLFSHOWDIFF'] || 'vim -d -n'
|
7
|
+
GOLFVIM = ENV['GOLFVIM'] || 'vim'
|
8
|
+
PROXY = ENV['http_proxy'] || ''
|
8
9
|
|
9
10
|
class Error
|
10
11
|
end
|
11
12
|
|
13
|
+
class RetryException < Exception; end
|
14
|
+
|
12
15
|
class UI
|
13
16
|
def debug(*); end
|
14
17
|
end
|
@@ -60,39 +63,53 @@ module VimGolf
|
|
60
63
|
DESC
|
61
64
|
|
62
65
|
def put(id = nil)
|
63
|
-
VimGolf.ui.warn "
|
66
|
+
VimGolf.ui.warn "Downloading Vimgolf challenge: #{id}"
|
67
|
+
VimGolf::Challenge.path(Config.put_path)
|
68
|
+
challenge = Challenge.new(id)
|
69
|
+
challenge.download
|
64
70
|
|
65
71
|
begin
|
66
|
-
|
67
|
-
|
72
|
+
VimGolf.ui.warn "Launching VimGolf session for challenge: #{id}"
|
68
73
|
# - n - no swap file, memory only editing
|
69
74
|
# - +0 - always start on line 0
|
70
75
|
# - --noplugin - don't load any plugins, lets be fair!
|
71
76
|
# -i NONE - don't load .viminfo (for saved macros and the like)
|
72
77
|
# - u - load vimgolf .vimrc to level the playing field
|
73
|
-
vimcmd = "#{GOLFVIM} -n --noplugin -i NONE +0 -u \"#{vimrc(id)}\" -W \"#{log(id)}\" \"#{input(id, type)}\""
|
78
|
+
vimcmd = "#{GOLFVIM} -Z -n --noplugin -i NONE +0 -u \"#{vimrc(id)}\" -W \"#{log(id)}\" \"#{input(id, type)}\""
|
74
79
|
debug(vimcmd)
|
75
80
|
system(vimcmd)
|
76
81
|
|
77
82
|
if $?.exitstatus.zero?
|
78
|
-
|
79
|
-
|
83
|
+
diff_files = "\"#{challenge.work_path}\" \"#{challenge.output_path}\""
|
84
|
+
diff = `#{GOLFDIFF} #{diff_files}`
|
85
|
+
log = Keylog.new(IO.read(challenge.log_path))
|
80
86
|
|
81
87
|
if diff.size > 0
|
82
|
-
VimGolf.ui.warn "Uh oh, looks like your entry does not match the desired output
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
VimGolf.ui.warn "Uh oh, looks like your entry does not match the desired output."
|
89
|
+
loop do
|
90
|
+
case VimGolf.ui.ask_question "Would you like to see a [d]iff or [r]etry or [q]uit ?",
|
91
|
+
:type => :warn,
|
92
|
+
:choices => [:diff, :retry, :quit]
|
93
|
+
when :diff
|
94
|
+
VimGolf.ui.warn "Showing vimdiff of your attempt (left) and correct output (right)"
|
95
|
+
system("#{GOLFSHOWDIFF} #{diff_files}")
|
96
|
+
when :retry
|
97
|
+
VimGolf.ui.warn "Your score for this (failed) attempt was: #{log.score}. Let's try again!!\n#{'#'*50}"
|
98
|
+
challenge.start
|
99
|
+
raise RetryException
|
100
|
+
when :quit
|
101
|
+
VimGolf.ui.warn "Please try again! Your score for this (failed) attempt was: #{log.score}"
|
102
|
+
return
|
103
|
+
end
|
104
|
+
end
|
88
105
|
end
|
89
106
|
|
90
|
-
VimGolf.ui.info "Success! Your output matches. Your score: #{score}"
|
107
|
+
VimGolf.ui.info "Success! Your output matches. Your score: #{log.score}"
|
91
108
|
|
92
109
|
if VimGolf.ui.yes? "Upload result to VimGolf? (yes / no)"
|
93
110
|
VimGolf.ui.warn "Uploading to VimGolf..."
|
94
111
|
|
95
|
-
if upload
|
112
|
+
if challenge.upload == :ok
|
96
113
|
VimGolf.ui.info "Uploaded entry, thanks for golfing!"
|
97
114
|
VimGolf.ui.info "View the leaderboard: #{GOLFHOST}/challenges/#{id}"
|
98
115
|
else
|
@@ -112,97 +129,19 @@ module VimGolf
|
|
112
129
|
VimGolf.ui.error error
|
113
130
|
end
|
114
131
|
|
115
|
-
rescue
|
116
|
-
|
117
|
-
VimGolf.ui.error "If the error persists, please report it to github.com/igrigorik/vimgolf"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
no_tasks do
|
122
|
-
def download(id)
|
123
|
-
begin
|
124
|
-
url = URI.parse("#{GOLFHOST}/challenges/#{id}.yaml")
|
125
|
-
req = Net::HTTP::Get.new(url.path)
|
126
|
-
|
127
|
-
proxy_url, proxy_user, proxy_pass = get_proxy
|
128
|
-
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
129
|
-
res = proxy.start(url.host, url.port) { |http| http.request(req) }
|
130
|
-
|
131
|
-
data = YAML.load(res.body)
|
132
|
-
|
133
|
-
if !data.is_a? Hash
|
134
|
-
raise
|
135
|
-
|
136
|
-
elsif data['client'] != Vimgolf::VERSION
|
137
|
-
VimGolf.ui.error "Client version mismatch. Installed: #{Vimgolf::VERSION}, Required: #{data['client']}."
|
138
|
-
VimGolf.ui.error "\t gem install vimgolf"
|
139
|
-
raise "Bad Version"
|
140
|
-
end
|
141
|
-
|
142
|
-
File.open(Config.put_path + "/#{id}.#{data['in']['type']}", "w") {|f| f.puts data['in']['data']}
|
143
|
-
File.open(Config.put_path + "/#{id}.output", "w") {|f| f.puts data['out']['data']}
|
144
|
-
File.open(Config.put_path + "/#{id}.golfrc", "w") {|f| f.puts data['vimrc']}
|
145
|
-
|
146
|
-
data['in']['type']
|
147
|
-
|
148
|
-
rescue Exception => e
|
149
|
-
debug(e)
|
150
|
-
raise "Uh oh, couldn't download or parse challenge, please verify your challenge id & client version."
|
151
|
-
end
|
132
|
+
rescue RetryException => e
|
133
|
+
retry
|
152
134
|
end
|
153
135
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
proxy_url, proxy_user, proxy_pass = get_proxy
|
159
|
-
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
160
|
-
|
161
|
-
proxy.start(url.host, url.port) do |http|
|
162
|
-
request = Net::HTTP::Post.new(url.request_uri)
|
163
|
-
request.set_form_data({"challenge_id" => id, "apikey" => Config.load['key'], "entry" => IO.read(log(id))})
|
164
|
-
request["Accept"] = "text/yaml"
|
165
|
-
|
166
|
-
res = http.request(request)
|
167
|
-
res = YAML.load(res.body)
|
168
|
-
|
169
|
-
raise if !res.is_a? Hash
|
170
|
-
res['status'].to_sym
|
171
|
-
|
172
|
-
end
|
173
|
-
rescue Exception => e
|
174
|
-
debug(e)
|
175
|
-
raise "Uh oh, entry upload has failed, please check your key."
|
176
|
-
end
|
177
|
-
end
|
136
|
+
rescue Exception => e
|
137
|
+
VimGolf.ui.error "Uh oh, something went wrong! Error: #{e}"
|
138
|
+
VimGolf.ui.error "If the error persists, please report it to github.com/igrigorik/vimgolf"
|
178
139
|
end
|
179
140
|
|
180
141
|
private
|
181
|
-
def input(id, type); challenge(id) + ".#{type}"; end
|
182
|
-
def output(id); challenge(id) + ".output"; end
|
183
|
-
def log(id); challenge(id) + ".log"; end
|
184
|
-
def vimrc(id); challenge(id) + ".golfrc"; end
|
185
|
-
|
186
|
-
def challenge(id)
|
187
|
-
Config.put_path + "/#{id}"
|
188
|
-
end
|
189
|
-
|
190
|
-
def get_proxy
|
191
|
-
begin
|
192
|
-
proxy_url = URI.parse(PROXY)
|
193
|
-
rescue Exception => e
|
194
|
-
VimGolf.ui.error "Invalid proxy uri in http_proxy environment variable - will try to run with out proxy"
|
195
|
-
proxy_url = URI.parse("");
|
196
|
-
end
|
197
|
-
|
198
|
-
proxy_url.port ||= 80
|
199
|
-
proxy_user, proxy_pass = proxy_url.userinfo.split(/:/) if proxy_url.userinfo
|
200
|
-
|
201
|
-
return proxy_url, proxy_user, proxy_pass
|
202
|
-
end
|
203
|
-
|
204
142
|
def debug(msg)
|
205
143
|
p [caller.first, msg] if GOLFDEBUG
|
206
144
|
end
|
207
145
|
end
|
208
|
-
|
146
|
+
|
147
|
+
end
|
data/lib/vimgolf/keylog.rb
CHANGED
@@ -1,29 +1,20 @@
|
|
1
1
|
module VimGolf
|
2
|
-
class Session < Array
|
3
|
-
def to_s(sep = '')
|
4
|
-
@log.join(sep)
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
2
|
class Keylog
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
alias_method :convert , :to_s
|
6
|
+
alias_method :score , :count
|
14
7
|
|
15
|
-
def
|
16
|
-
|
8
|
+
def initialize(input)
|
9
|
+
@input = input
|
17
10
|
end
|
18
11
|
|
19
|
-
def
|
20
|
-
|
21
|
-
scan(input) {|s| keys += 1 }
|
22
|
-
keys
|
12
|
+
def to_s(sep = '')
|
13
|
+
to_a.join(sep)
|
23
14
|
end
|
24
15
|
|
25
|
-
def
|
26
|
-
scanner = StringScanner.new(input)
|
16
|
+
def each
|
17
|
+
scanner = StringScanner.new(@input)
|
27
18
|
output = ""
|
28
19
|
|
29
20
|
until scanner.eos?
|
@@ -37,9 +28,9 @@ module VimGolf
|
|
37
28
|
when 0x80
|
38
29
|
code = scanner.get_byte + scanner.get_byte
|
39
30
|
|
40
|
-
# This list has been populated by
|
41
|
-
#
|
42
|
-
#
|
31
|
+
# This list has been populated by looking at
|
32
|
+
# :h terminal-options and vim source files:
|
33
|
+
# keymap.h and misc2.c
|
43
34
|
case code
|
44
35
|
when "k1"; "<F1>"
|
45
36
|
when "k2"; "<F2>"
|
@@ -53,6 +44,38 @@ module VimGolf
|
|
53
44
|
when "k;"; "<F10>"
|
54
45
|
when "F1"; "<F11>"
|
55
46
|
when "F2"; "<F12>"
|
47
|
+
when "F3"; "<F13>"
|
48
|
+
when "F4"; "<F14>"
|
49
|
+
when "F5"; "<F15>"
|
50
|
+
when "F6"; "<F16>"
|
51
|
+
when "F7"; "<F17>"
|
52
|
+
when "F8"; "<F18>"
|
53
|
+
when "F9"; "<F19>"
|
54
|
+
|
55
|
+
when "%1"; "<Help>"
|
56
|
+
when "&8"; "<Undo>"
|
57
|
+
when "#2"; "<S-Home>"
|
58
|
+
when "*7"; "<S-End>"
|
59
|
+
when "K1"; "<kHome>"
|
60
|
+
when "K4"; "<kEnd>"
|
61
|
+
when "K3"; "<kPageUp>"
|
62
|
+
when "K5"; "<kPageDown>"
|
63
|
+
when "K6"; "<kPlus>"
|
64
|
+
when "K7"; "<kMinus>"
|
65
|
+
when "K8"; "<kDivide>"
|
66
|
+
when "K9"; "<kMultiply>"
|
67
|
+
when "KA"; "<kEnter>"
|
68
|
+
when "KB"; "<kPoint>"
|
69
|
+
when "KC"; "<k0>"
|
70
|
+
when "KD"; "<k1>"
|
71
|
+
when "KE"; "<k2>"
|
72
|
+
when "KF"; "<k3>"
|
73
|
+
when "KG"; "<k4>"
|
74
|
+
when "KH"; "<k5>"
|
75
|
+
when "KI"; "<k6>"
|
76
|
+
when "KJ"; "<k7>"
|
77
|
+
when "KK"; "<k8>"
|
78
|
+
when "KL"; "<k9>"
|
56
79
|
|
57
80
|
when "kP"; "<PageUp>"
|
58
81
|
when "kN"; "<PageDown>"
|
@@ -70,7 +93,104 @@ module VimGolf
|
|
70
93
|
when "%i"; "<S-Right>"
|
71
94
|
|
72
95
|
when "kB"; "<S-Tab>"
|
73
|
-
when "\xffX"; "<C
|
96
|
+
when "\xffX"; "<C-@>"
|
97
|
+
|
98
|
+
when "\xfd\x4"; "<S-Up>"
|
99
|
+
when "\xfd\x5"; "<S-Down>"
|
100
|
+
when "\xfd\x6"; "<S-F1>"
|
101
|
+
when "\xfd\x7"; "<S-F2>"
|
102
|
+
when "\xfd\x8"; "<S-F3>"
|
103
|
+
when "\xfd\x9"; "<S-F4>"
|
104
|
+
when "\xfd\xa"; "<S-F5>"
|
105
|
+
when "\xfd\xb"; "<S-F6>"
|
106
|
+
when "\xfd\xc"; "<S-F7>"
|
107
|
+
when "\xfd\xd"; "<S-F9>"
|
108
|
+
when "\xfd\xe"; "<S-F10>"
|
109
|
+
when "\xfd\xf"; "<S-F10>"
|
110
|
+
when "\xfd\x10"; "<S-F11>"
|
111
|
+
when "\xfd\x11"; "<S-F12>"
|
112
|
+
when "\xfd\x12"; "<S-F13>"
|
113
|
+
when "\xfd\x13"; "<S-F14>"
|
114
|
+
when "\xfd\x14"; "<S-F15>"
|
115
|
+
when "\xfd\x15"; "<S-F16>"
|
116
|
+
when "\xfd\x16"; "<S-F17>"
|
117
|
+
when "\xfd\x17"; "<S-F18>"
|
118
|
+
when "\xfd\x18"; "<S-F19>"
|
119
|
+
when "\xfd\x19"; "<S-F20>"
|
120
|
+
when "\xfd\x1a"; "<S-F21>"
|
121
|
+
when "\xfd\x1b"; "<S-F22>"
|
122
|
+
when "\xfd\x1c"; "<S-F23>"
|
123
|
+
when "\xfd\x1d"; "<S-F24>"
|
124
|
+
when "\xfd\x1e"; "<S-F25>"
|
125
|
+
when "\xfd\x1f"; "<S-F26>"
|
126
|
+
when "\xfd\x20"; "<S-F27>"
|
127
|
+
when "\xfd\x21"; "<S-F28>"
|
128
|
+
when "\xfd\x22"; "<S-F29>"
|
129
|
+
when "\xfd\x23"; "<S-F30>"
|
130
|
+
when "\xfd\x24"; "<S-F31>"
|
131
|
+
when "\xfd\x25"; "<S-F32>"
|
132
|
+
when "\xfd\x26"; "<S-F33>"
|
133
|
+
when "\xfd\x27"; "<S-F34>"
|
134
|
+
when "\xfd\x28"; "<S-F35>"
|
135
|
+
when "\xfd\x29"; "<S-F36>"
|
136
|
+
when "\xfd\x2a"; "<S-F37>"
|
137
|
+
when "\xfd\x2b"; "<Mouse>"
|
138
|
+
when "\xfd\x2c"; "<LeftMouse>"
|
139
|
+
when "\xfd\x2d"; "<LeftDrag>"
|
140
|
+
when "\xfd\x2e"; "<LeftRelease>"
|
141
|
+
when "\xfd\x2f"; "<MiddleMouse>"
|
142
|
+
when "\xfd\x30"; "<MiddleDrag>"
|
143
|
+
when "\xfd\x31"; "<MiddleRelease>"
|
144
|
+
when "\xfd\x32"; "<RightMouse>"
|
145
|
+
when "\xfd\x33"; "<RightDrag>"
|
146
|
+
when "\xfd\x34"; "<RightRelease>"
|
147
|
+
#when "\xfd\x35"; "KE_IGNORE"
|
148
|
+
#when "\xfd\x36"; "KE_TAB"
|
149
|
+
#when "\xfd\x37"; "KE_S_TAB_OLD"
|
150
|
+
#when "\xfd\x38"; "KE_SNIFF"
|
151
|
+
#when "\xfd\x39"; "KE_XF1"
|
152
|
+
#when "\xfd\x3a"; "KE_XF2"
|
153
|
+
#when "\xfd\x3b"; "KE_XF3"
|
154
|
+
#when "\xfd\x3c"; "KE_XF4"
|
155
|
+
#when "\xfd\x3d"; "KE_XEND"
|
156
|
+
#when "\xfd\x3e"; "KE_ZEND"
|
157
|
+
#when "\xfd\x3f"; "KE_XHOME"
|
158
|
+
#when "\xfd\x40"; "KE_ZHOME"
|
159
|
+
#when "\xfd\x41"; "KE_XUP"
|
160
|
+
#when "\xfd\x42"; "KE_XDOWN"
|
161
|
+
#when "\xfd\x43"; "KE_XLEFT"
|
162
|
+
#when "\xfd\x44"; "KE_XRIGHT"
|
163
|
+
#when "\xfd\x45"; "KE_LEFTMOUSE_NM"
|
164
|
+
#when "\xfd\x46"; "KE_LEFTRELEASE_NM"
|
165
|
+
#when "\xfd\x47"; "KE_S_XF1"
|
166
|
+
#when "\xfd\x48"; "KE_S_XF2"
|
167
|
+
#when "\xfd\x49"; "KE_S_XF3"
|
168
|
+
#when "\xfd\x4a"; "KE_S_XF4"
|
169
|
+
when "\xfd\x4b"; "<MouseDown>"
|
170
|
+
when "\xfd\x4c"; "<MouseUp>"
|
171
|
+
when "\xfd\x4d"; "<MouseLeft>"
|
172
|
+
when "\xfd\x4e"; "<MouseRight>"
|
173
|
+
#when "\xfd\x4f"; "KE_KINS"
|
174
|
+
#when "\xfd\x50"; "KE_KDEL"
|
175
|
+
#when "\xfd\x51"; "KE_CSI"
|
176
|
+
#when "\xfd\x52"; "KE_SNR"
|
177
|
+
#when "\xfd\x53"; "KE_PLUG"
|
178
|
+
#when "\xfd\x54"; "KE_CMDWIN"
|
179
|
+
when "\xfd\x55"; "<C-Left>"
|
180
|
+
when "\xfd\x56"; "<C-Right>"
|
181
|
+
when "\xfd\x57"; "<C-Home>"
|
182
|
+
when "\xfd\x58"; "<C-End>"
|
183
|
+
#when "\xfd\x59"; "KE_X1MOUSE"
|
184
|
+
#when "\xfd\x5a"; "KE_X1DRAG"
|
185
|
+
#when "\xfd\x5b"; "KE_X1RELEASE"
|
186
|
+
#when "\xfd\x5c"; "KE_X2MOUSE"
|
187
|
+
#when "\xfd\x5d"; "KE_X2DRAG"
|
188
|
+
#when "\xfd\x5e"; "KE_X2RELEASE"
|
189
|
+
#when "\xfd\x5f"; "KE_DROP"
|
190
|
+
#when "\xfd\x5e"; "KE_CURSORHOLD"
|
191
|
+
#when "\xfd\x61"; "KE_NOP"
|
192
|
+
when "\xfd\x62"; nil # Focus Gained (GVIM)
|
193
|
+
when "\xfd\x63"; nil # Focus Lost (GVIM)
|
74
194
|
|
75
195
|
else
|
76
196
|
#puts "Unknown Vim code: #{code.inspect}"
|
@@ -98,7 +218,7 @@ module VimGolf
|
|
98
218
|
|
99
219
|
end
|
100
220
|
|
101
|
-
yield out_char
|
221
|
+
yield out_char if out_char
|
102
222
|
end
|
103
223
|
end
|
104
224
|
end
|