nvim 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8207d1ea220ae3a18b71de6377beaac8f117b7b8fb2c816f773a36dc2852043
4
- data.tar.gz: eb0c7bf8c52bc66a26952c5985edc3a0ffca154b0ba51560f9802428e51594b2
3
+ metadata.gz: 86b10be9d49da003c89060559febe3e475e543660e957e6c3dffc15522fbbdd5
4
+ data.tar.gz: 5d4ea6f5bf523a0a8918eb5a6defbbdf58bfd001fde2ba77d75c4ccd2a75858b
5
5
  SHA512:
6
- metadata.gz: 17c4b731220d2da8b667da00bfba85b63f27664d0d6119f4d021b92e66c24ecabd279abc090b8cba6b5ff84baeb2561d6ce3410c7fabb1c91a94857c82d2f82e
7
- data.tar.gz: 3197fe71bdd9506350206fff209e2b0c9fb93bfa926f204e4bebcbacfee849a566b42f9f576efdeb86ee751fbc7b8197a07329fe6e2e9191b735ad86ac3c9604
6
+ metadata.gz: 976dbd80726c5626ff8aacefe48f3b9a3f30b432eb915ab82dca589604bc23260f8073184bf007a168acf7576d1923c8ede6fc3d59f64f7751ec54e4d4a37867
7
+ data.tar.gz: 8f1f04a090a323ffed4011a7a8c22953a3d294034d5e319f5825307c9c45528766a6ac1268483ba540e773d3b6763048580032aa6f4dfc191d89d7e8355fb648
data/INFO.yaml CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
 
5
5
  nvim:
6
- version: 1.0.0
6
+ version: 1.1.0
7
7
  license: BSD-2-Clause+
8
8
  authors:
9
9
  - Bertram Scharpf
@@ -14,5 +14,5 @@ nvim:
14
14
  A simple Ruby client for Neovim.
15
15
  Clean code, minimal dependecies, no frills, no wokeness.
16
16
 
17
- homepage: http://bertram-scharpf.de
17
+ homepage: https://github.com/BertramScharpf/ruby-nvim
18
18
 
data/README.md CHANGED
@@ -69,6 +69,9 @@ echo Sum(13,7)
69
69
  The `:ruby...` commands and the `rubyeval()` function behave as descibed
70
70
  in `:h ruby`.
71
71
 
72
+ Files mentioned in the global variable `g:ruby_require` will be loaded before
73
+ the first Ruby code will be run.
74
+
72
75
  Additionally you can directly execute the buffers contents:
73
76
 
74
77
  ```vim
@@ -129,6 +132,8 @@ This results in:
129
132
  :
130
133
  ```
131
134
 
135
+ The anonymous variable `_` hold this last result.
136
+
132
137
  Output will be added to the buffer, too.
133
138
 
134
139
  ```
@@ -257,6 +262,29 @@ main:1:004> \q!!
257
262
  ```
258
263
 
259
264
 
265
+ #### Miscellaneous Tools
266
+
267
+ Put text into an X selection or a TMux register.
268
+
269
+ ```vim
270
+ let g:ruby_require = "neovim/tools/copy"
271
+ '<,'>ruby xsel $lines
272
+ '<,'>ruby xsel! $ines
273
+ '<,'>ruby tmuxbuf $lines
274
+ ```
275
+
276
+ Make a hex dump.
277
+
278
+ ```vim
279
+ ruby <<EOT
280
+ require "neovim/foreign/xxd"
281
+ bn = $curbuf.get_name
282
+ $vim.command :new
283
+ File.open bn do |b| Xxd::Dump.new.run b do |l| $vim.put [l], "l", false, true end end
284
+ EOT
285
+ ```
286
+
287
+
260
288
  ## Copyright
261
289
 
262
290
  * (C) 2024 Bertram Scharpf <software@bertram-scharpf.de>
data/bin/neovim-ruby-host CHANGED
@@ -9,6 +9,11 @@ require "neovim/host"
9
9
 
10
10
  module Neovim
11
11
 
12
+ if $*.delete "--version" then
13
+ puts [ INFO.name, INFO.version].join " "
14
+ exit
15
+ end
16
+
12
17
  class <<self
13
18
 
14
19
  def plugin &block
@@ -18,33 +23,31 @@ module Neovim
18
23
 
19
24
  private
20
25
 
21
- def run_dsl dsl
22
- @host or raise "Can't add plugins outside of a running session."
23
- dsl.open @path, @host do |dsl|
24
- yield dsl
25
- end
26
+ def run_dsl dsl, &block
27
+ @plugins or raise "Can't add plugins outside of a running session."
28
+ @plugins[ @path] = dsl.open @path, &block
26
29
  end
27
30
 
28
- end
29
-
30
- if $*.delete "--version" then
31
- puts [ Neovim::INFO.name, Neovim::INFO.version].join " "
32
- exit
33
- end
34
-
35
- r = Host.run do |h|
36
- begin
37
- @host = h
38
- $*.each do |p|
39
- @path = p
40
- Kernel.load @path, true
31
+ public
32
+
33
+ def load_plugins
34
+ begin
35
+ @plugins = {}
36
+ $*.each do |p|
37
+ @path = p
38
+ Kernel.load @path, true
39
+ ensure
40
+ @path = nil
41
+ end
42
+ @plugins
41
43
  ensure
42
- @path = nil
44
+ @plugins = nil
43
45
  end
44
- ensure
45
- @host = nil
46
46
  end
47
+
47
48
  end
49
+
50
+ r = Host.run load_plugins
48
51
  exit r.to_i
49
52
 
50
53
  end
@@ -33,8 +33,8 @@ module Neovim
33
33
  end
34
34
 
35
35
 
36
- def start comm, client_name, client_type, client_methods = nil
37
- comm.notify :nvim_set_client_info, client_name, Neovim::INFO.version_h, client_type, client_methods||{}, Neovim::INFO.attributes
36
+ def start comm
37
+ comm.notify :nvim_set_client_info, comm.client_name, INFO.version_h, comm.client_type, comm.client_methods||{}, INFO.attributes
38
38
  channel_id, api_info = *(comm.request :nvim_get_api_info)
39
39
  @client = Client.new comm, channel_id
40
40
  prefixes = {}
@@ -14,6 +14,15 @@ rescue LoadError
14
14
  class FalseClass ; def to_bool ; false ; end ; end
15
15
  class Object ; def to_bool ; true ; end ; end
16
16
  class <<Struct ; alias [] new ; end
17
+ class Module
18
+ def plain_name
19
+ sep = "::"
20
+ n = name.dup
21
+ i = n.rindex sep
22
+ n.slice! 0, i+sep.length if i
23
+ n
24
+ end
25
+ end
17
26
  class String
18
27
  def axe n
19
28
  if n < length then
@@ -0,0 +1,195 @@
1
+ #
2
+ # neovim/foreign/xxd.rb -- Xxd reimplementation
3
+ #
4
+
5
+ # The purpose of this is simply to reduce dependencies.
6
+
7
+ begin
8
+ require "xxd"
9
+ rescue LoadError
10
+
11
+ # ----------------------------------------------------------------
12
+ #
13
+ # xxd.rb -- A Reimplementation of Xxd in plain Ruby
14
+ #
15
+
16
+ module Xxd
17
+
18
+ module ReadChunks
19
+
20
+ private
21
+
22
+ def read_chunks input
23
+ case input
24
+ when String then
25
+ i = 0
26
+ while i < input.bytesize do
27
+ b = input.byteslice i, @line_size
28
+ yield b
29
+ i += @line_size
30
+ end
31
+ else
32
+ loop do
33
+ b = input.read @line_size
34
+ break unless b
35
+ yield b
36
+ break if b.length < @line_size
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ class Dump
44
+
45
+ include ReadChunks
46
+
47
+ LINE_SIZE = 16
48
+ ADDR_FMT = "%%0%dx:"
49
+
50
+ def initialize full: nil, upper: false, line_size: nil, addr_len: nil, input: nil
51
+ @full = full
52
+ @input = input
53
+ @line_size = line_size||LINE_SIZE
54
+ @addr_fmt = ADDR_FMT % (addr_len||8)
55
+ @nib_fmt = "%02x"
56
+ if upper then
57
+ @addr_fmt.upcase!
58
+ @nib_fmt.upcase!
59
+ end
60
+ end
61
+
62
+ def run input
63
+ addr = 0
64
+ prev, repeat = nil, false
65
+ yield "# #@input" if @input
66
+ read_chunks input do |b|
67
+ if b == prev and not @full then
68
+ unless repeat then
69
+ yield "*"
70
+ repeat = true
71
+ end
72
+ else
73
+ r = @addr_fmt % addr
74
+ r << " "
75
+ h = b.unpack "C*"
76
+ sp = false
77
+ @line_size.times {
78
+ x = h.shift
79
+ r << (x ? @nib_fmt % x : " ")
80
+ r << " " if sp
81
+ sp = !sp
82
+ }
83
+ r << " " << (b.gsub /[^ -~]/, ".")
84
+ yield r
85
+ prev, repeat = b, false
86
+ end
87
+ addr += b.size
88
+ end
89
+ yield @addr_fmt % addr
90
+ end
91
+
92
+ class <<self
93
+
94
+ def reverse input
95
+ r = nil
96
+ pos = 0
97
+ repeat = false
98
+ input.each_line { |l|
99
+ case l
100
+ when /^\s*#/ then
101
+ when /^\*/ then repeat = true
102
+ else
103
+ if (l.slice! /^(\h+):\s*/) then
104
+ addr = $1.to_i 0x10
105
+ if repeat then
106
+ while pos + r.length < addr do
107
+ yield r
108
+ pos += r.length
109
+ end
110
+ if pos < addr then
111
+ yield r[ 0, addr - pos]
112
+ pos = addr
113
+ end
114
+ repeat = false
115
+ else
116
+ if pos < addr then
117
+ r = ([0].pack "C*") * (addr - pos)
118
+ yield r
119
+ pos = addr
120
+ elsif pos > addr then
121
+ yield nil, addr
122
+ pos = addr
123
+ end
124
+ end
125
+ end
126
+ row = []
127
+ while (nib = l.slice! /^\h\h ?/) do
128
+ row.push nib.to_i 0x10
129
+ end
130
+ if row.any? then
131
+ r = row.pack "C*"
132
+ yield r
133
+ pos += r.length
134
+ end
135
+ end
136
+ }
137
+ end
138
+
139
+ end
140
+
141
+ end
142
+
143
+ class DumpNums
144
+
145
+ include ReadChunks
146
+
147
+ LINE_SIZE = 12
148
+
149
+ def initialize upper: false, line_size: nil, capitals: nil, input: nil
150
+ @line_size = line_size||LINE_SIZE
151
+ @nib_fmt = "%#04x"
152
+ @nib_fmt.upcase! if upper
153
+ if input then
154
+ @varname = input.dup
155
+ @varname.insert 0, "__" if @varname =~ /\A\d/
156
+ @varname.gsub! /[^a-zA-Z0-9]/, "_"
157
+ @varname.upcase! if capitals
158
+ end
159
+ end
160
+
161
+ def run input, &block
162
+ if @varname then
163
+ yield "unsigned char #@varname[] = {"
164
+ yield "};"
165
+ len = run_plain input, &block
166
+ yield "unsigned int #@varname\_len = %d;" % len
167
+ else
168
+ run_plain input, &block
169
+ end
170
+ end
171
+
172
+ private
173
+
174
+ def run_plain input
175
+ prev, len = nil, 0
176
+ read_chunks input do |b|
177
+ if prev then
178
+ prev << ","
179
+ yield prev
180
+ end
181
+ prev = " " + ((b.unpack "C*").map { |x| @nib_fmt % x }.join ", ")
182
+ len += b.bytesize
183
+ end
184
+ yield prev if prev
185
+ len
186
+ end
187
+
188
+ end
189
+
190
+ end
191
+
192
+ # ----------------------------------------------------------------
193
+
194
+ end
195
+
@@ -29,9 +29,8 @@ module Neovim
29
29
  def sync ; @spec[ :sync] ; end
30
30
  alias sync? sync
31
31
 
32
- def execute *args
33
- @block.call *args
34
- end
32
+ def needs_client? ; true ; end
33
+ def execute *args ; @block.call *args ; end
35
34
 
36
35
  private
37
36
 
@@ -49,18 +48,30 @@ module Neovim
49
48
 
50
49
  end
51
50
 
51
+ class HandlerPlain < Handler
52
+
53
+ def initialize *args, **kwargs
54
+ super *args, **kwargs do |client,*a|
55
+ yield *a
56
+ end
57
+ end
58
+
59
+ def needs_client? ; false ; end
60
+
61
+ end
62
+
52
63
  class DslBase
53
64
 
54
65
  class Plugins
55
66
 
56
67
  attr_reader :type
57
68
 
58
- def initialize type, setup_blocks, handlers
59
- @type, @setup_blocks, @handlers = type, setup_blocks, handlers
69
+ def initialize type, setups, handlers
70
+ @type, @setups, @handlers = type, setups, handlers
60
71
  end
61
72
 
62
73
  def setup client
63
- @setup_blocks.each { |b| b.call client }
74
+ @setups.each { |b| b.call client }
64
75
  end
65
76
 
66
77
  def get_handler name
@@ -81,46 +92,48 @@ module Neovim
81
92
 
82
93
  class <<self
83
94
  private :new
84
- def open source, host
85
- i = new source
95
+ def open *args
96
+ i = new *args
86
97
  yield i
87
- i.add_plugins source, host
98
+ i.mkplugin
88
99
  end
89
100
  end
90
101
 
91
- def initialize source
92
- @setup_blocks = []
102
+ def initialize
103
+ @setups = []
93
104
  @handlers = {}
94
105
  end
95
106
 
96
- def add_plugins source, host
97
- host.add_plugins source, (Plugins.new self.class::TYPE, @setup_blocks, @handlers)
107
+ def mkplugin
108
+ Plugins.new self.class::TYPE, @setups, @handlers
98
109
  end
99
110
 
100
111
  private
101
112
 
113
+ HANDLER = Handler
114
+
102
115
  def add_handler qualified_name, name, type = nil, sync = nil, **opts, &block
103
116
  name = name.to_s
104
117
  qualified_name ||= name
105
- h = Handler.new name, type, sync, **opts, &block
118
+ h = self.class::HANDLER.new name, type, sync, **opts, &block
106
119
  log :info, "Adding Handler", qualified_name: qualified_name, handler: h.spec
107
120
  @handlers[ qualified_name] = h
108
121
  end
109
122
 
110
123
  def add_setup_block &block
111
- @setup_blocks.push block
124
+ @setups.push block
112
125
  end
113
126
 
114
127
  end
115
128
 
116
129
  class DslPlain < DslBase
117
130
 
118
- TYPE = :base
131
+ TYPE = nil
119
132
 
120
- def plain name, **opts
121
- add_handler nil, name, **opts do |client,*args|
122
- yield *args
123
- end
133
+ HANDLER = HandlerPlain
134
+
135
+ def plain name, **opts, &block
136
+ add_handler nil, name, **opts, &block
124
137
  end
125
138
 
126
139
  end
data/lib/neovim/host.rb CHANGED
@@ -3,29 +3,48 @@
3
3
  #
4
4
 
5
5
  require "neovim/remote"
6
+ require "neovim/handler"
6
7
 
7
8
 
8
9
  module Neovim
9
10
 
10
- class Host < Remote
11
+ class Provider < Remote
11
12
 
12
13
  class <<self
13
14
 
14
- def start
15
- super ConnectionStdio do |h|
15
+ def start plugins
16
+ super plugins, ConnectionStdio do |h|
16
17
  yield h
17
18
  end
18
19
  end
19
20
 
21
+ def run plugins
22
+ $stdin.tty? and raise "This program expects to be called by Neovim. It can't run interactively."
23
+ start plugins do |h|
24
+ h.run
25
+ nil
26
+ rescue Remote::Disconnected
27
+ log :fatal, "Disconnected"
28
+ nil
29
+ rescue SignalException
30
+ n = $!.signm
31
+ log :fatal, "Signal was caught: #{n}"
32
+ (n =~ /\A(?:SIG)?TERM\z/) ? 0 : 1
33
+ rescue Exception
34
+ log_exception :fatal
35
+ 2
36
+ end
37
+ end
38
+
20
39
  end
21
40
 
22
- attr_reader :plugins
41
+ end
23
42
 
24
- BASE = :base
43
+ class Host < Provider
25
44
 
26
- def initialize conn
27
- super
28
- DslPlain.open BASE, self do |dsl|
45
+ def initialize plugins, conn
46
+ super plugins, conn
47
+ @plugins[ :base] = DslPlain.open do |dsl|
29
48
  dsl.plain "poll" do
30
49
  start
31
50
  @plugins.each_value { |p| p.setup @conn.client }
@@ -42,45 +61,6 @@ module Neovim
42
61
  end
43
62
  end
44
63
 
45
- def client_name
46
- types = @plugins.map { |_,p| p.type if p.type != BASE }
47
- types.uniq!
48
- types.compact!
49
- name = types.join "-"
50
- log :info, "Client Name", name: name
51
- "ruby-#{name}-host"
52
- end
53
-
54
- def client_methods
55
- r = {}
56
- @plugins[ BASE].options { |name,opts| r[ name] = opts }
57
- r
58
- end
59
-
60
-
61
- class <<self
62
-
63
- def run
64
- $stdin.tty? and raise "This program expects to be called by Neovim. It can't run interactively."
65
- Host.start do |h|
66
- yield h
67
- h.run
68
- nil
69
- rescue Messager::Disconnected
70
- log :fatal, "Disconnected"
71
- nil
72
- rescue SignalException
73
- n = $!.signm
74
- log :fatal, "Signal was caught: #{n}"
75
- (n =~ /\A(?:SIG)?TERM\z/) ? 0 : 1
76
- rescue Exception
77
- log_exception :fatal
78
- 2
79
- end
80
- end
81
-
82
- end
83
-
84
64
  end
85
65
 
86
66
  end
data/lib/neovim/info.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  require "neovim/meta.rb"
2
2
  Neovim::INFO = Neovim::Meta.new "nvim",
3
- version: "1.0.0",
3
+ version: "1.1.0",
4
4
  license: "BSD-2-Clause+",
5
5
  authors: ["Bertram Scharpf"],
6
6
  email: "software@bertram-scharpf.de",
7
7
  summary: "Yet another Ruby client for Neovim",
8
8
  description: "A simple Ruby client for Neovim.\nClean code, minimal dependecies, no frills, no wokeness.",
9
- homepage: "http://bertram-scharpf.de",
10
- commit: "e927f7e"
9
+ homepage: "https://github.com/BertramScharpf/ruby-nvim",
10
+ commit: "45c1473"
@@ -5,6 +5,15 @@
5
5
  require "neovim/foreign/supplement"
6
6
 
7
7
 
8
+ class Object
9
+ def class_name
10
+ obj = self
11
+ while not obj.is_a? Module do obj = obj.class end
12
+ obj.plain_name
13
+ end
14
+ end
15
+
16
+
8
17
  module Neovim
9
18
 
10
19
  module Logging
@@ -111,7 +120,7 @@ module Neovim
111
120
 
112
121
  class Text < Stream
113
122
  NAME = "file"
114
- def initialize file, color: nil, short: nil
123
+ def initialize file, color: nil, short: nil, maxlen: 256
115
124
  super
116
125
  @color =
117
126
  case color
@@ -120,7 +129,7 @@ module Neovim
120
129
  when Integer then true
121
130
  else @file.tty?
122
131
  end
123
- @short = short
132
+ @short, @maxlen = short, maxlen
124
133
  end
125
134
  COLORS = %w(33 32 34;1 4 31;1 35;1 36)
126
135
  def put **fields
@@ -131,8 +140,8 @@ module Neovim
131
140
  (fields.delete :caller).to_s[ %r([^/]+:\d+)],
132
141
  (fields.delete :level),
133
142
  (fields.delete :message).inspect,
134
- ((fields.delete :class).to_s.sub /.*::/, ""),
135
- ((fields.map { |k,v| "#{k}:#{v}" }.join " ").axe 256),
143
+ (fields.delete :sender).class_name,
144
+ ((fields.map { |k,v| "#{k}:#{v}" }.join " ").axe @maxlen),
136
145
  ]
137
146
  if @color then
138
147
  l = l.zip COLORS
@@ -216,16 +225,16 @@ module Neovim
216
225
 
217
226
  def log level, message, **kwargs
218
227
  Logging.put level, message,
219
- class: self.class, caller: (caller 1, 1).first,
228
+ sender: self, caller: (caller 1, 1).first,
220
229
  **kwargs
221
230
  end
222
231
 
223
232
  def log_exception level
224
233
  Logging.put level, "Exception: #$!",
225
- class: self.class, caller: (caller 1, 1).first,
234
+ sender: self, caller: (caller 1, 1).first,
226
235
  exception: $!.class
227
236
  $@.each { |b|
228
- Logging.put :debug3, "Backtrace", line: b
237
+ Logging.put :debug3, "Backtrace", sender: self, line: b
229
238
  }
230
239
  nil
231
240
  end