neovim 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +4 -0
- data/README.md +2 -0
- data/Rakefile +1 -1
- data/lib/neovim/buffer.rb +4 -0
- data/lib/neovim/client.rb +4 -0
- data/lib/neovim/event_loop.rb +1 -1
- data/lib/neovim/ruby_provider.rb +78 -93
- data/lib/neovim/ruby_provider/buffer_ext.rb +17 -0
- data/lib/neovim/ruby_provider/vim.rb +15 -0
- data/lib/neovim/ruby_provider/window_ext.rb +17 -0
- data/lib/neovim/session.rb +26 -10
- data/lib/neovim/tabpage.rb +4 -0
- data/lib/neovim/version.rb +1 -1
- data/lib/neovim/window.rb +4 -0
- data/neovim.gemspec +1 -1
- data/spec/acceptance/neovim-ruby-host_spec.rb +1 -1
- data/spec/acceptance/ruby_provider_spec.rb +29 -114
- data/spec/neovim/buffer_spec.rb +1 -1
- data/spec/neovim/line_range_spec.rb +1 -1
- data/spec/neovim/ruby_provider/buffer_ext_spec.rb +34 -0
- data/spec/neovim/ruby_provider/window_ext_spec.rb +34 -0
- data/spec/neovim/session_spec.rb +17 -5
- data/spec/neovim/window_spec.rb +1 -1
- data/spec/neovim_spec.rb +1 -1
- metadata +27 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fe8a4ab833d55be2946a9a6b9db21771c47fffe
|
4
|
+
data.tar.gz: d8c4a84c020b04124978cc4311f43e113bbac1c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc3418eaa160281fc251f2f57a7e7f5754db4a3f9d7c21d8b29482098556185f4a828d0eb3960f0eb117c352349a0b1077d6471a585ffafec64663bc791978ec
|
7
|
+
data.tar.gz: ff1fd3a88fc4b8bcc44024eab6e4eb22999c68810784ea215448432653f7327a06b1a5d6befe3d2e16cf46618e2fc90bebd71951faf1910fa67fc3767b80be10
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -70,6 +70,8 @@ end
|
|
70
70
|
|
71
71
|
After a call to `:UpdateRemotePlugins`, plugins will be auto-loaded from the `$VIMRUNTIME/rplugin/ruby` directory.
|
72
72
|
|
73
|
+
Neovim also supports the legacy Vim commands `:ruby`, `:rubyfile`, and `:rubydo`. A detailed description of their usage can be found with `:help ruby`.
|
74
|
+
|
73
75
|
## Links
|
74
76
|
|
75
77
|
* Source: <http://github.com/alexgenco/neovim-ruby>
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ namespace :neovim do
|
|
13
13
|
buffer_docs = []
|
14
14
|
window_docs = []
|
15
15
|
tabpage_docs = []
|
16
|
-
session = Neovim::Session.child(%w(nvim -u NONE -n
|
16
|
+
session = Neovim::Session.child(%w(nvim -u NONE -n))
|
17
17
|
|
18
18
|
session.request(:vim_get_api_info)[1]["functions"].each do |func|
|
19
19
|
prefix, method_name = func["name"].split("_", 2)
|
data/lib/neovim/buffer.rb
CHANGED
data/lib/neovim/client.rb
CHANGED
data/lib/neovim/event_loop.rb
CHANGED
data/lib/neovim/ruby_provider.rb
CHANGED
@@ -1,129 +1,103 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
class << self
|
5
|
-
attr_accessor :__client
|
6
|
-
end
|
7
|
-
|
8
|
-
Buffer = ::Neovim::Buffer
|
9
|
-
Window = ::Neovim::Window
|
10
|
-
|
11
|
-
def self.method_missing(method, *args, &block)
|
12
|
-
@__client.public_send(method, *args, &block)
|
13
|
-
end
|
14
|
-
end
|
1
|
+
require "neovim/ruby_provider/vim"
|
2
|
+
require "neovim/ruby_provider/buffer_ext"
|
3
|
+
require "neovim/ruby_provider/window_ext"
|
15
4
|
|
16
5
|
module Neovim
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
::VIM.current.buffer
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.count
|
24
|
-
::VIM.get_buffers.size
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.[](index)
|
28
|
-
::VIM.get_buffers[index]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Make +VIM::Window.current+ return the current buffer.
|
33
|
-
class Window
|
34
|
-
def self.current
|
35
|
-
::VIM.current.window
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.count
|
39
|
-
::VIM.get_windows.size
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.[](index)
|
43
|
-
::VIM.get_windows[index]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
6
|
+
# This class is used to define a +Neovim::Plugin+ to act as a backend for the
|
7
|
+
# legacy +:ruby+, +:rubyfile+, and +:rubydo+ Vim commands. It is autoloaded
|
8
|
+
# from +nvim+ and not intended to be loaded directly.
|
47
9
|
module RubyProvider
|
48
|
-
def self.
|
10
|
+
def self.__define_plugin!
|
11
|
+
Thread.abort_on_exception = true
|
12
|
+
|
49
13
|
Neovim.plugin do |plug|
|
50
|
-
|
51
|
-
|
52
|
-
|
14
|
+
__define_ruby_execute(plug)
|
15
|
+
__define_ruby_execute_file(plug)
|
16
|
+
__define_ruby_do_range(plug)
|
53
17
|
end
|
54
18
|
end
|
55
19
|
|
56
|
-
|
20
|
+
# Evaluate the provided Ruby code, exposing the +VIM+ constant for
|
21
|
+
# interactions with the editor.
|
22
|
+
#
|
23
|
+
# This is used by the +:ruby+ command.
|
24
|
+
def self.__define_ruby_execute(plug)
|
57
25
|
plug.rpc(:ruby_execute, sync: true) do |nvim, ruby|
|
58
|
-
|
59
|
-
|
26
|
+
__wrap_client(nvim) do
|
27
|
+
eval(ruby, TOPLEVEL_BINDING, __FILE__, __LINE__)
|
60
28
|
end
|
61
29
|
end
|
62
30
|
end
|
63
|
-
private_class_method :
|
31
|
+
private_class_method :__define_ruby_execute
|
64
32
|
|
65
|
-
|
33
|
+
# Evaluate the provided Ruby file, exposing the +VIM+ constant for
|
34
|
+
# interactions with the editor.
|
35
|
+
#
|
36
|
+
# This is used by the +:rubyfile+ command.
|
37
|
+
def self.__define_ruby_execute_file(plug)
|
66
38
|
plug.rpc(:ruby_execute_file, sync: true) do |nvim, path|
|
67
|
-
|
68
|
-
$__ruby_provider_scope.eval(File.read(path), __FILE__, __LINE__)
|
69
|
-
end
|
39
|
+
__wrap_client(nvim) { load(path) }
|
70
40
|
end
|
71
41
|
end
|
72
|
-
private_class_method :
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
42
|
+
private_class_method :__define_ruby_execute_file
|
43
|
+
|
44
|
+
# Evaluate the provided Ruby code over each line of a range. The contents
|
45
|
+
# of the current line can be accessed and modified via the +$_+ variable.
|
46
|
+
#
|
47
|
+
# Since this method evaluates each line in the local binding, all local
|
48
|
+
# variables and methods are available to the user. Thus the +__+ prefix
|
49
|
+
# obfuscation.
|
50
|
+
#
|
51
|
+
# This is used by the +:rubydo+ command.
|
52
|
+
def self.__define_ruby_do_range(__plug)
|
53
|
+
__plug.rpc(:ruby_do_range, sync: true) do |__nvim, *__args|
|
54
|
+
__wrap_client(__nvim) do
|
55
|
+
__start, __stop, __ruby = __args
|
56
|
+
__buffer = __nvim.get_current_buffer
|
57
|
+
|
58
|
+
__update_lines_in_chunks(__buffer, __start, __stop, 5000) do |__lines|
|
59
|
+
__lines.map do |__line|
|
60
|
+
$_ = __line
|
61
|
+
eval(__ruby, binding, __FILE__, __LINE__)
|
62
|
+
$_
|
88
63
|
end
|
89
|
-
|
90
|
-
buffer.set_lines(_start, _stop, true, lines)
|
91
64
|
end
|
92
65
|
end
|
93
66
|
end
|
94
67
|
end
|
95
|
-
private_class_method :
|
68
|
+
private_class_method :__define_ruby_do_range
|
96
69
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
70
|
+
# @api private
|
71
|
+
def self.__wrap_client(client)
|
72
|
+
__with_globals(client) do
|
73
|
+
__with_vim_constant(client) do
|
74
|
+
__with_redirect_streams(client) do
|
101
75
|
yield
|
102
76
|
end
|
103
77
|
end
|
104
78
|
end
|
105
79
|
nil
|
106
80
|
end
|
107
|
-
private_class_method :
|
81
|
+
private_class_method :__wrap_client
|
108
82
|
|
109
|
-
|
110
|
-
|
111
|
-
$
|
83
|
+
# @api private
|
84
|
+
def self.__with_globals(client)
|
85
|
+
$curbuf = client.get_current_buffer
|
86
|
+
$curwin = client.get_current_window
|
112
87
|
yield
|
113
88
|
end
|
114
|
-
private_class_method :
|
89
|
+
private_class_method :__with_globals
|
115
90
|
|
116
|
-
|
91
|
+
# @api private
|
92
|
+
def self.__with_vim_constant(client)
|
117
93
|
::VIM.__client = client
|
118
94
|
yield
|
119
95
|
end
|
120
|
-
private_class_method :
|
121
|
-
|
122
|
-
def self.with_redirect_streams(client)
|
123
|
-
@with_redirect_streams ||= begin
|
124
|
-
old_out_write = $stdout.method(:write)
|
125
|
-
old_err_write = $stderr.method(:write)
|
96
|
+
private_class_method :__with_vim_constant
|
126
97
|
|
98
|
+
# @api private
|
99
|
+
def self.__with_redirect_streams(client)
|
100
|
+
@__with_redirect_streams ||= begin
|
127
101
|
$stdout.define_singleton_method(:write) do |string|
|
128
102
|
client.out_write(string)
|
129
103
|
end
|
@@ -137,8 +111,19 @@ module Neovim
|
|
137
111
|
|
138
112
|
yield
|
139
113
|
end
|
140
|
-
private_class_method :
|
114
|
+
private_class_method :__with_redirect_streams
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
def self.__update_lines_in_chunks(buffer, start, stop, size)
|
118
|
+
(start..stop).each_slice(size) do |linenos|
|
119
|
+
_start, _stop = linenos[0]-1, linenos[-1]
|
120
|
+
lines = buffer.get_lines(_start, _stop, true)
|
121
|
+
|
122
|
+
buffer.set_lines(_start, _stop, true, yield(lines))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
private_class_method :__update_lines_in_chunks
|
141
126
|
end
|
142
127
|
end
|
143
128
|
|
144
|
-
Neovim::RubyProvider.
|
129
|
+
Neovim::RubyProvider.__define_plugin!
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "neovim/buffer"
|
2
|
+
require "neovim/window"
|
3
|
+
|
4
|
+
class VIM < BasicObject
|
5
|
+
Buffer = ::Neovim::Buffer
|
6
|
+
Window = ::Neovim::Window
|
7
|
+
|
8
|
+
def self.__client=(client)
|
9
|
+
@__client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.method_missing(method, *args, &block)
|
13
|
+
@__client.public_send(method, *args, &block)
|
14
|
+
end
|
15
|
+
end
|
data/lib/neovim/session.rb
CHANGED
@@ -57,6 +57,7 @@ module Neovim
|
|
57
57
|
def initialize(async_session)
|
58
58
|
@async_session = async_session
|
59
59
|
@pending_messages = []
|
60
|
+
@main_thread = Thread.current
|
60
61
|
@main_fiber = Fiber.current
|
61
62
|
@running = false
|
62
63
|
end
|
@@ -117,15 +118,17 @@ module Neovim
|
|
117
118
|
# @return [Object] The response from the RPC call
|
118
119
|
# @raise [ArgumentError] An error returned from +nvim+
|
119
120
|
def request(method, *args)
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
121
|
+
main_thread_only do
|
122
|
+
if Fiber.current == @main_fiber
|
123
|
+
debug("handling blocking request")
|
124
|
+
err, res = stopped_request(method, *args)
|
125
|
+
else
|
126
|
+
debug("yielding request to fiber")
|
127
|
+
err, res = running_request(method, *args)
|
128
|
+
end
|
129
|
+
|
130
|
+
err ? raise(ArgumentError, err) : res
|
126
131
|
end
|
127
|
-
|
128
|
-
err ? raise(ArgumentError, err) : res
|
129
132
|
end
|
130
133
|
|
131
134
|
# Make an RPC notification.
|
@@ -134,8 +137,10 @@ module Neovim
|
|
134
137
|
# @param *args [Array] The RPC method arguments
|
135
138
|
# @return [nil]
|
136
139
|
def notify(method, *args)
|
137
|
-
|
138
|
-
|
140
|
+
main_thread_only do
|
141
|
+
@async_session.notify(method, *args)
|
142
|
+
nil
|
143
|
+
end
|
139
144
|
end
|
140
145
|
|
141
146
|
# Stop the event loop.
|
@@ -185,5 +190,16 @@ module Neovim
|
|
185
190
|
|
186
191
|
[error, result]
|
187
192
|
end
|
193
|
+
|
194
|
+
def main_thread_only
|
195
|
+
if Thread.current == @main_thread
|
196
|
+
yield if block_given?
|
197
|
+
else
|
198
|
+
raise(
|
199
|
+
"A Ruby plugin attempted to call neovim outside of the main thread, " +
|
200
|
+
"which is not yet supported by the neovim gem."
|
201
|
+
)
|
202
|
+
end
|
203
|
+
end
|
188
204
|
end
|
189
205
|
end
|
data/lib/neovim/tabpage.rb
CHANGED
data/lib/neovim/version.rb
CHANGED
data/lib/neovim/window.rb
CHANGED
data/neovim.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^spec/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "msgpack", "~> 0
|
20
|
+
spec.add_dependency "msgpack", "~> 1.0"
|
21
21
|
|
22
22
|
spec.add_development_dependency "bundler"
|
23
23
|
spec.add_development_dependency "rake"
|
@@ -28,7 +28,7 @@ RSpec.describe "neovim-ruby-host" do
|
|
28
28
|
end
|
29
29
|
RUBY
|
30
30
|
|
31
|
-
nvim = Neovim.attach_child(["nvim", "
|
31
|
+
nvim = Neovim.attach_child(["nvim", "-u", "NONE", "-n"])
|
32
32
|
|
33
33
|
host_exe = File.expand_path("../../../bin/neovim-ruby-host", __FILE__)
|
34
34
|
nvim.command("let host = rpcstart('#{host_exe}', ['#{plugin1_path}', '#{plugin2_path}'])")
|
@@ -1,16 +1,22 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
3
|
RSpec.describe "ruby_provider" do
|
4
|
-
let(:nvim) do
|
5
|
-
Neovim.attach_child(["nvim", "
|
4
|
+
let!(:nvim) do
|
5
|
+
Neovim.attach_child(["nvim", "-u", "NONE", "-n"])
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
around do |spec|
|
9
9
|
provider_path = Support.file_path("provider.rb")
|
10
10
|
File.write(provider_path, "require 'neovim/ruby_provider'")
|
11
11
|
host_exe = File.expand_path("../../../bin/neovim-ruby-host", __FILE__)
|
12
12
|
nvim.current.buffer.lines = ["line1", "line2"]
|
13
13
|
nvim.command("let host = rpcstart('#{host_exe}', ['#{provider_path}'])")
|
14
|
+
|
15
|
+
begin
|
16
|
+
spec.run
|
17
|
+
ensure
|
18
|
+
nvim.command("call rpcstop(host) | qa!")
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
describe "ruby_execute" do
|
@@ -36,60 +42,6 @@ RSpec.describe "ruby_provider" do
|
|
36
42
|
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
37
43
|
end
|
38
44
|
|
39
|
-
it "exposes VIM::Buffer.current" do
|
40
|
-
expect {
|
41
|
-
ruby = "VIM::Buffer.current.lines = ['line']".inspect
|
42
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
43
|
-
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
44
|
-
end
|
45
|
-
|
46
|
-
it "exposes VIM::Buffer.count" do
|
47
|
-
ruby = "VIM.set_var('count', VIM::Buffer.count)".inspect
|
48
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
49
|
-
expect(nvim.get_var("count")).to eq(1)
|
50
|
-
|
51
|
-
nvim.command("tabe")
|
52
|
-
|
53
|
-
ruby = "VIM.set_var('count', VIM::Buffer.count)".inspect
|
54
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
55
|
-
expect(nvim.get_var("count")).to eq(2)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "exposes VIM::Buffer[]" do
|
59
|
-
expect {
|
60
|
-
ruby = "VIM::Buffer[0].lines = ['line']".inspect
|
61
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
62
|
-
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
63
|
-
end
|
64
|
-
|
65
|
-
it "exposes VIM::Window.current" do
|
66
|
-
nvim.command("vsplit")
|
67
|
-
expect {
|
68
|
-
ruby = "VIM::Window.current.width = 12".inspect
|
69
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
70
|
-
}.to change { nvim.current.window.width }.to(12)
|
71
|
-
end
|
72
|
-
|
73
|
-
it "exposes VIM::Window.count" do
|
74
|
-
ruby = "VIM.set_var('count', VIM::Window.count)".inspect
|
75
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
76
|
-
expect(nvim.get_var("count")).to eq(1)
|
77
|
-
|
78
|
-
nvim.command("vsplit")
|
79
|
-
|
80
|
-
ruby = "VIM.set_var('count', VIM::Window.count)".inspect
|
81
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
82
|
-
expect(nvim.get_var("count")).to eq(2)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "exposes VIM::Window[]" do
|
86
|
-
nvim.command("vsplit")
|
87
|
-
expect {
|
88
|
-
ruby = "VIM::Window[0].width = 12".inspect
|
89
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
90
|
-
}.to change { nvim.current.window.width }.to(12)
|
91
|
-
end
|
92
|
-
|
93
45
|
it "persists state between requests" do
|
94
46
|
nvim.eval("rpcrequest(host, 'ruby_execute', 'def foo; VIM.command(\"let g:called = 1\"); end')")
|
95
47
|
expect { nvim.get_var("called") }.to raise_error(/key not found/i)
|
@@ -125,71 +77,24 @@ RSpec.describe "ruby_provider" do
|
|
125
77
|
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
126
78
|
end
|
127
79
|
|
128
|
-
it "
|
129
|
-
File.write(script_path, "VIM
|
130
|
-
|
131
|
-
expect {
|
132
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
133
|
-
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
134
|
-
end
|
135
|
-
|
136
|
-
it "exposes VIM::Buffer.count" do
|
137
|
-
File.write(script_path, "VIM.set_var('count', VIM::Buffer.count)")
|
138
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
139
|
-
expect(nvim.get_var("count")).to eq(1)
|
140
|
-
|
141
|
-
nvim.command("tabe")
|
142
|
-
|
143
|
-
File.write(script_path, "VIM.set_var('count', VIM::Buffer.count)")
|
80
|
+
it "persists state between requests" do
|
81
|
+
File.write(script_path, "def foo; VIM.command(\"let g:called = 1\"); end")
|
144
82
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
145
|
-
expect
|
146
|
-
end
|
147
|
-
|
148
|
-
it "exposes VIM::Buffer[]" do
|
149
|
-
File.write(script_path, "VIM::Buffer[0].lines = ['line']")
|
150
|
-
|
151
|
-
expect {
|
152
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
153
|
-
}.to change { nvim.current.buffer.lines.to_a }.to(["line"])
|
154
|
-
end
|
155
|
-
|
156
|
-
it "exposes VIM::Window.current" do
|
157
|
-
nvim.command("vsplit")
|
158
|
-
File.write(script_path, "VIM::Window.current.width = 12")
|
83
|
+
expect { nvim.get_var("called") }.to raise_error(/key not found/i)
|
159
84
|
|
160
|
-
|
161
|
-
|
162
|
-
}.to change { nvim.current.window.width }.to(12)
|
85
|
+
nvim.eval("rpcrequest(host, 'ruby_execute', 'foo')")
|
86
|
+
expect(nvim.get_var("called")).to be(1)
|
163
87
|
end
|
164
88
|
|
165
|
-
it "
|
166
|
-
|
167
|
-
|
168
|
-
expect(nvim.get_var("count")).to eq(1)
|
169
|
-
|
170
|
-
nvim.command("vsplit")
|
89
|
+
it "can run the same file multiple times" do
|
90
|
+
nvim.set_var("called", 0)
|
91
|
+
File.write(script_path, "VIM.command(\"let g:called += 1\")")
|
171
92
|
|
172
|
-
File.write(script_path, "VIM.set_var('count', VIM::Window.count)")
|
173
93
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
174
|
-
expect(nvim.get_var("
|
175
|
-
end
|
176
|
-
|
177
|
-
it "exposes VIM::Window[]" do
|
178
|
-
nvim.command("vsplit")
|
179
|
-
File.write(script_path, "VIM::Window[0].width = 12")
|
180
|
-
|
181
|
-
expect {
|
182
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
183
|
-
}.to change { nvim.current.window.width }.to(12)
|
184
|
-
end
|
94
|
+
expect(nvim.get_var("called")).to be(1)
|
185
95
|
|
186
|
-
it "persists state between requests" do
|
187
|
-
File.write(script_path, "def foo; VIM.command(\"let g:called = 1\"); end")
|
188
96
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
189
|
-
expect
|
190
|
-
|
191
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', 'foo')")
|
192
|
-
expect(nvim.get_var("called")).to be(1)
|
97
|
+
expect(nvim.get_var("called")).to be(2)
|
193
98
|
end
|
194
99
|
end
|
195
100
|
|
@@ -201,5 +106,15 @@ RSpec.describe "ruby_provider" do
|
|
201
106
|
nvim.eval("rpcrequest(host, 'ruby_do_range', 2, 3, '$_.upcase!; 42')")
|
202
107
|
}.to change { nvim.current.buffer.lines.to_a }.to(["a", "B", "C", "d"])
|
203
108
|
end
|
109
|
+
|
110
|
+
it "handles large amounts of lines" do
|
111
|
+
xs = Array.new(6000, "x")
|
112
|
+
ys = Array.new(6000, "y")
|
113
|
+
nvim.current.buffer.lines = xs
|
114
|
+
|
115
|
+
expect {
|
116
|
+
nvim.eval("rpcrequest(host, 'ruby_do_range', 1, 6000, '$_.succ!')")
|
117
|
+
}.to change { nvim.current.buffer.lines.to_a }.to(ys)
|
118
|
+
end
|
204
119
|
end
|
205
120
|
end
|
data/spec/neovim/buffer_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe Buffer do
|
5
|
-
let(:client) { Neovim.attach_child(["nvim", "
|
5
|
+
let(:client) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]) }
|
6
6
|
let(:buffer) { client.current.buffer }
|
7
7
|
|
8
8
|
describe "#lines" do
|
@@ -2,7 +2,7 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe LineRange do
|
5
|
-
let(:client) { Neovim.attach_child(["nvim", "
|
5
|
+
let(:client) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]) }
|
6
6
|
let(:buffer) { client.current.buffer }
|
7
7
|
let(:line_range) { LineRange.new(buffer, 0, 3) }
|
8
8
|
let(:sub_range) { LineRange.new(buffer, 1, 2) }
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "helper"
|
2
|
+
require "neovim/ruby_provider/buffer_ext"
|
3
|
+
|
4
|
+
module Neovim
|
5
|
+
RSpec.describe Buffer do
|
6
|
+
let!(:nvim) do
|
7
|
+
Neovim.attach_child(["nvim", "-u", "NONE", "-n"]).tap do |nvim|
|
8
|
+
stub_const("::VIM", nvim)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".current" do
|
13
|
+
it "returns the current buffer from the global VIM client" do
|
14
|
+
expect(Buffer.current).to eq(nvim.get_current_buffer)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ".count" do
|
19
|
+
it "returns the current buffer count from the global VIM client" do
|
20
|
+
expect {
|
21
|
+
nvim.command("new")
|
22
|
+
}.to change { Buffer.count }.by(1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".[]" do
|
27
|
+
it "returns the buffer from the global VIM client at the given index" do
|
28
|
+
expect(Buffer[0]).to eq(nvim.get_current_buffer)
|
29
|
+
nvim.command("new")
|
30
|
+
expect(Buffer[1]).to eq(nvim.get_current_buffer)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "helper"
|
2
|
+
require "neovim/ruby_provider/window_ext"
|
3
|
+
|
4
|
+
module Neovim
|
5
|
+
RSpec.describe Window do
|
6
|
+
let!(:nvim) do
|
7
|
+
Neovim.attach_child(["nvim", "-u", "NONE", "-n"]).tap do |nvim|
|
8
|
+
stub_const("::VIM", nvim)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".current" do
|
13
|
+
it "returns the current window from the global VIM client" do
|
14
|
+
expect(Window.current).to eq(nvim.get_current_window)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ".count" do
|
19
|
+
it "returns the current window count from the global VIM client" do
|
20
|
+
expect {
|
21
|
+
nvim.command("new")
|
22
|
+
}.to change { Window.count }.by(1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".[]" do
|
27
|
+
it "returns the window from the global VIM client at the given index" do
|
28
|
+
expect(Window[0]).to eq(nvim.get_current_window)
|
29
|
+
nvim.command("tabnew")
|
30
|
+
expect(Window[1]).to eq(nvim.get_current_window)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/neovim/session_spec.rb
CHANGED
@@ -31,6 +31,12 @@ module Neovim
|
|
31
31
|
session.request(:vim_set_current_line, large_str)
|
32
32
|
expect(session.request(:vim_get_current_line)).to eq(large_str)
|
33
33
|
end
|
34
|
+
|
35
|
+
it "fails outside of the main thread" do
|
36
|
+
expect {
|
37
|
+
Thread.new { session.request(:vim_strwidth, "foo") }.join
|
38
|
+
}.to raise_error(/outside of the main thread/)
|
39
|
+
end
|
34
40
|
end
|
35
41
|
|
36
42
|
describe "#notify" do
|
@@ -49,6 +55,12 @@ module Neovim
|
|
49
55
|
session.notify(:vim_set_current_line, large_str)
|
50
56
|
expect(session.request(:vim_get_current_line)).to eq(large_str)
|
51
57
|
end
|
58
|
+
|
59
|
+
it "fails outside of the main thread" do
|
60
|
+
expect {
|
61
|
+
Thread.new { session.notify(:vim_set_current_line, "foo") }.join
|
62
|
+
}.to raise_error(/outside of the main thread/)
|
63
|
+
end
|
52
64
|
end
|
53
65
|
|
54
66
|
describe "#run" do
|
@@ -87,7 +99,7 @@ module Neovim
|
|
87
99
|
let!(:nvim_pid) do
|
88
100
|
pid = Process.spawn(
|
89
101
|
{"NVIM_LISTEN_ADDRESS" => "0.0.0.0:#{nvim_port}"},
|
90
|
-
"nvim --
|
102
|
+
"nvim --embed -n -u NONE",
|
91
103
|
[:out, :err] => "/dev/null"
|
92
104
|
)
|
93
105
|
|
@@ -105,7 +117,7 @@ module Neovim
|
|
105
117
|
Process.waitpid(nvim_pid)
|
106
118
|
end
|
107
119
|
|
108
|
-
let(:session) { Session.tcp("0.0.0.0", nvim_port) }
|
120
|
+
let!(:session) { Session.tcp("0.0.0.0", nvim_port) }
|
109
121
|
include_context "session behavior"
|
110
122
|
end
|
111
123
|
|
@@ -114,7 +126,7 @@ module Neovim
|
|
114
126
|
let!(:nvim_pid) do
|
115
127
|
pid = Process.spawn(
|
116
128
|
{"NVIM_LISTEN_ADDRESS" => socket_path},
|
117
|
-
"nvim --
|
129
|
+
"nvim --embed -n -u NONE",
|
118
130
|
[:out, :err] => "/dev/null"
|
119
131
|
)
|
120
132
|
|
@@ -132,12 +144,12 @@ module Neovim
|
|
132
144
|
Process.waitpid(nvim_pid)
|
133
145
|
end
|
134
146
|
|
135
|
-
let(:session) { Session.unix(socket_path) }
|
147
|
+
let!(:session) { Session.unix(socket_path) }
|
136
148
|
include_context "session behavior"
|
137
149
|
end
|
138
150
|
|
139
151
|
context "child" do
|
140
|
-
let(:session) { Session.child(["nvim", "-n", "-u", "NONE"]) }
|
152
|
+
let!(:session) { Session.child(["nvim", "-n", "-u", "NONE"]) }
|
141
153
|
include_context "session behavior"
|
142
154
|
end
|
143
155
|
end
|
data/spec/neovim/window_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe Window do
|
5
|
-
let(:client) { Neovim.attach_child(["nvim", "
|
5
|
+
let(:client) { Neovim.attach_child(["nvim", "-n", "-u", "NONE"]) }
|
6
6
|
let(:window) { client.current.window }
|
7
7
|
|
8
8
|
describe "if_ruby compatibility" do
|
data/spec/neovim_spec.rb
CHANGED
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neovim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Genco
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '3.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.0'
|
83
83
|
description:
|
@@ -88,9 +88,9 @@ executables:
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
-
- .coveralls.yml
|
92
|
-
- .gitignore
|
93
|
-
- .travis.yml
|
91
|
+
- ".coveralls.yml"
|
92
|
+
- ".gitignore"
|
93
|
+
- ".travis.yml"
|
94
94
|
- CHANGELOG.md
|
95
95
|
- Gemfile
|
96
96
|
- LICENSE.txt
|
@@ -118,6 +118,9 @@ files:
|
|
118
118
|
- lib/neovim/remote_object.rb
|
119
119
|
- lib/neovim/request.rb
|
120
120
|
- lib/neovim/ruby_provider.rb
|
121
|
+
- lib/neovim/ruby_provider/buffer_ext.rb
|
122
|
+
- lib/neovim/ruby_provider/vim.rb
|
123
|
+
- lib/neovim/ruby_provider/window_ext.rb
|
121
124
|
- lib/neovim/session.rb
|
122
125
|
- lib/neovim/tabpage.rb
|
123
126
|
- lib/neovim/version.rb
|
@@ -138,6 +141,8 @@ files:
|
|
138
141
|
- spec/neovim/msgpack_stream_spec.rb
|
139
142
|
- spec/neovim/plugin_spec.rb
|
140
143
|
- spec/neovim/remote_object_spec.rb
|
144
|
+
- spec/neovim/ruby_provider/buffer_ext_spec.rb
|
145
|
+
- spec/neovim/ruby_provider/window_ext_spec.rb
|
141
146
|
- spec/neovim/session_spec.rb
|
142
147
|
- spec/neovim/window_spec.rb
|
143
148
|
- spec/neovim_spec.rb
|
@@ -152,17 +157,17 @@ require_paths:
|
|
152
157
|
- lib
|
153
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
154
159
|
requirements:
|
155
|
-
- -
|
160
|
+
- - ">="
|
156
161
|
- !ruby/object:Gem::Version
|
157
162
|
version: '0'
|
158
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
164
|
requirements:
|
160
|
-
- -
|
165
|
+
- - ">="
|
161
166
|
- !ruby/object:Gem::Version
|
162
167
|
version: '0'
|
163
168
|
requirements: []
|
164
169
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.
|
170
|
+
rubygems_version: 2.4.5
|
166
171
|
signing_key:
|
167
172
|
specification_version: 4
|
168
173
|
summary: A Ruby client for Neovim
|
@@ -182,6 +187,8 @@ test_files:
|
|
182
187
|
- spec/neovim/msgpack_stream_spec.rb
|
183
188
|
- spec/neovim/plugin_spec.rb
|
184
189
|
- spec/neovim/remote_object_spec.rb
|
190
|
+
- spec/neovim/ruby_provider/buffer_ext_spec.rb
|
191
|
+
- spec/neovim/ruby_provider/window_ext_spec.rb
|
185
192
|
- spec/neovim/session_spec.rb
|
186
193
|
- spec/neovim/window_spec.rb
|
187
194
|
- spec/neovim_spec.rb
|