Class: Neovim::Session

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

Overview

Wraps an AsyncSession in a synchronous API using Fibers.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(async_session) ⇒ Session

Returns a new instance of Session.



51
52
53
54
55
56
# File 'lib/neovim/session.rb', line 51

def initialize(async_session)
  @async_session = async_session
  @pending_messages = []
  @in_handler = false
  @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:



31
32
33
# File 'lib/neovim/session.rb', line 31

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:



40
41
42
# File 'lib/neovim/session.rb', line 40

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:



13
14
15
# File 'lib/neovim/session.rb', line 13

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:



22
23
24
# File 'lib/neovim/session.rb', line 22

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:



63
64
65
# File 'lib/neovim/session.rb', line 63

def api
  @api ||= API.null
end

#discover_apiself

Discover the nvim API as described in the vim_get_api_info call.

Returns:

  • (self)

See Also:



71
72
73
74
# File 'lib/neovim/session.rb', line 71

def discover_api
  @api = API.new(request(:vim_get_api_info))
  self
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)


129
130
131
132
# File 'lib/neovim/session.rb', line 129

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



114
115
116
117
118
119
120
121
122
# File 'lib/neovim/session.rb', line 114

def request(method, *args)
  if @in_handler
    err, res = running_request(method, *args)
  else
    err, res = stopped_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:



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/neovim/session.rb', line 83

def run
  @running = true

  while message = @pending_messages.shift
    in_handler_fiber { yield message if block_given? }
  end

  return unless @running

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

#shutdownvoid

This method returns an undefined value.

Shut down the event loop

See Also:



147
148
149
150
# File 'lib/neovim/session.rb', line 147

def shutdown
  @running = false
  @async_session.shutdown
end

#stopvoid

This method returns an undefined value.

Stop the event loop

See Also:



138
139
140
141
# File 'lib/neovim/session.rb', line 138

def stop
  @running = false
  @async_session.stop
end