vimrunner 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +64 -22
- data/lib/vimrunner.rb +32 -2
- data/lib/vimrunner/client.rb +43 -6
- data/lib/vimrunner/rspec.rb +69 -0
- data/lib/vimrunner/server.rb +85 -28
- data/lib/vimrunner/testing.rb +0 -22
- data/lib/vimrunner/version.rb +1 -1
- data/vim/vimrc +1 -14
- data/vim/vimrunner_rc +56 -0
- metadata +7 -5
data/README.md
CHANGED
@@ -12,7 +12,8 @@ contributions are very welcome on the
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
-
Vimrunner can be used in one
|
15
|
+
If you don't already have a running Vim server, Vimrunner can be used in one
|
16
|
+
of two main ways:
|
16
17
|
|
17
18
|
```ruby
|
18
19
|
# Vim will automatically be started and killed.
|
@@ -66,33 +67,75 @@ you can control Vim. For a full list of methods you can invoke on the remote
|
|
66
67
|
Vim instance, check out the [`Client`
|
67
68
|
documentation](http://rubydoc.info/gems/vimrunner/Vimrunner/Client).
|
68
69
|
|
70
|
+
If you already have a remote-capable Vim server running, you can connect
|
71
|
+
Vimrunner to it directly by using `Vimrunner.connect` or `Vimrunner.connect!`
|
72
|
+
like so:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
# Assuming a running Vim server called FOO...
|
76
|
+
vim = Vimrunner.connect("FOO")
|
77
|
+
if vim
|
78
|
+
vim.insert("Hello world!")
|
79
|
+
end
|
80
|
+
|
81
|
+
# Or, if you're confident there's a running server...
|
82
|
+
vim = Vimrunner.connect!("FOO")
|
83
|
+
vim.insert("Hello world!")
|
84
|
+
```
|
85
|
+
|
86
|
+
In case of failure to find the server `FOO`, the first form will return `nil`,
|
87
|
+
while the second form will raise an exception.
|
88
|
+
|
69
89
|
## Testing
|
70
90
|
|
71
|
-
If you're using Vimrunner for testing vim plugins,
|
72
|
-
|
73
|
-
|
74
|
-
module. It contains a few simple helpers that may make it a bit easier to write
|
75
|
-
regression tests in rspec. With them, it could work something like this:
|
91
|
+
If you're using Vimrunner for testing vim plugins, a simple way to get up and
|
92
|
+
running is by requiring the `vimrunner/rspec` file. With that, your
|
93
|
+
`spec_helper.rb` would look like this:
|
76
94
|
|
77
95
|
``` ruby
|
78
|
-
require '
|
79
|
-
require 'vimrunner/
|
96
|
+
require 'vimrunner'
|
97
|
+
require 'vimrunner/rspec'
|
80
98
|
|
81
|
-
|
82
|
-
|
99
|
+
Vimrunner::RSpec.configure do |config|
|
100
|
+
# Use a single Vim instance for the test suite. Set to false to use an
|
101
|
+
# instance per test (slower, but can be easier to manage).
|
102
|
+
config.reuse_server = true
|
103
|
+
|
104
|
+
# Decide how to start a Vim instance. In this block, an instance should be
|
105
|
+
# spawned and set up with anything project-specific.
|
106
|
+
config.start_vim do
|
107
|
+
vim = Vimrunner.start
|
83
108
|
|
84
|
-
|
85
|
-
#
|
86
|
-
vim.add_plugin(File.expand_path('../my_plugin_path'), 'plugin/my_plugin.vim')
|
109
|
+
# Or, start a GUI instance:
|
110
|
+
# vim = Vimrunner.start_gvim
|
87
111
|
|
88
|
-
#
|
89
|
-
|
90
|
-
|
91
|
-
|
112
|
+
# Setup your plugin in the Vim instance
|
113
|
+
plugin_path = File.expand_path('.')
|
114
|
+
vim.add_plugin(plugin_path, 'plugin/my_plugin.vim')
|
115
|
+
|
116
|
+
# The returned value is the Client available in the tests.
|
117
|
+
vim
|
92
118
|
end
|
119
|
+
end
|
120
|
+
```
|
121
|
+
|
122
|
+
This will result in:
|
123
|
+
|
124
|
+
- A `vim` helper in every rspec example, returning the configured
|
125
|
+
`Vimrunner::Client` instance.
|
126
|
+
- Every example is executed in a separate temporary directory to make it easier
|
127
|
+
to manipulate files.
|
128
|
+
- A few helper methods from the `Vimrunner::Testing` module
|
129
|
+
([documentation](http://rubydoc.info/gems/vimrunner/Vimrunner/Testing)).
|
93
130
|
|
131
|
+
The specs would then look something like this:
|
132
|
+
|
133
|
+
``` ruby
|
134
|
+
require 'spec_helper'
|
135
|
+
|
136
|
+
describe "My Vim plugin" do
|
94
137
|
specify "some behaviour" do
|
95
|
-
|
138
|
+
write_file('test.rb', <<-EOF)
|
96
139
|
def foo
|
97
140
|
bar
|
98
141
|
end
|
@@ -102,7 +145,7 @@ describe "My Vim plugin" do
|
|
102
145
|
do_plugin_related_stuff_with(vim)
|
103
146
|
vim.write
|
104
147
|
|
105
|
-
IO.read('test.rb').should eq
|
148
|
+
IO.read('test.rb').should eq normalize_string_indent(<<-EOF)
|
106
149
|
def bar
|
107
150
|
foo
|
108
151
|
end
|
@@ -111,9 +154,8 @@ describe "My Vim plugin" do
|
|
111
154
|
end
|
112
155
|
```
|
113
156
|
|
114
|
-
|
115
|
-
`
|
116
|
-
behaviour, by extracting some code to `spec_helper.rb`, and so on.
|
157
|
+
If you need a different setup, please look through the file
|
158
|
+
`lib/vimrunner/rspec.rb` for ideas on how to build your own testing scaffold.
|
117
159
|
|
118
160
|
## Requirements
|
119
161
|
|
data/lib/vimrunner.rb
CHANGED
@@ -23,7 +23,7 @@ module Vimrunner
|
|
23
23
|
#
|
24
24
|
# Returns a Client for the started Server.
|
25
25
|
def self.start(vim = Platform.vim, &blk)
|
26
|
-
Server.new(vim).start(&blk)
|
26
|
+
Server.new(:executable => vim).start(&blk)
|
27
27
|
end
|
28
28
|
|
29
29
|
# Public: Start a Vim process with a GUI and return a Client through which
|
@@ -46,6 +46,36 @@ module Vimrunner
|
|
46
46
|
#
|
47
47
|
# Returns a Client for the started Server.
|
48
48
|
def self.start_gvim(&blk)
|
49
|
-
Server.new(Platform.gvim).start(&blk)
|
49
|
+
Server.new(:executable => Platform.gvim).start(&blk)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Public: Connect to an existing Vim process by name. Returns nil in case of
|
53
|
+
# failure.
|
54
|
+
#
|
55
|
+
# name - The String name of the Vim server to connect to.
|
56
|
+
#
|
57
|
+
# Examples
|
58
|
+
#
|
59
|
+
# client = Vimrunner.connect("FOO")
|
60
|
+
# # => #<Vimrunner::Client>
|
61
|
+
#
|
62
|
+
# Returns a Client for the named server.
|
63
|
+
def self.connect(name)
|
64
|
+
Server.new(:name => name).connect
|
65
|
+
end
|
66
|
+
|
67
|
+
# Public: Connect to an existing Vim process by name. Raises an exception in
|
68
|
+
# case of failure.
|
69
|
+
#
|
70
|
+
# name - The String name of the Vim server to connect to.
|
71
|
+
#
|
72
|
+
# Examples
|
73
|
+
#
|
74
|
+
# client = Vimrunner.connect("FOO")
|
75
|
+
# # => #<Vimrunner::Client>
|
76
|
+
#
|
77
|
+
# Returns a Client for the named server.
|
78
|
+
def self.connect!(name)
|
79
|
+
Server.new(:name => name).connect!
|
50
80
|
end
|
51
81
|
end
|
data/lib/vimrunner/client.rb
CHANGED
@@ -25,6 +25,19 @@ module Vimrunner
|
|
25
25
|
command("runtime #{entry_script}") if entry_script
|
26
26
|
end
|
27
27
|
|
28
|
+
# Public: source a script in Vim server
|
29
|
+
#
|
30
|
+
# script - The Vim script to be sourced
|
31
|
+
#
|
32
|
+
# Examples
|
33
|
+
#
|
34
|
+
# vim.source '/path/to/plugin/rails.vim'
|
35
|
+
#
|
36
|
+
# Returns nothing.
|
37
|
+
def source(script)
|
38
|
+
feedkeys(":\\<C-u>source #{escape_filename(script)}\\<CR>")
|
39
|
+
end
|
40
|
+
|
28
41
|
# Public: Appends a directory to Vim's runtimepath
|
29
42
|
#
|
30
43
|
# dir - The directory added to the path
|
@@ -96,6 +109,28 @@ module Vimrunner
|
|
96
109
|
command "echo #{expressions.join(' ')}"
|
97
110
|
end
|
98
111
|
|
112
|
+
# Public: Send keys as if they come from a mapping or typed by a user.
|
113
|
+
#
|
114
|
+
# Vim's usual remote-send functionality to send keys to a server does not
|
115
|
+
# respect mappings. As a workaround, the feedkeys() function can be used
|
116
|
+
# to more closely simulate user input.
|
117
|
+
#
|
118
|
+
# Any keys are sent in a double-quoted string so that special keys such as
|
119
|
+
# <CR> and <C-L> can be used. Note that, as per Vim documentation, such
|
120
|
+
# keys should be preceded by a backslash, e.g. '\<CR>' for a carriage
|
121
|
+
# return, '<CR>' will send those four characters separately.
|
122
|
+
#
|
123
|
+
# Examples
|
124
|
+
#
|
125
|
+
# vim.command 'map <C-R> ihello'
|
126
|
+
# vim.feedkeys '\<C-R>'
|
127
|
+
#
|
128
|
+
# Returns nothing.
|
129
|
+
def feedkeys(string)
|
130
|
+
string = string.gsub('"', '\"')
|
131
|
+
server.remote_expr(%Q{feedkeys("#{string}")})
|
132
|
+
end
|
133
|
+
|
99
134
|
# Public: Sets a setting in Vim. If +value+ is nil, the setting is
|
100
135
|
# considered to be a boolean.
|
101
136
|
#
|
@@ -122,7 +157,7 @@ module Vimrunner
|
|
122
157
|
#
|
123
158
|
# Returns the Client instance.
|
124
159
|
def edit(filename)
|
125
|
-
command "edit #{filename}"
|
160
|
+
command "edit #{escape_filename(filename)}"
|
126
161
|
self
|
127
162
|
end
|
128
163
|
|
@@ -132,7 +167,7 @@ module Vimrunner
|
|
132
167
|
#
|
133
168
|
# Returns the Client instance.
|
134
169
|
def edit!(filename)
|
135
|
-
command "edit! #{filename}"
|
170
|
+
command "edit! #{escape_filename(filename)}"
|
136
171
|
self
|
137
172
|
end
|
138
173
|
|
@@ -142,9 +177,7 @@ module Vimrunner
|
|
142
177
|
# Returns the String output.
|
143
178
|
# Raises InvalidCommandError if the command is not recognised by vim.
|
144
179
|
def command(commands)
|
145
|
-
|
146
|
-
|
147
|
-
server.remote_expr(expression).tap do |output|
|
180
|
+
server.remote_expr("VimrunnerEvaluateCommandOutput('#{escape_single_quote(commands)}')").tap do |output|
|
148
181
|
raise InvalidCommandError.new(output) if output =~ /^Vim:E\d+:/
|
149
182
|
end
|
150
183
|
end
|
@@ -156,7 +189,11 @@ module Vimrunner
|
|
156
189
|
|
157
190
|
private
|
158
191
|
|
159
|
-
def
|
192
|
+
def escape_filename(name)
|
193
|
+
name.gsub(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")
|
194
|
+
end
|
195
|
+
|
196
|
+
def escape_single_quote(string)
|
160
197
|
string.to_s.gsub("'", "''")
|
161
198
|
end
|
162
199
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'vimrunner'
|
2
|
+
require 'vimrunner/testing'
|
3
|
+
|
4
|
+
module Vimrunner
|
5
|
+
module RSpec
|
6
|
+
class Configuration
|
7
|
+
attr_accessor :reuse_server
|
8
|
+
|
9
|
+
def start_vim(&block)
|
10
|
+
@start_vim_method = block
|
11
|
+
end
|
12
|
+
|
13
|
+
def start_vim_method
|
14
|
+
@start_vim_method || lambda { Vimrunner.start }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.configuration
|
19
|
+
@configuration ||= Configuration.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure
|
23
|
+
yield configuration
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Testing
|
28
|
+
class << self
|
29
|
+
attr_accessor :instance
|
30
|
+
end
|
31
|
+
|
32
|
+
def vim
|
33
|
+
Testing.instance ||= Vimrunner::RSpec.configuration.start_vim_method.call
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Default configuration
|
39
|
+
Vimrunner::RSpec.configure do |config|
|
40
|
+
config.reuse_server = false
|
41
|
+
end
|
42
|
+
|
43
|
+
RSpec.configure do |config|
|
44
|
+
|
45
|
+
# Include the Testing DSL into all examples.
|
46
|
+
config.include(Vimrunner::Testing)
|
47
|
+
|
48
|
+
# Each example is executed in a separate directory
|
49
|
+
config.around(:each) do |example|
|
50
|
+
Dir.mktmpdir do |dir|
|
51
|
+
Dir.chdir(dir) do
|
52
|
+
vim.command("cd #{dir}")
|
53
|
+
example.run
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
config.before(:each) do
|
59
|
+
unless Vimrunner::RSpec.configuration.reuse_server
|
60
|
+
Vimrunner::Testing.instance.kill if Vimrunner::Testing.instance
|
61
|
+
Vimrunner::Testing.instance = nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Kill the Vim server after all tests are over.
|
66
|
+
config.after(:suite) do
|
67
|
+
Vimrunner::Testing.instance.kill if Vimrunner::Testing.instance
|
68
|
+
end
|
69
|
+
end
|
data/lib/vimrunner/server.rb
CHANGED
@@ -3,25 +3,41 @@ require "pty"
|
|
3
3
|
|
4
4
|
require "vimrunner/errors"
|
5
5
|
require "vimrunner/client"
|
6
|
+
require "vimrunner/platform"
|
6
7
|
|
7
8
|
module Vimrunner
|
8
9
|
|
9
10
|
# Public: A Server has the responsibility of starting a Vim process and
|
10
11
|
# communicating with it through the clientserver interface. The process can
|
11
|
-
# be started with "start" and stopped with "kill".
|
12
|
-
#
|
13
|
-
#
|
12
|
+
# be started with "start" and stopped with "kill". If given the servername of
|
13
|
+
# an existing Vim instance, it can control that instance without the need to
|
14
|
+
# start a new process.
|
15
|
+
#
|
16
|
+
# A Client would be necessary as there's a ctual interface, though it is possible
|
17
|
+
# to use a Server directly to invoke --remote commands on its Vim instance.
|
14
18
|
class Server
|
15
|
-
VIMRC
|
19
|
+
VIMRC = File.expand_path("../../../vim/vimrc", __FILE__)
|
20
|
+
VIMRUNNER_RC = File.expand_path("../../../vim/vimrunner_rc", __FILE__)
|
16
21
|
|
17
|
-
attr_reader :name, :executable
|
22
|
+
attr_reader :name, :executable, :vimrc
|
18
23
|
|
19
24
|
# Public: Initialize a Server
|
20
25
|
#
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
# options - The Hash options used to define a server (default: {}):
|
27
|
+
# :executable - The String Vim executable to use (optional)
|
28
|
+
# (default: Platform.vim).
|
29
|
+
# :name - The String name of the Vim server (optional)
|
30
|
+
# (default: "VIMRUNNER#{rand}").
|
31
|
+
# :vimrc - The String vimrc file to source in the client (optional)
|
32
|
+
# (default: Server::VIMRC).
|
33
|
+
# :foreground - Boolean, whether to start Vim with the -f option (optional)
|
34
|
+
# (default: true).
|
35
|
+
#
|
36
|
+
def initialize(options = {})
|
37
|
+
@executable = options.fetch(:executable) { Platform.vim }
|
38
|
+
@name = options.fetch(:name) { "VIMRUNNER#{rand}" }
|
39
|
+
@vimrc = options.fetch(:vimrc) { VIMRC }
|
40
|
+
@foreground = options.fetch(:foreground, true)
|
25
41
|
end
|
26
42
|
|
27
43
|
# Public: Start a Server. This spawns a background process.
|
@@ -38,27 +54,64 @@ module Vimrunner
|
|
38
54
|
# Returns a new Client instance initialized with this Server.
|
39
55
|
# Yields a new Client instance initialized with this Server.
|
40
56
|
def start
|
57
|
+
@r, @w, @pid = spawn
|
58
|
+
|
41
59
|
if block_given?
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
w.close
|
49
|
-
Process.kill(9, pid) rescue Errno::ESRCH
|
50
|
-
end
|
60
|
+
begin
|
61
|
+
@result = yield(connect!)
|
62
|
+
ensure
|
63
|
+
@r.close
|
64
|
+
@w.close
|
65
|
+
Process.kill(9, @pid) rescue Errno::ESRCH
|
51
66
|
end
|
52
|
-
|
53
67
|
@result
|
54
68
|
else
|
55
|
-
|
56
|
-
wait_until_started
|
57
|
-
|
58
|
-
new_client
|
69
|
+
connect!
|
59
70
|
end
|
60
71
|
end
|
61
72
|
|
73
|
+
# Public: Connects to the running server by name, blocking if need be.
|
74
|
+
# Returns nil if no server was found in the given time.
|
75
|
+
#
|
76
|
+
# options - An optional Hash. For now, only used for specifying a timeout
|
77
|
+
# (default: {}):
|
78
|
+
#
|
79
|
+
# :timeout - The Integer timeout to wait for a running server (optional)
|
80
|
+
# (default: 5).
|
81
|
+
#
|
82
|
+
# Returns a new Client instance initialized with this Server.
|
83
|
+
def connect(options = {})
|
84
|
+
connect!(options)
|
85
|
+
rescue TimeoutError
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
|
89
|
+
# Public: Connects to the running server by name, blocking if need be.
|
90
|
+
# Raises a TimeoutError if no server was found in the given time in
|
91
|
+
# seconds.
|
92
|
+
#
|
93
|
+
# options - An optional Hash. For now, only used for specifying a timeout
|
94
|
+
# (default: {}):
|
95
|
+
#
|
96
|
+
# :timeout - The Integer timeout to wait for a running server
|
97
|
+
# (default: 5).
|
98
|
+
#
|
99
|
+
# Returns a new Client instance initialized with this Server.
|
100
|
+
def connect!(options = {})
|
101
|
+
wait_until_running(options[:timeout] || 5)
|
102
|
+
|
103
|
+
client = new_client
|
104
|
+
client.source(VIMRUNNER_RC)
|
105
|
+
client
|
106
|
+
end
|
107
|
+
|
108
|
+
# Public: Checks if there's a running Vim instance with the server's name.
|
109
|
+
#
|
110
|
+
# Returns a Boolean
|
111
|
+
def running?
|
112
|
+
serverlist.include?(name)
|
113
|
+
end
|
114
|
+
|
62
115
|
# Public: Kills the Vim instance in the background.
|
63
116
|
#
|
64
117
|
# Returns self.
|
@@ -107,17 +160,21 @@ module Vimrunner
|
|
107
160
|
|
108
161
|
private
|
109
162
|
|
163
|
+
def foreground_option
|
164
|
+
@foreground ? '-f' : ''
|
165
|
+
end
|
166
|
+
|
110
167
|
def execute(command)
|
111
168
|
IO.popen(command) { |io| io.read.strip }
|
112
169
|
end
|
113
170
|
|
114
|
-
def spawn
|
115
|
-
PTY.spawn(executable
|
171
|
+
def spawn
|
172
|
+
PTY.spawn("#{executable} #{foreground_option} --servername #{name} -u #{vimrc}")
|
116
173
|
end
|
117
174
|
|
118
|
-
def
|
119
|
-
Timeout.timeout(
|
120
|
-
sleep 0.1 while !
|
175
|
+
def wait_until_running(seconds)
|
176
|
+
Timeout.timeout(seconds, TimeoutError) do
|
177
|
+
sleep 0.1 while !running?
|
121
178
|
end
|
122
179
|
end
|
123
180
|
end
|
data/lib/vimrunner/testing.rb
CHANGED
@@ -6,28 +6,6 @@ module Vimrunner
|
|
6
6
|
# testing purposes.
|
7
7
|
module Testing
|
8
8
|
|
9
|
-
# Public: Within the given block, switches to a temporary directory for
|
10
|
-
# isolation purposes.
|
11
|
-
#
|
12
|
-
# Example:
|
13
|
-
#
|
14
|
-
# tmpdir(vim) do
|
15
|
-
# puts vim.command('pwd')
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# vim - a Vimrunner::Client instance
|
19
|
-
#
|
20
|
-
# Returns nothing.
|
21
|
-
# Yields nothing.
|
22
|
-
def tmpdir(vim)
|
23
|
-
Dir.mktmpdir do |dir|
|
24
|
-
Dir.chdir(dir) do
|
25
|
-
vim.command("cd #{dir}")
|
26
|
-
yield
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
9
|
# Public: Writes the given string to the file identified by "filename".
|
32
10
|
#
|
33
11
|
# Uses #normalize_string_indent to ensure consistent indentation when given
|
data/lib/vimrunner/version.rb
CHANGED
data/vim/vimrc
CHANGED
@@ -10,17 +10,4 @@ set noswapfile nobackup
|
|
10
10
|
set runtimepath-=~/.vim
|
11
11
|
set runtimepath-=~/.vim/after
|
12
12
|
|
13
|
-
|
14
|
-
let base_command = split(a:command, '\s\+')[0]
|
15
|
-
let base_command = substitute(base_command, '!$', '', '')
|
16
|
-
|
17
|
-
if !exists(':'.base_command)
|
18
|
-
let output = 'Vim:E492: Not an editor command: '.base_command
|
19
|
-
else
|
20
|
-
redir => output
|
21
|
-
silent exe a:command
|
22
|
-
redir END
|
23
|
-
endif
|
24
|
-
|
25
|
-
return output
|
26
|
-
endfunction
|
13
|
+
execute "source " . expand('<sfile>:p:h') . "/vimrunner_rc"
|
data/vim/vimrunner_rc
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
let has_error_handling_bugfix =
|
2
|
+
\ v:version > 703 ||
|
3
|
+
\ v:version == 703 && has('patch860')
|
4
|
+
|
5
|
+
if has_error_handling_bugfix
|
6
|
+
function! VimrunnerEvaluateCommandOutput(command)
|
7
|
+
let output = ''
|
8
|
+
|
9
|
+
try
|
10
|
+
redir => output
|
11
|
+
silent exe a:command
|
12
|
+
redir END
|
13
|
+
|
14
|
+
let output = s:StripSilencedErrors(output)
|
15
|
+
catch
|
16
|
+
let output = v:exception
|
17
|
+
endtry
|
18
|
+
|
19
|
+
return output
|
20
|
+
endfunction
|
21
|
+
else
|
22
|
+
" Use some fake error handling to provide at least rudimentary errors for
|
23
|
+
" missing commands.
|
24
|
+
function! VimrunnerEvaluateCommandOutput(command)
|
25
|
+
let base_command = split(a:command, '\s\+')[0]
|
26
|
+
let base_command = substitute(base_command, '!$', '', '')
|
27
|
+
|
28
|
+
if !exists(':'.base_command)
|
29
|
+
let output = 'Vim:E492: Not an editor command: '.base_command
|
30
|
+
else
|
31
|
+
redir => output
|
32
|
+
silent exe a:command
|
33
|
+
redir END
|
34
|
+
endif
|
35
|
+
|
36
|
+
return output
|
37
|
+
endfunction
|
38
|
+
endif
|
39
|
+
|
40
|
+
" Remove errors from the output that have been silenced by :silent!. These are
|
41
|
+
" visible in the captured output since all messages are captured by :redir.
|
42
|
+
function! s:StripSilencedErrors(output)
|
43
|
+
let processed_output = []
|
44
|
+
|
45
|
+
for line in reverse(split(a:output, "\n"))
|
46
|
+
if line =~ '^E\d\+:'
|
47
|
+
break
|
48
|
+
endif
|
49
|
+
|
50
|
+
call add(processed_output, line)
|
51
|
+
endfor
|
52
|
+
|
53
|
+
return join(reverse(processed_output), "\n")
|
54
|
+
endfunction
|
55
|
+
|
56
|
+
" vim: set ft=vim
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vimrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.
|
69
|
+
version: 2.13.0
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 2.
|
77
|
+
version: 2.13.0
|
78
78
|
description: ! " Using Vim's client/server functionality, this library exposes
|
79
79
|
a way to\n spawn a Vim instance and control it programatically. Apart from being
|
80
80
|
a fun\n party trick, this can be used to integration test Vim script.\n"
|
@@ -88,10 +88,12 @@ files:
|
|
88
88
|
- lib/vimrunner.rb
|
89
89
|
- lib/vimrunner/client.rb
|
90
90
|
- lib/vimrunner/testing.rb
|
91
|
+
- lib/vimrunner/rspec.rb
|
91
92
|
- lib/vimrunner/errors.rb
|
92
93
|
- lib/vimrunner/version.rb
|
93
94
|
- lib/vimrunner/server.rb
|
94
95
|
- lib/vimrunner/platform.rb
|
96
|
+
- vim/vimrunner_rc
|
95
97
|
- vim/vimrc
|
96
98
|
- bin/vimrunner
|
97
99
|
- LICENSE
|
@@ -110,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
110
112
|
version: '0'
|
111
113
|
segments:
|
112
114
|
- 0
|
113
|
-
hash:
|
115
|
+
hash: -1164770989909868074
|
114
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
117
|
none: false
|
116
118
|
requirements:
|