Class: OllamaChat::Vim

Inherits:
Object
  • Object
show all
Defined in:
lib/ollama_chat/vim.rb

Overview

A class that provides functionality for inserting text into Vim buffers via remote communication.

Examples:

vim = OllamaChat::Vim.new("MY_SERVER")
vim.insert("Hello, Vim!")

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server_name, clientserver: nil) ⇒ OllamaChat::Vim

Initializes a new Vim server connection

Creates a new OllamaChat::Vim instance for interacting with a specific Vim server. If no server name is provided, it derives a standardized server name based on the current working directory using the default_server_name method.

Parameters:

  • server_name (String, nil)

    The name of the Vim server to connect to. If nil or empty, defaults to a server name derived from the current working directory using default_server_name

  • clientserver (String) (defaults to: nil)

    The clientserver protocol to use, defaults to ‘socket’



24
25
26
27
28
# File 'lib/ollama_chat/vim.rb', line 24

def initialize(server_name, clientserver: nil)
  server_name.full? or server_name = self.class.default_server_name
  @server_name  = server_name
  @clientserver = clientserver || 'socket'
end

Class Method Details

.default_server_name(name = Dir.pwd) ⇒ String

The default_server_name method generates a standardized server name based on a given name or the current working directory.

This method creates a unique server identifier by combining the basename of the provided name (or current working directory) with a truncated MD5 hash digest of the full path. The resulting name is converted to uppercase for consistent formatting.

Parameters:

  • name (String) (defaults to: Dir.pwd)

    the base name to use for server identification defaults to the current working directory

Returns:

  • (String)

    a formatted server name suitable for use with Vim server connections



43
44
45
46
47
48
# File 'lib/ollama_chat/vim.rb', line 43

def self.default_server_name(name = Dir.pwd)
  prefix = File.basename(name)
  suffix = Digest::MD5.hexdigest(name)[0, 8]
  name = [ prefix, suffix ] * ?-
  name.upcase
end

Instance Method Details

#colObject

Returns the current column position of the cursor in the Vim server

This method queries the specified Vim server for the current cursor position using Vim’s remote expression feature. It executes a Vim command that returns the result of ‘col(’.‘)`, which represents the current column number (1-indexed) of the cursor position.



73
74
75
# File 'lib/ollama_chat/vim.rb', line 73

def col
  `vim --clientserver "#@clientserver" --servername "#@server_name" --remote-expr "col('.')"`.chomp.to_i
end

#insert(text) ⇒ Object

Inserts text at the current cursor position in Vim

This method writes the provided text to a temporary file and uses Vim’s remote-send functionality to insert it at the current cursor position. The text is automatically indented to match the current column position.

Parameters:

  • text (String)

    The text to be inserted into the Vim buffer



57
58
59
60
61
62
63
64
65
# File 'lib/ollama_chat/vim.rb', line 57

def insert(text)
  spaces = (col - 1).clamp(0..)
  text   = text.gsub(/^/, ' ' * spaces)
  Tempfile.open do |tmp|
    tmp.write(text)
    tmp.flush
    system %{vim --clientserver "#@clientserver" --servername "#@server_name" --remote-send "<ESC>:r #{tmp.path}<CR>"}
  end
end