neovim 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -1
- data/.rubocop.yml +118 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Rakefile +29 -16
- data/VimFlavor +1 -0
- data/appveyor.yml +2 -0
- data/lib/neovim/api.rb +2 -1
- data/lib/neovim/buffer.rb +7 -15
- data/lib/neovim/client.rb +3 -3
- data/lib/neovim/connection.rb +6 -7
- data/lib/neovim/event_loop.rb +3 -3
- data/lib/neovim/executable.rb +1 -0
- data/lib/neovim/host.rb +12 -12
- data/lib/neovim/line_range.rb +16 -16
- data/lib/neovim/logging.rb +14 -14
- data/lib/neovim/message.rb +7 -7
- data/lib/neovim/plugin/dsl.rb +4 -4
- data/lib/neovim/plugin/handler.rb +3 -3
- data/lib/neovim/remote_object.rb +3 -3
- data/lib/neovim/ruby_provider.rb +11 -15
- data/lib/neovim/ruby_provider/buffer_ext.rb +1 -0
- data/lib/neovim/ruby_provider/vim.rb +14 -2
- data/lib/neovim/ruby_provider/window_ext.rb +1 -0
- data/lib/neovim/session.rb +7 -10
- data/lib/neovim/version.rb +1 -1
- data/lib/neovim/window.rb +3 -3
- data/neovim.gemspec +5 -4
- data/script/{dump_api → dump_api.rb} +0 -0
- data/script/{generate_docs → generate_docs.rb} +0 -0
- data/script/{j2mp → j2mp.rb} +0 -0
- data/script/{mp2j → mp2j.rb} +0 -0
- data/script/run_acceptance.rb +35 -0
- data/script/validate_docs.rb +29 -0
- data/spec/acceptance/rplugin_autocmd_spec.vim +20 -10
- data/spec/acceptance/rplugin_command_spec.vim +54 -56
- data/spec/acceptance/rplugin_function_spec.vim +28 -22
- data/spec/acceptance/ruby_spec.vim +40 -48
- data/spec/acceptance/rubydo_spec.vim +40 -52
- data/spec/acceptance/rubyfile/nested.rb +1 -1
- data/spec/acceptance/rubyfile_spec.vim +57 -63
- data/spec/acceptance/runtime/init.vim +4 -3
- data/spec/acceptance/runtime/rplugin/ruby/autocmds.rb +6 -2
- data/spec/acceptance/runtime/rplugin/ruby/commands.rb +17 -16
- data/spec/acceptance/runtime/rplugin/ruby/functions.rb +8 -8
- data/spec/helper.rb +2 -2
- data/spec/neovim/api_spec.rb +1 -1
- data/spec/neovim/client_spec.rb +10 -10
- data/spec/neovim/connection_spec.rb +5 -6
- data/spec/neovim/current_spec.rb +12 -12
- data/spec/neovim/executable_spec.rb +2 -2
- data/spec/neovim/host/loader_spec.rb +2 -2
- data/spec/neovim/host_spec.rb +7 -7
- data/spec/neovim/line_range_spec.rb +16 -16
- data/spec/neovim/logging_spec.rb +7 -7
- data/spec/neovim/plugin_spec.rb +6 -6
- data/spec/neovim/ruby_provider/buffer_ext_spec.rb +2 -2
- data/spec/neovim/ruby_provider/vim_spec.rb +4 -4
- data/spec/neovim/ruby_provider/window_ext_spec.rb +8 -8
- data/spec/neovim/session_spec.rb +8 -8
- data/spec/neovim/window_spec.rb +0 -1
- metadata +41 -27
- data/.gitmodules +0 -3
- data/.rspec +0 -1
- data/spec/acceptance/runtime/vader.vim/autoload/vader.vim +0 -348
- data/spec/acceptance/runtime/vader.vim/autoload/vader/assert.vim +0 -116
- data/spec/acceptance/runtime/vader.vim/autoload/vader/helper.vim +0 -43
- data/spec/acceptance/runtime/vader.vim/autoload/vader/parser.vim +0 -179
- data/spec/acceptance/runtime/vader.vim/autoload/vader/syntax.vim +0 -73
- data/spec/acceptance/runtime/vader.vim/autoload/vader/window.vim +0 -205
- data/spec/acceptance/runtime/vader.vim/plugin/vader.vim +0 -37
- data/spec/acceptance_spec.rb +0 -85
data/lib/neovim/line_range.rb
CHANGED
@@ -12,8 +12,8 @@ module Neovim
|
|
12
12
|
# @yieldparam line [String]
|
13
13
|
def each(&block)
|
14
14
|
(0...@buffer.count).each_slice(5000) do |linenos|
|
15
|
-
|
16
|
-
@buffer.get_lines(
|
15
|
+
start, stop = linenos[0], linenos[-1] + 1
|
16
|
+
@buffer.get_lines(start, stop, true).each(&block)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -50,15 +50,15 @@ module Neovim
|
|
50
50
|
# @example Get the first two lines using an index and length
|
51
51
|
# line_range[0, 2] # => ["first", "second"]
|
52
52
|
def [](pos, len=nil)
|
53
|
-
if Range
|
53
|
+
if pos.is_a?(Range)
|
54
54
|
@buffer.get_lines(*range_indices(pos), true)
|
55
55
|
else
|
56
|
-
|
57
|
-
lines = @buffer.get_lines(
|
56
|
+
start, stop = length_indices(pos, len || 1)
|
57
|
+
lines = @buffer.get_lines(start, stop, true)
|
58
58
|
len ? lines : lines.first
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
alias slice []
|
62
62
|
|
63
63
|
# Set a line or line range.
|
64
64
|
#
|
@@ -85,11 +85,11 @@ module Neovim
|
|
85
85
|
*target, val = args
|
86
86
|
pos, len = target
|
87
87
|
|
88
|
-
if Range
|
88
|
+
if pos.is_a?(Range)
|
89
89
|
@buffer.set_lines(*range_indices(pos), true, Array(val))
|
90
90
|
else
|
91
|
-
|
92
|
-
@buffer.set_lines(
|
91
|
+
start, stop = length_indices(pos, len || 1)
|
92
|
+
@buffer.set_lines(start, stop, true, Array(val))
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
@@ -113,18 +113,18 @@ module Neovim
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def range_indices(range)
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
start = adjust_index(range.begin)
|
117
|
+
stop = adjust_index(range.end)
|
118
|
+
stop += 1 unless range.exclude_end?
|
119
119
|
|
120
|
-
[
|
120
|
+
[start, stop]
|
121
121
|
end
|
122
122
|
|
123
123
|
def length_indices(index, len)
|
124
|
-
|
125
|
-
|
124
|
+
start = adjust_index(index)
|
125
|
+
stop = start < 0 ? [start + len, -1].min : start + len
|
126
126
|
|
127
|
-
[
|
127
|
+
[start, stop]
|
128
128
|
end
|
129
129
|
|
130
130
|
def adjust_index(i)
|
data/lib/neovim/logging.rb
CHANGED
@@ -13,13 +13,12 @@ module Neovim
|
|
13
13
|
def self.logger(env=ENV)
|
14
14
|
return @logger if instance_variable_defined?(:@logger)
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
else
|
19
|
-
@logger = Logger.new(STDERR)
|
20
|
-
end
|
16
|
+
env_file, env_level =
|
17
|
+
env.values_at("NVIM_RUBY_LOG_FILE", "NVIM_RUBY_LOG_LEVEL")
|
21
18
|
|
22
|
-
|
19
|
+
@logger = Logger.new(env_file || STDERR)
|
20
|
+
|
21
|
+
if env_level
|
23
22
|
begin
|
24
23
|
@logger.level = Integer(env_level)
|
25
24
|
rescue ArgumentError
|
@@ -43,7 +42,7 @@ module Neovim
|
|
43
42
|
end
|
44
43
|
|
45
44
|
def self.json_formatter
|
46
|
-
|
45
|
+
lambda do |level, time, _, fields|
|
47
46
|
require "multi_json"
|
48
47
|
|
49
48
|
MultiJson.encode(
|
@@ -52,20 +51,21 @@ module Neovim
|
|
52
51
|
_time: time.strftime(TIMESTAMP_FORMAT)
|
53
52
|
}.merge!(fields)
|
54
53
|
) << "\n"
|
55
|
-
|
54
|
+
end
|
56
55
|
end
|
57
56
|
private_class_method :json_formatter
|
58
57
|
|
58
|
+
# @api private
|
59
59
|
module Helpers
|
60
60
|
private
|
61
61
|
|
62
|
-
def log(level,
|
62
|
+
def log(level, method=nil, &block)
|
63
63
|
begin
|
64
64
|
Logging.logger.public_send(level) do
|
65
65
|
{
|
66
66
|
_class: self.class,
|
67
|
-
_method:
|
68
|
-
}.merge!(
|
67
|
+
_method: method || block.binding.eval("__method__")
|
68
|
+
}.merge!(yield)
|
69
69
|
end
|
70
70
|
rescue => ex
|
71
71
|
Logging.logger.error("failed to log: #{ex.inspect}")
|
@@ -74,12 +74,12 @@ module Neovim
|
|
74
74
|
# Inability to log shouldn't abort process
|
75
75
|
end
|
76
76
|
|
77
|
-
def log_exception(level, ex,
|
78
|
-
log(level,
|
77
|
+
def log_exception(level, ex, method)
|
78
|
+
log(level, method) do
|
79
79
|
{exception: ex.class, message: ex.message}
|
80
80
|
end
|
81
81
|
|
82
|
-
log(:debug,
|
82
|
+
log(:debug, method) do
|
83
83
|
{exception: ex.class, message: ex.message, backtrace: ex.backtrace}
|
84
84
|
end
|
85
85
|
end
|
data/lib/neovim/message.rb
CHANGED
@@ -29,13 +29,13 @@ module Neovim
|
|
29
29
|
Notification.new(method, args)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
Request = Struct.new(:id, :method_name, :arguments) do
|
33
33
|
def to_a
|
34
34
|
[0, id, method_name, arguments]
|
35
35
|
end
|
36
36
|
|
37
|
-
def received(_
|
38
|
-
|
37
|
+
def received(_)
|
38
|
+
yield self
|
39
39
|
end
|
40
40
|
|
41
41
|
def sync?
|
@@ -43,7 +43,7 @@ module Neovim
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
Response = Struct.new(:request_id, :error, :value) do
|
47
47
|
def to_a
|
48
48
|
[1, request_id, error, value]
|
49
49
|
end
|
@@ -53,13 +53,13 @@ module Neovim
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
Notification = Struct.new(:method_name, :arguments) do
|
57
57
|
def to_a
|
58
58
|
[2, method_name, arguments]
|
59
59
|
end
|
60
60
|
|
61
|
-
def received(_
|
62
|
-
|
61
|
+
def received(_)
|
62
|
+
yield self
|
63
63
|
end
|
64
64
|
|
65
65
|
def sync?
|
data/lib/neovim/plugin/dsl.rb
CHANGED
@@ -85,14 +85,14 @@ module Neovim
|
|
85
85
|
@plugin.handlers.push(Handler.unqualified(name, block))
|
86
86
|
end
|
87
87
|
|
88
|
-
def register_handler(type, name,
|
88
|
+
def register_handler(type, name, options, block)
|
89
89
|
if type == :autocmd
|
90
|
-
options =
|
90
|
+
options = options.dup
|
91
91
|
else
|
92
|
-
options = standardize(
|
92
|
+
options = standardize(options.dup)
|
93
93
|
end
|
94
94
|
|
95
|
-
sync = options.delete(:sync)
|
95
|
+
sync = !!options.delete(:sync)
|
96
96
|
|
97
97
|
@plugin.handlers.push(
|
98
98
|
Handler.new(@plugin.source, type, name, sync, options, block)
|
@@ -12,7 +12,7 @@ module Neovim
|
|
12
12
|
@source = source
|
13
13
|
@type = type.to_sym if type.respond_to?(:to_sym)
|
14
14
|
@name = name.to_s
|
15
|
-
@sync =
|
15
|
+
@sync = sync
|
16
16
|
@options = options
|
17
17
|
@block = block || -> {}
|
18
18
|
@qualified =
|
@@ -20,7 +20,7 @@ module Neovim
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def sync?
|
23
|
-
|
23
|
+
!!@sync
|
24
24
|
end
|
25
25
|
|
26
26
|
def qualified?
|
@@ -43,7 +43,7 @@ module Neovim
|
|
43
43
|
type: @type,
|
44
44
|
name: @name,
|
45
45
|
sync: @sync,
|
46
|
-
opts: @options
|
46
|
+
opts: @options
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
data/lib/neovim/remote_object.rb
CHANGED
@@ -23,15 +23,15 @@ module Neovim
|
|
23
23
|
|
24
24
|
# Intercept method calls and delegate to appropriate RPC methods.
|
25
25
|
def method_missing(method_name, *args)
|
26
|
-
if func = @api.function_for_object_method(self, method_name)
|
26
|
+
if (func = @api.function_for_object_method(self, method_name))
|
27
27
|
func.call(@session, @index, *args)
|
28
28
|
else
|
29
29
|
super
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
# Extend +
|
34
|
-
def
|
33
|
+
# Extend +respond_to_missing?+ to support RPC methods.
|
34
|
+
def respond_to_missing?(method_name, *)
|
35
35
|
super || rpc_methods.include?(method_name.to_sym)
|
36
36
|
end
|
37
37
|
|
data/lib/neovim/ruby_provider.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "neovim/ruby_provider/vim"
|
2
2
|
require "neovim/ruby_provider/buffer_ext"
|
3
3
|
require "neovim/ruby_provider/window_ext"
|
4
|
+
require "stringio"
|
4
5
|
|
5
6
|
module Neovim
|
6
7
|
# This class is used to define a +Neovim::Plugin+ to act as a backend for the
|
@@ -21,10 +22,7 @@ module Neovim
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# 1. Monkeypatch +$stdout+ and +$stderr+ to write to +nvim+.
|
27
|
-
# 2. Define the +DirChanged+ event to update the provider's pwd.
|
25
|
+
# Define the +DirChanged+ event to update the provider's pwd.
|
28
26
|
def self.__define_setup(plug)
|
29
27
|
plug.__send__(:setup) do |client|
|
30
28
|
begin
|
@@ -108,12 +106,10 @@ module Neovim
|
|
108
106
|
private_class_method :__wrap_client
|
109
107
|
|
110
108
|
def self.__with_exception_handling(client)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
client.err_writeln(msg)
|
116
|
-
end
|
109
|
+
yield
|
110
|
+
rescue ScriptError, StandardError => e
|
111
|
+
msg = [e.class, e.message].join(": ")
|
112
|
+
client.err_writeln(msg)
|
117
113
|
end
|
118
114
|
private_class_method :__with_exception_handling
|
119
115
|
|
@@ -126,8 +122,8 @@ module Neovim
|
|
126
122
|
begin
|
127
123
|
yield
|
128
124
|
|
129
|
-
client.out_write($stdout.string + $/) if $stdout.
|
130
|
-
client.err_writeln($stderr.string) if $stderr.
|
125
|
+
client.out_write($stdout.string + $/) if $stdout.size > 0
|
126
|
+
client.err_writeln($stderr.string) if $stderr.size > 0
|
131
127
|
ensure
|
132
128
|
$stdout = old_stdout
|
133
129
|
$stderr = old_stderr
|
@@ -137,10 +133,10 @@ module Neovim
|
|
137
133
|
|
138
134
|
def self.__update_lines_in_chunks(buffer, start, stop, size)
|
139
135
|
(start..stop).each_slice(size) do |linenos|
|
140
|
-
|
141
|
-
lines = buffer.get_lines(
|
136
|
+
start, stop = linenos[0] - 1, linenos[-1]
|
137
|
+
lines = buffer.get_lines(start, stop, true)
|
142
138
|
|
143
|
-
buffer.set_lines(
|
139
|
+
buffer.set_lines(start, stop, true, yield(lines))
|
144
140
|
end
|
145
141
|
end
|
146
142
|
private_class_method :__update_lines_in_chunks
|
@@ -15,8 +15,20 @@ module Vim
|
|
15
15
|
|
16
16
|
# Delegate all method calls to the underlying +Neovim::Client+ object.
|
17
17
|
def self.method_missing(method, *args, &block)
|
18
|
-
@__client.
|
19
|
-
|
18
|
+
if @__client.respond_to?(method)
|
19
|
+
@__client.public_send(method, *args, &block).tap do
|
20
|
+
__refresh_globals(@__client)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.respond_to_missing?(method, *args)
|
28
|
+
if @__client
|
29
|
+
@__client.send(:respond_to_missing?, method, *args)
|
30
|
+
else
|
31
|
+
super
|
20
32
|
end
|
21
33
|
end
|
22
34
|
|
data/lib/neovim/session.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "neovim/logging"
|
2
2
|
require "fiber"
|
3
|
+
require "thread"
|
3
4
|
|
4
5
|
module Neovim
|
5
6
|
# Wraps an event loop in a synchronous API using +Fiber+s.
|
@@ -22,8 +23,8 @@ module Neovim
|
|
22
23
|
def run(&block)
|
23
24
|
@running = true
|
24
25
|
|
25
|
-
while
|
26
|
-
Fiber.new {
|
26
|
+
while (pending = @pending_messages.shift)
|
27
|
+
Fiber.new { pending.received(@response_handlers, &block) }.resume
|
27
28
|
end
|
28
29
|
|
29
30
|
return unless @running
|
@@ -86,10 +87,10 @@ module Neovim
|
|
86
87
|
def blocking_response
|
87
88
|
response = nil
|
88
89
|
|
89
|
-
@response_handlers[@request_id] =
|
90
|
+
@response_handlers[@request_id] = lambda do |res|
|
90
91
|
response = res
|
91
92
|
stop
|
92
|
-
|
93
|
+
end
|
93
94
|
|
94
95
|
run { |message| @pending_messages << message }
|
95
96
|
response
|
@@ -97,11 +98,7 @@ module Neovim
|
|
97
98
|
|
98
99
|
def yielding_response
|
99
100
|
fiber = Fiber.current
|
100
|
-
|
101
|
-
@response_handlers[@request_id] = -> (response) {
|
102
|
-
fiber.resume(response)
|
103
|
-
}
|
104
|
-
|
101
|
+
@response_handlers[@request_id] = ->(response) { fiber.resume(response) }
|
105
102
|
Fiber.yield
|
106
103
|
end
|
107
104
|
|
@@ -110,7 +107,7 @@ module Neovim
|
|
110
107
|
yield if block_given?
|
111
108
|
else
|
112
109
|
raise(
|
113
|
-
"A Ruby plugin attempted to call neovim outside of the main thread, "
|
110
|
+
"A Ruby plugin attempted to call neovim outside of the main thread, " \
|
114
111
|
"which is not yet supported by the neovim gem."
|
115
112
|
)
|
116
113
|
end
|
data/lib/neovim/version.rb
CHANGED
data/lib/neovim/window.rb
CHANGED
@@ -56,9 +56,9 @@ module Neovim
|
|
56
56
|
# @param coords [Array(Integer, Integer)]
|
57
57
|
# @return [Array(Integer, Integer)]
|
58
58
|
def cursor=(coords)
|
59
|
-
|
60
|
-
x = [
|
61
|
-
y = [
|
59
|
+
x, y = coords
|
60
|
+
x = [x, 1].max
|
61
|
+
y = [y, 0].max + 1
|
62
62
|
@session.request(:nvim_eval, "cursor(#{x}, #{y})")
|
63
63
|
end
|
64
64
|
|
data/neovim.gemspec
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path("../lib", __FILE__)
|
3
|
-
|
2
|
+
$:.unshift(lib) unless $:.include?(lib)
|
4
3
|
require "neovim/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
@@ -23,9 +22,11 @@ Gem::Specification.new do |spec|
|
|
23
22
|
spec.add_dependency "multi_json", "~> 1.0"
|
24
23
|
|
25
24
|
spec.add_development_dependency "bundler"
|
26
|
-
spec.add_development_dependency "
|
25
|
+
spec.add_development_dependency "coveralls"
|
27
26
|
spec.add_development_dependency "pry"
|
28
27
|
spec.add_development_dependency "pry-byebug"
|
29
|
-
spec.add_development_dependency "
|
28
|
+
spec.add_development_dependency "rake"
|
30
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
30
|
+
spec.add_development_dependency "rubocop", "0.52.1"
|
31
|
+
spec.add_development_dependency "vim-flavor", "2.2.2"
|
31
32
|
end
|
File without changes
|
File without changes
|