78 lines
2.2 KiB
Lua
78 lines
2.2 KiB
Lua
|
local ai = {}
|
||
|
|
||
|
local function write_output(lines, cursor)
|
||
|
local new_lines = {}
|
||
|
local count = 1
|
||
|
new_lines[1] = ''
|
||
|
for _, line in ipairs(lines) do
|
||
|
for _, l in ipairs(vim.split(line, '\n')) do
|
||
|
count = count + 1
|
||
|
new_lines[count] = '% ' .. l
|
||
|
end
|
||
|
end
|
||
|
new_lines[count+1] = ''
|
||
|
new_lines[count+2] = ''
|
||
|
|
||
|
vim.schedule(function()
|
||
|
local buf = vim.api.nvim_get_current_buf()
|
||
|
vim.api.nvim_buf_set_text(buf, cursor, 0, cursor, 0, new_lines)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
local function run_external_command(command, input_text, cursor)
|
||
|
local stdout = vim.loop.new_pipe(false)
|
||
|
local stderr = vim.loop.new_pipe(false)
|
||
|
local stdin = vim.loop.new_pipe(true)
|
||
|
local handle
|
||
|
|
||
|
handle = vim.loop.spawn(command, {
|
||
|
stdio = {stdin, stdout, stderr},
|
||
|
}, function(code)
|
||
|
stdout:close()
|
||
|
stderr:close()
|
||
|
stdin:close()
|
||
|
handle:close()
|
||
|
print("Process exited with code: " .. code)
|
||
|
end)
|
||
|
|
||
|
local output = {}
|
||
|
stdout:read_start(function(err, data)
|
||
|
if err then
|
||
|
print("Error reading stdout: " .. err)
|
||
|
return
|
||
|
end
|
||
|
if data then
|
||
|
table.insert(output, data)
|
||
|
else
|
||
|
stdout:read_stop()
|
||
|
write_output(output, cursor)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
-- Write input text to stdin
|
||
|
vim.loop.write(stdin, input_text .. "\n", function(err)
|
||
|
if err then
|
||
|
print("Error writing to stdin: " .. err)
|
||
|
end
|
||
|
vim.loop.shutdown(stdin)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function ai.run()
|
||
|
local s_start = vim.fn.getpos("'<")
|
||
|
local s_end = vim.fn.getpos("'>")
|
||
|
local n_lines = math.abs(s_end[2] - s_start[2]) + 1
|
||
|
local lines = vim.api.nvim_buf_get_lines(0, s_start[2] - 1, s_end[2], false)
|
||
|
lines[1] = string.sub(lines[1], s_start[3], -1)
|
||
|
if n_lines == 1 then
|
||
|
lines[n_lines] = string.sub(lines[n_lines], 1, s_end[3] - s_start[3] + 1)
|
||
|
else
|
||
|
lines[n_lines] = string.sub(lines[n_lines], 1, s_end[3])
|
||
|
end
|
||
|
run_external_command('/home/user/Workspace/Projects/Gemini/run.sh', table.concat(lines, '\n'), s_end[2])
|
||
|
end
|
||
|
|
||
|
vim.keymap.set('v', '<Leader>a', ':<C-u>call v:lua.require("ai").run()<CR>', { silent = true })
|
||
|
|
||
|
return ai
|