summaryrefslogtreecommitdiff
path: root/lua/aotrix
diff options
context:
space:
mode:
authorAotrix <[email protected]>2026-08-09 18:54:14 +0200
committerAotrix <[email protected]>2026-08-09 18:54:14 +0200
commit97f3f6cbaefe5c96e91a9de2dcc350edd692a4ea (patch)
tree9a1fe3dcb28316323b6fcbbc8f67f8f7166bd21c /lua/aotrix
parent1ab6505e554d70fb95a43e5e0eb1e164e08c9525 (diff)
Add nui for better build experience
Diffstat (limited to 'lua/aotrix')
-rw-r--r--lua/aotrix/build.lua164
-rw-r--r--lua/aotrix/personal_commands.lua11
-rw-r--r--lua/aotrix/plugins/build.lua224
3 files changed, 224 insertions, 175 deletions
diff --git a/lua/aotrix/build.lua b/lua/aotrix/build.lua
deleted file mode 100644
index 933c0ce..0000000
--- a/lua/aotrix/build.lua
+++ /dev/null
@@ -1,164 +0,0 @@
-local COMMANDS = {}
-local CURRENT_COMMAND = nil
-local data_path = vim.fn.stdpath("data")
-local personalCommands = require("aotrix.personal_commands")
-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()
- local created_command = personalCommands.createCommand(COMMANDS)
- addCommandToJsonFile(created_command, PERSONAL_COMMAND_JSON_PATH,
- vim.fn.getcwd())
- CURRENT_COMMAND = created_command.command
- executeCommandInTerminal(CURRENT_COMMAND)
-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", addCommand, {})
-
-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)
diff --git a/lua/aotrix/personal_commands.lua b/lua/aotrix/personal_commands.lua
deleted file mode 100644
index dd1b586..0000000
--- a/lua/aotrix/personal_commands.lua
+++ /dev/null
@@ -1,11 +0,0 @@
-return {
- createCommand = function(COMMANDS)
- local selectedCommand = vim.fn.input('Enter a command: ')
- local selectedDescription = vim.fn.input('Name the command: ')
- COMMANDS[selectedDescription] = {
- command = function() return selectedCommand end,
- description = function() return selectedDescription end
- }
- return COMMANDS[selectedDescription]
- end
-}
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
+}