local acompletion = require 'awful.completion' local aspawn = require 'awful.spawn' local gstring = require 'gears.string' local gtable = require 'gears.table' local prompt = require 'awful.widget.prompt' local string = string local function completion_cb (self, command_before_comp, cur_pos_before_comp, ncomp) return acompletion.generic( command_before_comp, cur_pos_before_comp, ncomp, self.completion_keywords) end local function exe_cb (self, input) -- Exit if the input is empty if not input or #input == 0 then return end -- Trim input = string.gsub(input, "^%s*(.-)%s*$", "%1") -- If the input is not a VI command, spawn it if input:sub(1,1) ~= ':' then aspawn(input) return end -- Parse the custom command local command, parameters = input:gmatch(':([%w-]+)%s*(.*)')() command = command:sub(1,1) parameters = gstring.split(parameters, '%s') -- Quit if the command doesn't exist if not self.commands[command] then print('":' .. command .. '" not reconized as a command') return end self.commands[command].callback(parameters) end local my_prompt = { mt = {} } function my_prompt.new (args) local prompt_widget = nil prompt_widget = prompt { prompt = ' ', -- needs the 3 spaces completion_callback = function (...) return completion_cb(prompt_widget, ...) end, exe_callback = function (...) return exe_cb(prompt_widget, ...) end } prompt_widget.commands = args.commands prompt_widget.completion_keywords = gtable.join( -- TODO: find applications list gtable.find_keys(args.commands, function () return true end, false), args.completion_keywords or {}) return prompt_widget end function my_prompt.mt.__call (self, ...) return my_prompt.new(...) end return setmetatable(my_prompt, my_prompt.mt)