neovim 0.0.6 → 0.1.0

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -19
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +2 -2
  5. data/Rakefile +1 -25
  6. data/bin/j2mp +1 -1
  7. data/bin/mp2j +1 -1
  8. data/bin/neovim-ruby-host +9 -0
  9. data/lib/neovim.rb +5 -7
  10. data/lib/neovim/async_session.rb +2 -1
  11. data/lib/neovim/buffer.rb +112 -0
  12. data/lib/neovim/client.rb +4 -2
  13. data/lib/neovim/current.rb +9 -1
  14. data/lib/neovim/event_loop.rb +8 -4
  15. data/lib/neovim/host.rb +3 -1
  16. data/lib/neovim/line_range.rb +34 -10
  17. data/lib/neovim/logging.rb +29 -20
  18. data/lib/neovim/manifest.rb +9 -3
  19. data/lib/neovim/plugin.rb +3 -1
  20. data/lib/neovim/plugin/dsl.rb +14 -0
  21. data/lib/neovim/plugin/handler.rb +24 -5
  22. data/lib/neovim/ruby_provider.rb +138 -0
  23. data/lib/neovim/session.rb +14 -5
  24. data/lib/neovim/version.rb +1 -1
  25. data/lib/neovim/window.rb +52 -59
  26. data/spec/acceptance/neovim-ruby-host_spec.rb +6 -1
  27. data/spec/acceptance/ruby_provider_spec.rb +76 -0
  28. data/spec/helper.rb +13 -19
  29. data/spec/neovim/async_session_spec.rb +19 -15
  30. data/spec/neovim/buffer_spec.rb +127 -1
  31. data/spec/neovim/client_spec.rb +1 -1
  32. data/spec/neovim/current_spec.rb +9 -1
  33. data/spec/neovim/event_loop_spec.rb +20 -21
  34. data/spec/neovim/host_spec.rb +1 -1
  35. data/spec/neovim/line_range_spec.rb +73 -9
  36. data/spec/neovim/manifest_spec.rb +26 -0
  37. data/spec/neovim/msgpack_stream_spec.rb +8 -8
  38. data/spec/neovim/plugin_spec.rb +41 -0
  39. data/spec/neovim/remote_object_spec.rb +3 -3
  40. data/spec/neovim/session_spec.rb +68 -29
  41. data/spec/neovim/window_spec.rb +47 -24
  42. data/spec/neovim_spec.rb +3 -5
  43. data/spec/support.rb +1 -2
  44. metadata +5 -3
  45. data/.gitmodules +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e20e3f4df52ff80bb9e0aa9826d5c6c723d2cc6
4
- data.tar.gz: 04019ea3e3e7bb33d231d8a2160a2320f62ca365
3
+ metadata.gz: 6807525e36364dd7a60d2e24a3e5ad3b5c370d88
4
+ data.tar.gz: 59a4fcb659bf1f7f9d2d210aace08b099abb55df
5
5
  SHA512:
6
- metadata.gz: d3a46053cf6e54b97ef541cf314062ee3ed597a61b642e1d3be7355c60d1b568fe35e0dd76b8b22dd9f5e82cbcdd981ca83d09a596dbbaacbb7221530169d510
7
- data.tar.gz: ae0fc91672a39bda8c0a2c756c0a27db7360a8428cb5ab7cdfe9423a25a97d3f3d968d51c0fd42ac986582f32a44eb511a75d6d58213c9384b76483a47b655da
6
+ metadata.gz: 8c19a0766059f4202ce10e4251ee6b88d4db7534c6623c9aec4273386e3af67e92fe2564410f29a5cc8575e71cc488da631b7b6b93a1fcc85aca5492ac9be28e
7
+ data.tar.gz: a941792a2f0b00aac4e7b3af6c738835fc1f682e989829fe4af665802276684aad5ad64cf392e5d5234f211acbb64454dbc4cf3d694f9f051f3cbaef4c43787e
@@ -9,25 +9,10 @@ rvm:
9
9
  - 2.0.0
10
10
  - 2.1.0
11
11
  - 2.2.0
12
+ - 2.3.0
12
13
 
13
- os:
14
- - linux
15
- - osx
16
-
17
- addons:
18
- apt:
19
- packages:
20
- - libtool
21
- - autoconf
22
- - automake
23
- - cmake
24
- - libncurses5-dev
25
- - g++
26
- - pkg-config
27
-
28
- cache:
29
- - apt
30
- - bundler
14
+ before_install:
15
+ - eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) nightly-x64"
31
16
 
32
17
  env: REPORT_COVERAGE=1
33
- script: bundle exec rake spec:ci
18
+ script: bundle exec rake --trace spec
@@ -1,3 +1,12 @@
1
+ # 0.1.0
2
+ - Add --version, -V to neovim-ruby-host executable
3
+ - Update object interfaces to be compatible with Vim :ruby API
4
+ - `NVIM_RUBY_LOG_LEVEL` now takes strings, e.g. `DEBUG`
5
+ - Add `rpc` plugin DSL method for exposing top-level functions
6
+ - Add `ruby_provider.rb` for Vim :ruby API compatibility
7
+ - Remove Cursor class
8
+ - Remove vendored `neovim`
9
+
1
10
  # 0.0.6
2
11
  - Update Session with improved Fiber coordination
3
12
  - Documentation
data/README.md CHANGED
@@ -48,8 +48,8 @@ The `neovim-ruby-host` executable can be used to spawn Ruby plugins via the `rpc
48
48
  # $VIMRUNTIME/rplugin/ruby/my_plugin.rb
49
49
 
50
50
  Neovim.plugin do |plug|
51
- # Define a command called "SetLine" which sets the current line to the sum of
52
- # two values. This command is executed asynchronously, so the return value is
51
+ # Define a command called "SetLine" which sets the contents of the current
52
+ # line. This command is executed asynchronously, so the return value is
53
53
  # ignored.
54
54
  plug.command(:SetLine, :nargs => 1) do |nvim, str|
55
55
  nvim.current.line = str
data/Rakefile CHANGED
@@ -3,31 +3,7 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- namespace :spec do
7
- desc "Build Neovim and run specs on CI"
8
- task :ci => ["neovim:build", :spec]
9
- end
10
-
11
6
  namespace :neovim do
12
- vendor = File.expand_path("../vendor/neovim", __FILE__)
13
-
14
- desc "Build Neovim"
15
- task :build do
16
- sh "git submodule update --init && " +
17
- "cd #{vendor} && " +
18
- "make distclean && " +
19
- "make"
20
- end
21
-
22
- desc "Update vendored Neovim revision"
23
- task :update do
24
- sh "git submodule update --init && " +
25
- "cd #{vendor} && " +
26
- "make distclean && " +
27
- "git pull origin master && " +
28
- "make"
29
- end
30
-
31
7
  desc "Generate Neovim remote API docs"
32
8
  task :generate_docs do
33
9
  require "neovim"
@@ -37,7 +13,7 @@ namespace :neovim do
37
13
  buffer_docs = []
38
14
  window_docs = []
39
15
  tabpage_docs = []
40
- session = Neovim::Session.child(%w(-u NONE -n -N))
16
+ session = Neovim::Session.child(%w(nvim -u NONE -n -N))
41
17
 
42
18
  session.request(:vim_get_api_info)[1]["functions"].each do |func|
43
19
  prefix, method_name = func["name"].split("_", 2)
data/bin/j2mp CHANGED
@@ -5,4 +5,4 @@ require "json"
5
5
  require "msgpack"
6
6
 
7
7
  ARGF.binmode
8
- puts MessagePack.pack(JSON.parse(ARGF.read.strip))
8
+ print MessagePack.pack(JSON.parse(ARGF.read.strip))
data/bin/mp2j CHANGED
@@ -5,4 +5,4 @@ require "json"
5
5
  require "msgpack"
6
6
 
7
7
  ARGF.binmode
8
- puts JSON.dump(MessagePack.unpack(ARGF.read.strip))
8
+ MessagePack::Unpacker.new(ARGF).each { |data| print JSON.dump(data) }
@@ -1,6 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
2
  require "neovim"
3
3
 
4
+ ARGV.each do |arg|
5
+ break if arg == "--"
6
+
7
+ if ["--version", "-V"].include?(arg)
8
+ puts Neovim::VERSION
9
+ exit(0)
10
+ end
11
+ end
12
+
4
13
  if STDIN.tty?
5
14
  abort("Can't run neovim-ruby-host interactively.")
6
15
  else
@@ -1,10 +1,8 @@
1
- require "neovim/async_session"
2
1
  require "neovim/client"
3
- require "neovim/event_loop"
4
2
  require "neovim/host"
5
- require "neovim/msgpack_stream"
6
3
  require "neovim/session"
7
4
  require "neovim/plugin"
5
+ require "neovim/version"
8
6
 
9
7
  # The main entrypoint to the +Neovim+ gem. It allows you to connect to a
10
8
  # running +nvim+ instance programmatically or define a remote plugin to be
@@ -27,7 +25,7 @@ require "neovim/plugin"
27
25
  # Neovim.attach_unix("/tmp/nvim.sock") # => Neovim::Client
28
26
  #
29
27
  # @example Spawn and connect to a child +nvim+ process
30
- # Neovim.attach_child(["-u", "NONE"]) # => Neovim::Client
28
+ # Neovim.attach_child(["nvim", "--embed"]) # => Neovim::Client
31
29
  #
32
30
  # @example Define a Ruby plugin
33
31
  # # ~/.config/nvim/rplugin/ruby/plugin.rb
@@ -73,7 +71,7 @@ module Neovim
73
71
  # @return [Client]
74
72
  # @see Session.tcp
75
73
  def self.attach_tcp(host, port)
76
- Client.new(Session.tcp(host, port).discover_api)
74
+ Client.new Session.tcp(host, port)
77
75
  end
78
76
 
79
77
  # Connect to a running +nvim+ instance over a UNIX domain socket.
@@ -82,7 +80,7 @@ module Neovim
82
80
  # @return [Client]
83
81
  # @see Session.unix
84
82
  def self.attach_unix(socket_path)
85
- Client.new(Session.unix(socket_path).discover_api)
83
+ Client.new Session.unix(socket_path)
86
84
  end
87
85
 
88
86
  # Spawn and connect to a child +nvim+ process.
@@ -91,7 +89,7 @@ module Neovim
91
89
  # @return [Client]
92
90
  # @see Session.child
93
91
  def self.attach_child(argv=[])
94
- Client.new(Session.child(argv).discover_api)
92
+ Client.new Session.child(argv)
95
93
  end
96
94
 
97
95
  # Define an +nvim+ remote plugin using the plugin DSL.
@@ -101,7 +101,8 @@ module Neovim
101
101
 
102
102
  def handle_response(payload)
103
103
  reqid, (_, error), result = payload
104
- @pending_requests.delete(reqid).call(error, result)
104
+ callback = @pending_requests.delete(reqid) || Proc.new {}
105
+ callback.call(error, result)
105
106
  end
106
107
 
107
108
  def handle_notification(payload, callback)
@@ -38,6 +38,105 @@ module Neovim
38
38
  @range = LineRange.new(self, _range.begin, _end)
39
39
  end
40
40
 
41
+ # Get the buffer name.
42
+ #
43
+ # @return [String]
44
+ def name
45
+ get_name
46
+ end
47
+
48
+ # Get the buffer index.
49
+ #
50
+ # @return [Fixnum]
51
+ def number
52
+ get_number
53
+ end
54
+
55
+ # Get the number of lines.
56
+ #
57
+ # @return [Fixnum]
58
+ def count
59
+ lines.to_a.size
60
+ end
61
+
62
+ # Get the number of lines.
63
+ #
64
+ # @return [Fixnum]
65
+ def length
66
+ count
67
+ end
68
+
69
+ # Get the line at the given index.
70
+ #
71
+ # @param index [Fixnum]
72
+ # @return [String]
73
+ def [](index)
74
+ lines[index]
75
+ end
76
+
77
+ # Set the line at the given index.
78
+ #
79
+ # @param index [Fixnum]
80
+ # @param str [String]
81
+ # @return [String]
82
+ def []=(index, str)
83
+ lines[index] = str
84
+ end
85
+
86
+ # Delete the line at the given index.
87
+ #
88
+ # @param index [Fixnum]
89
+ # @return [void]
90
+ def delete(index)
91
+ lines.delete(index)
92
+ end
93
+
94
+ # Append a line after the given index.
95
+ #
96
+ # @param index [Fixnum]
97
+ # @param str [String]
98
+ # @return [String]
99
+ def append(index, str)
100
+ lines[index, 1] = [lines[index], str]
101
+ str
102
+ end
103
+
104
+ # Get the current line of an active buffer.
105
+ #
106
+ # @return [String, nil]
107
+ def line
108
+ if active?
109
+ @session.request(:vim_get_current_line)
110
+ end
111
+ end
112
+
113
+ # Set the current line of an active buffer.
114
+ #
115
+ # @param str [String]
116
+ # @return [String, nil]
117
+ def line=(str)
118
+ if active?
119
+ @session.request(:vim_set_current_line, str)
120
+ end
121
+ end
122
+
123
+ # Get the current line number of an active buffer.
124
+ #
125
+ # @return [Fixnum, nil]
126
+ def line_number
127
+ if active?
128
+ window = @session.request(:vim_get_current_window)
129
+ @session.request(:window_get_cursor, window)[0]
130
+ end
131
+ end
132
+
133
+ # Determine if the buffer is active.
134
+ #
135
+ # @return [Boolean]
136
+ def active?
137
+ @session.request(:vim_get_current_buffer) == self
138
+ end
139
+
41
140
  # The following methods are dynamically generated.
42
141
  =begin
43
142
  @method line_count
@@ -63,6 +162,12 @@ module Neovim
63
162
  @param [Boolean] include_end
64
163
  @return [Array<String>]
65
164
 
165
+ @method get_lines(start, end, strict_indexing)
166
+ @param [Fixnum] start
167
+ @param [Fixnum] end
168
+ @param [Boolean] strict_indexing
169
+ @return [Array<String>]
170
+
66
171
  @method set_line_slice(start, end, include_start, include_end, replacement)
67
172
  @param [Fixnum] start
68
173
  @param [Fixnum] end
@@ -71,6 +176,13 @@ module Neovim
71
176
  @param [Array<String>] replacement
72
177
  @return [void]
73
178
 
179
+ @method set_lines(start, end, strict_indexing, replacement)
180
+ @param [Fixnum] start
181
+ @param [Fixnum] end
182
+ @param [Boolean] strict_indexing
183
+ @param [Array<String>] replacement
184
+ @return [void]
185
+
74
186
  @method get_var(name)
75
187
  @param [String] name
76
188
  @return [Object]
@@ -13,6 +13,8 @@ module Neovim
13
13
  attr_reader :session
14
14
 
15
15
  def initialize(session)
16
+ session.discover_api
17
+
16
18
  @session = session
17
19
  @api = session.api
18
20
  end
@@ -20,7 +22,7 @@ module Neovim
20
22
  # Intercept method calls and delegate to appropriate RPC methods.
21
23
  def method_missing(method_name, *args)
22
24
  if func = @api.function("vim_#{method_name}")
23
- func.call(session, *args)
25
+ func.call(@session, *args)
24
26
  else
25
27
  super
26
28
  end
@@ -45,7 +47,7 @@ module Neovim
45
47
  # client.current.line = "New line"
46
48
  # @see Current
47
49
  def current
48
- Current.new(@session)
50
+ @current ||= Current.new(@session)
49
51
  end
50
52
 
51
53
  private
@@ -8,6 +8,7 @@ module Neovim
8
8
  class Current
9
9
  def initialize(session)
10
10
  @session = session
11
+ @range = (0..-1)
11
12
  end
12
13
 
13
14
  # @return [String]
@@ -23,7 +24,9 @@ module Neovim
23
24
 
24
25
  # @return [Buffer]
25
26
  def buffer
26
- @session.request(:vim_get_current_buffer)
27
+ @session.request(:vim_get_current_buffer).tap do |buf|
28
+ buf.range = @range
29
+ end
27
30
  end
28
31
 
29
32
  # @param buffer [Buffer, Fixnum] The target buffer or index.
@@ -53,5 +56,10 @@ module Neovim
53
56
  def tabpage=(tabpage)
54
57
  @session.request(:vim_set_current_tabpage, tabpage)
55
58
  end
59
+
60
+ # @param range [Range] The target range
61
+ def range=(range)
62
+ @range = range
63
+ end
56
64
  end
57
65
  end
@@ -32,8 +32,7 @@ module Neovim
32
32
  # @param argv [Array] The arguments to pass to the spawned process
33
33
  # @return [EventLoop]
34
34
  def self.child(argv)
35
- argv = [ENV.fetch("NVIM_EXECUTABLE", "nvim"), "--embed"] | argv
36
- io = IO.popen(argv, "rb+")
35
+ io = IO.popen(argv | ["--embed"], "rb+")
37
36
  new(io)
38
37
  end
39
38
 
@@ -104,8 +103,13 @@ module Neovim
104
103
  # @return [void]
105
104
  def shutdown
106
105
  stop
107
- [@rd, @wr].each(&:close)
108
- rescue IOError
106
+
107
+ [@rd, @wr].each do |io|
108
+ begin
109
+ io.close
110
+ rescue IOError
111
+ end
112
+ end
109
113
  end
110
114
  end
111
115
  end
@@ -49,6 +49,8 @@ module Neovim
49
49
  #
50
50
  # @return [void]
51
51
  def run
52
+ @session.discover_api
53
+
52
54
  @session.run do |msg|
53
55
  debug("received #{msg.inspect}")
54
56
  @manifest.handle(msg, client)
@@ -61,7 +63,7 @@ module Neovim
61
63
  private
62
64
 
63
65
  def client
64
- @client ||= Client.new(@session.discover_api)
66
+ @client ||= Client.new(@session)
65
67
  end
66
68
  end
67
69
  end
@@ -38,14 +38,21 @@ module Neovim
38
38
  # line_range[0, 2] # => ["first", "second"]
39
39
  def [](pos, len=nil)
40
40
  case pos
41
- when ::Range
42
- _end = pos.exclude_end? ? pos.end - 1 : pos.end
43
- LineRange.new(@buffer, pos.begin, _end)
41
+ when Range
42
+ LineRange.new(
43
+ @buffer,
44
+ abs_line(pos.begin),
45
+ abs_line(pos.exclude_end? ? pos.end - 1 : pos.end)
46
+ )
44
47
  else
45
48
  if len
46
- LineRange.new(@buffer, pos, pos + len - 1)
49
+ LineRange.new(
50
+ @buffer,
51
+ abs_line(pos),
52
+ abs_line(pos + len -1)
53
+ )
47
54
  else
48
- @buffer.get_line(pos)
55
+ @buffer.get_line(abs_line(pos))
49
56
  end
50
57
  end
51
58
  end
@@ -75,19 +82,25 @@ module Neovim
75
82
  pos, len = target
76
83
 
77
84
  case pos
78
- when ::Range
85
+ when Range
79
86
  @buffer.set_line_slice(
80
- pos.begin,
81
- pos.end,
87
+ abs_line(pos.begin),
88
+ abs_line(pos.end),
82
89
  true,
83
90
  !pos.exclude_end?,
84
91
  val
85
92
  )
86
93
  else
87
94
  if len
88
- @buffer.set_line_slice(pos, pos + len, true, false, val)
95
+ @buffer.set_line_slice(
96
+ abs_line(pos),
97
+ abs_line(pos + len),
98
+ true,
99
+ false,
100
+ val
101
+ )
89
102
  else
90
- @buffer.set_line(pos, val)
103
+ @buffer.set_line(abs_line(pos), val)
91
104
  end
92
105
  end
93
106
  end
@@ -97,5 +110,16 @@ module Neovim
97
110
  self[0..-1] = other
98
111
  self
99
112
  end
113
+
114
+ # @param index [Fixnum]
115
+ def delete(index)
116
+ @buffer.del_line(abs_line(index))
117
+ end
118
+
119
+ private
120
+
121
+ def abs_line(n)
122
+ n < 0 ? (@end + n + 1) : @begin + n
123
+ end
100
124
  end
101
125
  end