Run AI script from within neovim
This commit is contained in:
parent
490a1eea4c
commit
9fe408aa61
|
@ -2,6 +2,7 @@ require('settings')
|
|||
require('lazy_config')
|
||||
require('mappings')
|
||||
require('teaching')
|
||||
require('ai')
|
||||
|
||||
vim.api.nvim_create_autocmd("FileType", { pattern = "make", command = [[set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab]] })
|
||||
vim.api.nvim_create_autocmd("FileType", { pattern = "javascript", command = [[setlocal shiftwidth=2 softtabstop=2 expandtab]] })
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
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
|
Loading…
Reference in New Issue