Class: Neovim::Session

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/neovim/session.rb

Overview

Wraps an AsyncSession in a synchronous API using Fibers.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

included

Constructor Details

#initialize(async_session) ⇒ Session

Returns a new instance of Session.



57
58
59
60
61
62
# File 'lib/neovim/session.rb', line 57

def initialize(async_session)
  @async_session = async_session
  @pending_messages = []
  @main_fiber = Fiber.current
  @running = false
end

Class Method Details

.child(argv) ⇒ Session

Spawn and connect to a child nvim process.

Parameters:

  • argv (Array)

    The arguments to pass to the spawned process

Returns:

See Also:



37
38
39
# File 'lib/neovim/session.rb', line 37

def self.child(argv)
  from_event_loop(EventLoop.child(argv))
end

.stdioSession

Connect to the current process’s standard streams. This is used to promote the current process to a Ruby plugin host.

Returns:

See Also:



46
47
48
# File 'lib/neovim/session.rb', line 46

def self.stdio
  from_event_loop(EventLoop.stdio)
end

.tcp(host, port) ⇒ Session

Connect to a TCP socket.

Parameters:

  • host (String)

    The hostname or IP address

  • port (Fixnum)

    The port

Returns:

See Also:



19
20
21
# File 'lib/neovim/session.rb', line 19

def self.tcp(host, port)
  from_event_loop(EventLoop.tcp(host, port))
end

.unix(socket_path) ⇒ Session

Connect to a UNIX domain socket.

Parameters:

  • socket_path (String)

    The socket path

Returns:

See Also:



28
29
30
# File 'lib/neovim/session.rb', line 28

def self.unix(socket_path)
  from_event_loop(EventLoop.unix(socket_path))
end

Instance Method Details

#apiAPI

Return the nvim API as described in the vim_get_api_info call. Defaults to empty API information.

Returns:

See Also:



69
70
71
# File 'lib/neovim/session.rb', line 69

def api
  @api ||= API.null
end

#channel_idFixnum?

Return the channel ID if registered via vim_get_api_info.

Returns:

  • (Fixnum, nil)


162
163
164
# File 'lib/neovim/session.rb', line 162

def channel_id
  api.channel_id
end

#discover_apiAPI

Discover the nvim API as described in the vim_get_api_info call.

Returns:

See Also:



77
78
79
# File 'lib/neovim/session.rb', line 77

def discover_api
  @api = API.new(request(:vim_get_api_info))
end

#notify(method, *args) ⇒ nil

Make an RPC notification.

Parameters:

  • method (String, Symbol)

    The RPC method name

  • *args (Array)

    The RPC method arguments

Returns:

  • (nil)


136
137
138
139
# File 'lib/neovim/session.rb', line 136

def notify(method, *args)
  @async_session.notify(method, *args)
  nil
end

#request(method, *args) ⇒ Object

Make an RPC request and return its response.

If this method is called inside a callback, we are already inside a Fiber handler. In that case, we write to the stream and yield the Fiber. Once the response is received, resume the Fiber and return the result.

If this method is called outside a callback, write to the stream and run the event loop until a response is received. Messages received in the meantime are enqueued to be handled later.

Parameters:

  • method (String, Symbol)

    The RPC method name

  • *args (Array)

    The RPC method arguments

Returns:

  • (Object)

    The response from the RPC call

Raises:

  • (ArgumentError)

    An error returned from nvim



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/neovim/session.rb', line 119

def request(method, *args)
  if Fiber.current == @main_fiber
    debug("handling blocking request")
    err, res = stopped_request(method, *args)
  else
    debug("yielding request to fiber")
    err, res = running_request(method, *args)
  end

  err ? raise(ArgumentError, err) : res
end

#run {|Object| ... } ⇒ void

This method returns an undefined value.

Run the event loop, handling messages in a Fiber.

Yields:

  • (Object)

See Also:



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/neovim/session.rb', line 88

def run
  @running = true

  while message = @pending_messages.shift
    Fiber.new { yield message if block_given? }.resume
  end

  return unless @running

  @async_session.run(self) do |message|
    Fiber.new { yield message if block_given? }.resume
  end
ensure
  stop
end

#shutdownvoid

This method returns an undefined value.

Shut down the event loop.

See Also:



154
155
156
157
# File 'lib/neovim/session.rb', line 154

def shutdown
  @running = false
  @async_session.shutdown
end

#stopvoid

This method returns an undefined value.

Stop the event loop.

See Also:



145
146
147
148
# File 'lib/neovim/session.rb', line 145

def stop
  @running = false
  @async_session.stop
end