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(...) return my_prompt.new(...) end return setmetatable(my_prompt, my_prompt.mt)