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('lazy_config')
|
||||||
require('mappings')
|
require('mappings')
|
||||||
require('teaching')
|
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 = "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]] })
|
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