awful: add prompt history
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
ea930d8972
commit
df7d60faf3
|
@ -67,6 +67,9 @@ beautiful.init(theme_path)
|
|||
-- to inform it about colors we want it to draw.
|
||||
awful.beautiful.register(beautiful)
|
||||
|
||||
-- Enable prompt history
|
||||
awful.prompt.history.set()
|
||||
|
||||
-- Uncomment this to activate autotabbing
|
||||
-- tabulous.autotab_start()
|
||||
-- }}}
|
||||
|
@ -237,10 +240,10 @@ keybinding({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -
|
|||
|
||||
-- Prompt
|
||||
keybinding({ modkey }, "F1", function ()
|
||||
awful.prompt({ prompt = "Run: " }, mypromptbox, awful.spawn, awful.completion.bash)
|
||||
awful.prompt.run({ prompt = "Run: " }, mypromptbox, awful.spawn, awful.completion.bash)
|
||||
end):add()
|
||||
keybinding({ modkey }, "F4", function ()
|
||||
awful.prompt({ prompt = "Run Lua code: " }, mypromptbox, awful.eval)
|
||||
awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox, awful.eval)
|
||||
end):add()
|
||||
|
||||
--- Tabulous, tab manipulation
|
||||
|
|
|
@ -38,6 +38,8 @@ beautiful = {}
|
|||
hooks = {}
|
||||
hooks.user = {}
|
||||
prompt = {}
|
||||
prompt.history = {}
|
||||
prompt.history.data = { max = 50, index = 0, table = {} }
|
||||
completion = {}
|
||||
screen = {}
|
||||
layout = {}
|
||||
|
@ -758,11 +760,77 @@ function eval(s)
|
|||
return assert(loadstring("return " .. s))()
|
||||
end
|
||||
|
||||
--- Load history file in history table
|
||||
local function prompt_history_load()
|
||||
if prompt.history.data.path then
|
||||
local f = io.open(prompt.history.data.path, "r")
|
||||
|
||||
-- Read history file
|
||||
if f then
|
||||
for line in f:lines() do
|
||||
table.insert(prompt.history.data.table, line)
|
||||
if #prompt.history.data.table >= prompt.history.data.max then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Set path for history file
|
||||
-- @param path The history file path, set "on" to enable history in the default file (~/.awesome_history)
|
||||
-- @param max_size Optional parameter: set the max entries number in the history file, 50 by default
|
||||
function prompt.history.set(path, max_cmd)
|
||||
if path then
|
||||
prompt.history.data.path = path
|
||||
else
|
||||
prompt.history.data.path = os.getenv("HOME") .. "/.awesome_history"
|
||||
end
|
||||
|
||||
if max_cmd then
|
||||
prompt.history.data.max = max_cmd
|
||||
end
|
||||
|
||||
-- Load history stuff with current settings
|
||||
prompt_history_load()
|
||||
end
|
||||
|
||||
--- Save history table in history file
|
||||
local function prompt_history_save()
|
||||
if prompt.history.data.path then
|
||||
local f = assert(io.open(prompt.history.data.path, "w"))
|
||||
for i = 1, math.min(#prompt.history.data.table, prompt.history.data.max) do
|
||||
f:write(prompt.history.data.table[i] .. "\n")
|
||||
end
|
||||
f:close()
|
||||
end
|
||||
end
|
||||
|
||||
--- Add an entry to the history file
|
||||
-- @param command The command to add
|
||||
local function prompt_history_add(command)
|
||||
if prompt.history.data.path
|
||||
and command
|
||||
and command ~= prompt.history.data.table[#prompt.history.data.table] then
|
||||
table.insert(prompt.history.data.table, command)
|
||||
|
||||
-- Do not exceed our max_cmd
|
||||
if #prompt.history.data.table > prompt.history.data.max then
|
||||
table.remove(prompt.history.data.table, 1)
|
||||
end
|
||||
|
||||
-- Save table content in file, not very optimized atm...
|
||||
prompt_history_save()
|
||||
|
||||
prompt.history.data.index = #prompt.history.data.table + 1
|
||||
end
|
||||
end
|
||||
|
||||
--- Use bash completion system to complete command and filename.
|
||||
-- @param command The command line.
|
||||
-- @param cur_pos The cursor position.
|
||||
-- @paran ncomp The element number to complete.
|
||||
-- @return The new commande and the new cursor position.
|
||||
-- @return The new command and the new cursor position.
|
||||
function completion.bash(command, cur_pos, ncomp)
|
||||
local wstart = 1
|
||||
local wend = 1
|
||||
|
@ -847,12 +915,12 @@ end
|
|||
-- @param textbox The textbox to use for the prompt.
|
||||
-- @param exe_callback The callback function to call with command as argument when finished.
|
||||
-- @param completion_callback The callback function to call to get completion.
|
||||
function prompt(args, textbox, exe_callback, completion_callback)
|
||||
function prompt.run(args, textbox, exe_callback, completion_callback)
|
||||
if not args then args = {} end
|
||||
local command = ""
|
||||
local command_before_comp
|
||||
local cur_pos_before_comp
|
||||
local prompt = args.prompt or ""
|
||||
local prettyprompt = args.prompt or ""
|
||||
local inv_col = args.fg_cursor or theme.fg_focus or "black"
|
||||
local cur_col = args.bg_cursor or theme.bg_focus or "white"
|
||||
-- The cursor position
|
||||
|
@ -862,7 +930,7 @@ function prompt(args, textbox, exe_callback, completion_callback)
|
|||
if not textbox or not exe_callback then
|
||||
return
|
||||
end
|
||||
textbox.text = prompt .. prompt_text_with_cursor(text, inv_col, cur_col, cur_pos)
|
||||
textbox.text = prettyprompt .. prompt_text_with_cursor(text, inv_col, cur_col, cur_pos)
|
||||
capi.keygrabber.run(
|
||||
function (mod, key)
|
||||
local has_ctrl = false
|
||||
|
@ -885,6 +953,7 @@ function prompt(args, textbox, exe_callback, completion_callback)
|
|||
else
|
||||
if key == "Return" then
|
||||
textbox.text = ""
|
||||
prompt_history_add(command)
|
||||
exe_callback(command)
|
||||
return false
|
||||
elseif key == "Escape" then
|
||||
|
@ -972,6 +1041,23 @@ function prompt(args, textbox, exe_callback, completion_callback)
|
|||
cur_pos = cur_pos - 1
|
||||
elseif key == "Right" then
|
||||
cur_pos = cur_pos + 1
|
||||
elseif key == "Up" then
|
||||
if prompt.history.data.index > 1 then
|
||||
prompt.history.data.index = prompt.history.data.index - 1
|
||||
|
||||
command = prompt.history.data.table[prompt.history.data.index]
|
||||
cur_pos = #command + 2
|
||||
end
|
||||
elseif key == "Down" then
|
||||
if prompt.history.data.index < #prompt.history.data.table then
|
||||
prompt.history.data.index = prompt.history.data.index + 1
|
||||
|
||||
command = prompt.history.data.table[prompt.history.data.index]
|
||||
cur_pos = #command + 2
|
||||
elseif prompt.history.data.index == #prompt.history.data.table then
|
||||
command = ""
|
||||
cur_pos = 1
|
||||
end
|
||||
else
|
||||
-- len() is UTF-8 aware but #key is not,
|
||||
-- so check that we have one UTF-8 char but advance the cursor of # position
|
||||
|
@ -988,7 +1074,7 @@ function prompt(args, textbox, exe_callback, completion_callback)
|
|||
end
|
||||
|
||||
-- Update textbox
|
||||
textbox.text = prompt .. prompt_text_with_cursor(command, inv_col, cur_col, cur_pos)
|
||||
textbox.text = prettyprompt .. prompt_text_with_cursor(command, inv_col, cur_col, cur_pos)
|
||||
|
||||
return true
|
||||
end)
|
||||
|
|
Loading…
Reference in New Issue