lua/llm/utils.lua (74 lines of code) (raw):
local config = require("llm.config")
local M = {}
function M.string_after_delim(str, delimiter)
local delimiter_index = string.find(str, delimiter, 1, true)
local last_index = nil
while delimiter_index do
last_index = delimiter_index
delimiter_index = string.find(str, delimiter, last_index + 1, true)
end
if last_index ~= nil then
return string.sub(str, last_index + string.len(delimiter))
else
return nil
end
end
function M.split_str(str, separator)
local parts = {}
local start = 1
local split_start, split_end = string.find(str, separator, start)
while split_start do
table.insert(parts, string.sub(str, start, split_start - 1))
start = split_end + 1
split_start, split_end = string.find(str, separator, start)
end
table.insert(parts, string.sub(str, start))
return parts
end
function M.trim(s)
return string.gsub(s, "^%s*(.-)%s*$", "%1")
end
function M.startswith(str, begin)
return str:sub(1, #begin) == begin
end
function M.get_cursor_pos()
return unpack(vim.api.nvim_win_get_cursor(0))
end
function M.get_model()
local model = os.getenv("LLM_NVIM_MODEL")
if model == nil then
model = config.get().model
end
return model
end
function M.get_url()
local model = os.getenv("LLM_NVIM_URL")
if model == nil then
model = config.get().url
end
return model
end
function M.ends_with(str, ending)
return ending == "" or string.sub(str, -string.len(ending)) == ending
end
function M.insert_at(dst, at, src)
at = math.max(1, math.min(at, #dst + 1))
local before = string.sub(dst, 1, at - 1)
local after = string.sub(dst, at)
local result = before .. src
if not M.ends_with(src, after) then
result = result .. after
end
return result
end
function M.execute_command(command)
local handle = io.popen(command)
if handle == nil then
vim.notify("[LLM] error executing command: " .. command, vim.log.levels.ERROR)
return nil
end
local result = M.trim(handle:read("*a"))
handle:close()
return result
end
return M