From df7d60faf345c46fc199e43c3519e54fa4bf8ffe Mon Sep 17 00:00:00 2001 From: Damien Leone Date: Mon, 11 Aug 2008 19:47:23 +0200 Subject: [PATCH] awful: add prompt history Signed-off-by: Julien Danjou --- awesomerc.lua.in | 7 +++- lib/awful.lua.in | 96 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 96 insertions(+), 7 deletions(-) diff --git a/awesomerc.lua.in b/awesomerc.lua.in index f7d6fb63..8bf9a5d4 100644 --- a/awesomerc.lua.in +++ b/awesomerc.lua.in @@ -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 diff --git a/lib/awful.lua.in b/lib/awful.lua.in index 4affe797..999f8652 100644 --- a/lib/awful.lua.in +++ b/lib/awful.lua.in @@ -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)