Wed, 01 Sep 2010 03:59:23 +0100
Initial set of changes to make 'insert' mode 'normal', eradicate 'command' mode and adjust key bindings appropriately (following common binding patterns from other browsers, and in places the nano text editor)
----------------- -- Keybindings -- ----------------- binds = {} -- Binding aliases local key, buf, but, cmd = lousy.bind.key, lousy.bind.buf, lousy.bind.but, lousy.bind.cmd -- Globals or defaults that are used in binds local scroll_step = globals.scroll_step or 20 local zoom_step = globals.zoom_step or 0.1 local homepage = globals.homepage or "http://google.co.uk/" -- Add key bindings to be used across all windows in the given modes. binds.mode_binds = { -- buf(Pattern, function (w, buffer, opts) .. end, opts), -- key({Modifiers}, Key name, function (w, opts) .. end, opts), -- but({Modifiers}, Button num, function (w, opts) .. end, opts), all = { key({}, "Escape", function (w) w:set_mode("normal") end), key({"Control"}, "e", function (w) w:set_mode("command") end), key({"Control"}, "n", function (w) w:set_mode("normal") end), key({"Control"}, "x", function (w) w:close_tab() end), key({"Control"}, "c", function (w) if w:get_mode() ~= "normal" then w:set_mode("normal"); end end), -- Location key({"Control"}, "t", function (w) w:new_tab(homepage); end), -- Location key({"Control"}, "l", function (w) w:set_mode("url-entry"); end), -- Web search key({"Control"}, "k", function (w) w:enter_cmd(":websearch google ") end); -- Back and forth key({"Mod1"}, "Left", function (w) w:back() end); key({"Mod1"}, "Right", function (w) w:forward() end); -- Tab/buffer switching key({"Mod1"}, ".", function (w) w:next_tab(1) end); key({"Mod1"}, ",", function (w) w:prev_tab(1) end); key({"Control"}, "Page_Up", function (w) w:prev_tab() end), key({"Control"}, "Page_Down", function (w) w:next_tab() end), key({"Control"}, "p", function (w) w:navigate(luakit.get_selection("c")) end), key({"Control"}, "P", function (w) w:new_tab(luakit.get_selection("c")) end), key({"Control"}, "y", function (w) luakit.set_selection((w:get_current() or {}).uri or "", "c") end), key({"Control"}, "Y", function (w) luakit.set_selection(w.win.title, "c") end), key({"Control"}, "r", function (w) w:reload() end), key({"Mod1"}, "Home", function (w) w:navigate(homepage) end); key({"Control"}, "+", function (w) w:zoom_in(zoom_step) end), key({"Control"}, "-", function (w) w:zoom_out(zoom_step) end), but({}, 8, function (w) w:back() end), but({}, 9, function (w) w:forward() end), key({}, "XF86Back", function (w) w:back() end), key({}, "XF86Forward", function (w) w:forward() end), -- Link following key({"Mod1"}, "f", function (w) w:set_mode("follow") end), -- Bookmarking key({"Control"}, "d", function (w) end), key({"Control"}, "b", function (w) w:navigate(bookmarks.dump_html()) end), key({"Control"}, "B", function (w) w:new_tab(bookmarks.dump_html()) end), -- Mouse bindings but({}, 2, function (w) -- Open hovered uri in new tab local uri = w:get_current().hovered_uri if uri then w:new_tab(uri) else -- Open selection in current tab uri = luakit.get_selection() if uri then w:get_current().uri = uri end end end), }, normal = { }, command = { key({"Shift"}, "Insert", function (w) w:insert_cmd(luakit.get_selection()) end), key({}, "Up", function (w) w:cmd_hist_prev() end), key({}, "Down", function (w) w:cmd_hist_next() end), key({}, "Tab", function (w) w:cmd_completion() end), key({"Control"}, "w", function (w) w:del_word() end), key({"Control"}, "u", function (w) w:del_line() end), }, search = { key({}, "Up", function (w) w:srch_hist_prev() end), key({}, "Down", function (w) w:srch_hist_next() end), }, ["url-entry"] = { key({"Control"}, "l", function (w) w.ibar.input:set_position(-1); end), }, insert = { }, } -- Command bindings which are matched in the "command" mode from text -- entered into the input bar. binds.commands = { -- cmd({Command, Alias1, ...}, function (w, arg, opts) .. end, opts), cmd({"open", "o" }, function (w, a) w:navigate(a) end), cmd({"tabopen", "t" }, function (w, a) w:new_tab(a) end), cmd({"winopen", "w" }, function (w, a) window.new{a} end), cmd({"back" }, function (w, a) w:back(tonumber(a) or 1) end), cmd({"forward", "f" }, function (w, a) w:forward(tonumber(a) or 1) end), cmd({"scroll" }, function (w, a) w:scroll_vert(a) end), cmd({"quit", "q" }, function (w) luakit.quit() end), cmd({"close", "c" }, function (w) w:close_tab() end), cmd({"websearch", "ws" }, function (w, e, s) w:websearch(e, s) end), cmd({"reload", }, function (w) w:reload() end), cmd({"viewsource", "vs" }, function (w) w:toggle_source(true) end), cmd({"viewsource!", "vs!"}, function (w) w:toggle_source() end), cmd({"bookmark", "bm" }, function (w, a) local args = lousy.util.string.split(a) local uri = table.remove(args, 1) bookmarks.add(uri, args) end), } -- Helper functions which are added to the window struct binds.helper_methods = { -- Navigate current view or open new tab navigate = function (w, uri, view) if not view then view = w:get_current() end if view then view.uri = uri else return w:new_tab(uri) end end, -- search engine wrapper websearch = function (w, args) local sep = string.find(args, " ") local engine = string.sub(args, 1, sep-1) local search = string.sub(args, sep+1) search = string.gsub(search, "^%s*(.-)%s*$", "%1") if not search_engines[engine] then return error("No matching search engine found: " .. engine) end local uri = string.gsub(search_engines[engine], "{%d}", search) return w:navigate(uri) end, -- Tab traversing functions next_tab = function (w, n) w.tabs:switch((((n or 1) + w.tabs:current() -1) % w.tabs:count()) + 1) end, prev_tab = function (w, n) w.tabs:switch(((w.tabs:current() - (n or 1) -1) % w.tabs:count()) + 1) end, goto_tab = function (w, n) w.tabs:switch(n) end, -- If argument is form-active or root-active, emits signal. Ignores all -- other signals. emit_form_root_active_signal = function (w, s) if s == "form-active" then w:get_current():emit_signal("form-active") elseif s == "root-active" then w:get_current():emit_signal("root-active") end end, } -- Insert webview method lookup on window structure table.insert(window.indexes, 1, function (w, k) -- Lookup bind helper method return binds.helper_methods[k] end) -- vim: et:sw=4:ts=8:sts=4:tw=80