68 lines
1.9 KiB
Lua
68 lines
1.9 KiB
Lua
|
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 = '<b></b> ', -- 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)
|