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!")

Instance Attribute Summary collapse

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

Instance Attribute Details

#clientserverString (readonly)

The clientserver attribute reader returns the clientserver protocol to be used.

Returns:

  • (String)

    the clientserver protocol identifier



40
41
42
# File 'lib/ollama_chat/vim.rb', line 40

def clientserver
  @clientserver
end

#server_nameString (readonly)

The server_name attribute reader returns the name of the Vim server to connect to.

Returns:

  • (String)

    the name of the Vim server



34
35
36
# File 'lib/ollama_chat/vim.rb', line 34

def server_name
  @server_name
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



55
56
57
58
59
60
# File 'lib/ollama_chat/vim.rb', line 55

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.



95
96
97
# File 'lib/ollama_chat/vim.rb', line 95

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

#insert(text) ⇒ OllamaChat::Vim?

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

Returns:



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ollama_chat/vim.rb', line 70

def insert(text)
  spaces = (col - 1).clamp(0..)
  text   = text.gsub(/^/, ' ' * spaces)
  Tempfile.open do |tmp|
    tmp.write(text)
    tmp.flush
    result = system %{
      vim --clientserver "#@clientserver" --servername "#@server_name" --remote-send "<ESC>:r #{tmp.path}<CR>"
    }
    unless result
      STDERR.puts <<~EOT
        Failed! vim is required in path and running with server name "#@server_name".
      EOT
      return
    end
  end
  self
end