summaryrefslogtreecommitdiff
path: root/lua/aotrix/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'lua/aotrix/plugins')
-rw-r--r--lua/aotrix/plugins/build.lua224
1 files changed, 224 insertions, 0 deletions
diff --git a/lua/aotrix/plugins/build.lua b/lua/aotrix/plugins/build.lua
new file mode 100644
index 0000000..c022224
--- /dev/null
+++ b/lua/aotrix/plugins/build.lua
@@ -0,0 +1,224 @@
+return {
+ "MunifTanjim/nui.nvim",
+ config = function()
+ local COMMANDS = {}
+ local CURRENT_COMMAND = nil
+ local data_path = vim.fn.stdpath("data")
+ local PERSONAL_COMMAND_JSON_PATH = data_path ..
+ "/personal_commands.json"
+
+ ---@param command string|nil
+ ---@return nil
+ local executeCommandInTerminal = function(command)
+ if (command ~= nil) then
+ vim.cmd.term()
+ vim.cmd.startinsert()
+ local channel = vim.bo.channel
+ -- 'clear' is used to hide the command
+ local exitMessage = "\nPress enter to exit..."
+ local commandString = command()
+ vim.api.nvim_chan_send(channel,
+ "clear && " .. commandString ..
+ "; echo '" .. exitMessage ..
+ "' && read -s && exit" .. "\n")
+ end
+ end
+
+ local readJsonFromFile = function(filePath)
+ local file, error = io.open(filePath, 'r')
+ if file ~= nil then
+ local content = file:read("*a")
+ local decoded_json = vim.json.decode(content)
+ return decoded_json
+ else
+ print("Error in readJsonFromFile: " .. error)
+ end
+ return nil
+ end
+
+ local addCommandToJsonFile = function(commandBlock, commandsFilePath,
+ directory)
+ local current_json = readJsonFromFile(commandsFilePath)
+ if current_json ~= nil then
+ if current_json[directory] == nil then
+ current_json[directory] = {}
+ end
+ -- FIXME: duplicates
+ table.insert(current_json[directory], {
+ command = tostring(commandBlock.command()),
+ description = tostring(commandBlock.description())
+ })
+ end
+ local file, error = io.open(commandsFilePath, 'w')
+ if file then
+ local indent =
+ vim.bo.expandtab and (' '):rep(vim.o.shiftwidth) or '\t'
+ file:write(vim.json.encode(current_json, {indent = indent}))
+ file:close()
+ else
+ print("Error in writeTableToJsonFile: " .. error)
+ end
+ end
+
+ local updateJsonFile = function(listOfCommands, commandsFilePath,
+ directory)
+ local current_json = readJsonFromFile(commandsFilePath)
+ current_json[directory] = {}
+ for _, value in pairs(listOfCommands) do
+ table.insert(current_json[directory], {
+ command = tostring(value.command()),
+ description = tostring(value.description())
+ })
+ end
+
+ local file, error = io.open(commandsFilePath, 'w')
+ if file then
+ local indent =
+ vim.bo.expandtab and (' '):rep(vim.o.shiftwidth) or '\t'
+ file:write(vim.json.encode(current_json, {indent = indent}))
+ file:close()
+ else
+ print("Error in updateJsonFile: " .. error)
+ end
+ end
+
+ local appendCommandsFromFile = function(commands, commandsFilePath,
+ directory)
+ local current_list_of_commands_json = readJsonFromFile(
+ commandsFilePath)
+ if current_list_of_commands_json ~= nil and
+ current_list_of_commands_json[directory] ~= nil then
+ for _, block in pairs(current_list_of_commands_json[directory]) do
+ local new_command_name = block["description"]
+ commands[new_command_name] = {
+ command = function()
+ return block["command"]
+ end,
+ description = function()
+ return new_command_name
+ end
+ }
+ end
+ end
+ end
+
+ local selectCommand = function(listOfCommands, callback)
+ vim.ui.select(vim.tbl_keys(listOfCommands), {
+ prompt = "Select your command.",
+ format_item = function(item)
+ return listOfCommands[item].description()
+ end
+ }, function(choice)
+ if (choice ~= nil) then
+ CURRENT_COMMAND = listOfCommands[choice].command
+ callback(choice)
+ end
+ end)
+ end
+
+ local addCommand = function(current_command, commands,
+ personal_command_json_path)
+
+ local selectedCommand = nil
+ local event = require("nui.utils.autocmd").event
+ local Input = require("nui.input")
+ local input = Input({
+ position = "50%",
+ size = {width = 20},
+ border = {
+ style = "single",
+ text = {top = "[Howdy?]", top_align = "center"}
+ },
+ win_options = {
+ winhighlight = "Normal:Normal,FloatBorder:Normal"
+ }
+ }, {
+ prompt = "> ",
+ default_value = "",
+ on_submit = function(value)
+ selectedCommand = value
+ local selectedDescription = vim.fn.input(
+ 'Name the command: ')
+ COMMANDS[selectedDescription] = {
+ command = function()
+ return selectedCommand
+ end,
+ description = function()
+ return selectedDescription
+ end
+ }
+ local created_command = COMMANDS[selectedDescription]
+ addCommandToJsonFile(created_command,
+ personal_command_json_path,
+ vim.fn.getcwd())
+ current_command = created_command.command
+ executeCommandInTerminal(current_command)
+ end
+ })
+ -- mount/open the component
+ input:mount()
+
+ -- unmount component when cursor leaves buffer
+ input:on(event.BufLeave, function() input:unmount() end)
+
+ end
+
+ local deleteCommand = function()
+ local previous_command = CURRENT_COMMAND
+ selectCommand(COMMANDS, function(choice)
+ local index = 0
+ for key, _ in pairs(COMMANDS) do
+ index = index + 1
+ if key == choice then
+ COMMANDS[key] = nil
+ updateJsonFile(COMMANDS, PERSONAL_COMMAND_JSON_PATH,
+ vim.fn.getcwd())
+ break
+ end
+ end
+ CURRENT_COMMAND = previous_command
+ end)
+ end
+
+ vim.api.nvim_create_user_command("AddCommand", function()
+ addCommand(CURRENT_COMMAND, COMMANDS, PERSONAL_COMMAND_JSON_PATH)
+ end, {})
+
+ vim.api.nvim_create_user_command("DeleteCommand", deleteCommand, {})
+
+ vim.api.nvim_create_autocmd({'BufEnter', 'BufWinEnter', 'DirChanged'}, {
+ callback = function()
+ COMMANDS = {}
+ local current_json =
+ readJsonFromFile(PERSONAL_COMMAND_JSON_PATH)
+ local current_path = vim.fn.getcwd()
+ if current_json ~= nil then
+ for existing_directory, _ in pairs(current_json) do
+ if (string.find(current_path, existing_directory) == 1) then
+ appendCommandsFromFile(COMMANDS,
+ PERSONAL_COMMAND_JSON_PATH,
+ existing_directory)
+ end
+ end
+ end
+ end
+ })
+
+ vim.keymap.set("n", "mc", function()
+ if (CURRENT_COMMAND == nil) then
+ selectCommand(COMMANDS, function()
+ executeCommandInTerminal(CURRENT_COMMAND)
+ end)
+ else
+ executeCommandInTerminal(CURRENT_COMMAND)
+ end
+ end)
+
+ vim.keymap.set("n", "mC", function()
+ selectCommand(COMMANDS, function()
+ executeCommandInTerminal(CURRENT_COMMAND)
+ end)
+ end)
+
+ end
+}