From 46fb0d247e55cab2b4a1fa7cd579fce842bb14f0 Mon Sep 17 00:00:00 2001 From: Marco Candrian Date: Wed, 21 Nov 2007 09:12:49 +0000 Subject: [PATCH] :cmap + 'nore' support; update on :dialog --- content/commands.js | 185 +++++++++++++++++++++++++++++------------- content/completion.js | 3 + content/mappings.js | 5 +- 3 files changed, 135 insertions(+), 58 deletions(-) diff --git a/content/commands.js b/content/commands.js index 689faab1..52f47beb 100644 --- a/content/commands.js +++ b/content/commands.js @@ -659,33 +659,42 @@ vimperator.Commands = function () //{{{ commandManager.add(new vimperator.Command(["dia[log]"], function (args, special) { - var openAt = special ? vimperator.NEW_TAB: vimperator.NEW_WINDOW; - switch (args) + try { - case "about": openDialog("chrome://browser/content/aboutDialog.xul", "_blank", "chrome,dialog,modal,centerscreen"); break; - case "addbookmark": PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksRootId); break; - case "addons": BrowserOpenAddonsMgr(); break; - case "bookmarks": openDialog("chrome://browser/content/bookmarks/bookmarksPanel.xul", "Bookmarks", "dialog,centerscreen,width=600,height=600"); break; - case "console": toJavaScriptConsole(); break; - case "customizetoolbar": BrowserCustomizeToolbar(); break; - case "downloads": toOpenWindowByType('Download:Manager', 'chrome://mozapps/content/downloads/downloads.xul', 'chrome,dialog=no,resizable'); break; - case "history": openDialog("chrome://browser/content/history/history-panel.xul", "History", "dialog,centerscreen,width=600,height=600"); break; - case "import": BrowserImport(); break; - case "openfile": BrowserOpenFileWindow(); break; - case "pageinfo": BrowserPageInfo(); break; - case "pagesource": BrowserViewSourceOfDocument(content.document); break; - case "places": PlacesCommandHook.showPlacesOrganizer(ORGANIZER_ROOT_BOOKMARKS); break; - case "preferences": openPreferences(); break; - // XXX what are onEnter.. and onExit...? - case "printpreview": PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview); break; - case "print": PrintUtils.print(); break; - case "printsetup": PrintUtils.showPageSetup(); break; - case "saveframe": saveFrameDocument(); break; - case "savepage": saveDocument(window.content.document); break; - case "searchengines": openDialog("chrome://browser/content/search/engineManager.xul", "_blank", "chrome,dialog,modal,centerscreen"); break; - // TODO add viewPartialSource('selection'); ... - case "": vimperator.echoerr("E474: Invalid argument"); break; - default: vimperator.echoerr("Dialog '" + args + "' is not available"); + switch (args) + { + case "about": openDialog("chrome://browser/content/aboutDialog.xul", "_blank", "chrome,dialog,modal,centerscreen"); break; + case "addbookmark": PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksRootId); break; + case "addons": BrowserOpenAddonsMgr(); break; + case "bookmarks": openDialog("chrome://browser/content/bookmarks/bookmarksPanel.xul", "Bookmarks", "dialog,centerscreen,width=600,height=600"); break; + case "checkupdates": checkForUpdates(); break; + case "cleardata": Cc[GLUE_CID].getService(Ci.nsIBrowserGlue).sanitize(window || null); break; + case "console": toJavaScriptConsole(); break; + case "customizetoolbar": BrowserCustomizeToolbar(); break; + case "dominspector": inspectDOMDocument(content.document); break; // XXX: orig: _content.document + case "downloads": toOpenWindowByType('Download:Manager', 'chrome://mozapps/content/downloads/downloads.xul', 'chrome,dialog=no,resizable'); break; + case "history": openDialog("chrome://browser/content/history/history-panel.xul", "History", "dialog,centerscreen,width=600,height=600"); break; + case "import": BrowserImport(); break; + case "openfile": BrowserOpenFileWindow(); break; + case "pageinfo": BrowserPageInfo(); break; + case "pagesource": BrowserViewSourceOfDocument(content.document); break; + case "places": PlacesCommandHook.showPlacesOrganizer(ORGANIZER_ROOT_BOOKMARKS); break; + case "preferences": openPreferences(); break; + // XXX what are onEnter.. and onExit...? + case "printpreview": PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview); break; + case "print": PrintUtils.print(); break; + case "printsetup": PrintUtils.showPageSetup(); break; + case "saveframe": saveFrameDocument(); break; + case "savepage": saveDocument(window.content.document); break; + case "searchengines": openDialog("chrome://browser/content/search/engineManager.xul", "_blank", "chrome,dialog,modal,centerscreen"); break; + // TODO add viewPartialSource('selection'); ... + case "": vimperator.echoerr("E474: Invalid argument"); break; + default: vimperator.echoerr("Dialog '" + args + "' not available"); + } + } + catch(err) + { + vimperator.echoerr("Error opening '" + args + "': " + err); } }, { @@ -1286,41 +1295,44 @@ vimperator.Commands = function () //{{{ // 0 args -> list all maps // 1 arg -> list the maps starting with args // 2 args -> map arg1 to arg* - function map(args, noremap) + function map(args, mode, noremap) { - if (!args) + for (var index = 0; index < mode.length; index++) // XXX: actually no multi-modes arrives here { - vimperator.mappings.list(vimperator.modes.NORMAL); - return; - } + if (!args) // TODO: list: function -> allow multiple modes, if once necessary + { + vimperator.mappings.list(mode[index]); + return; + } - var matches = args.match(/^([^\s]+)(?:\s+(.+))?$/); - var [lhs, rhs] = [matches[1], matches[2]]; - var leaderRegexp = //i; + var matches = args.match(/^([^\s]+)(?:\s+(.+))?$/); + var [lhs, rhs] = [matches[1], matches[2]]; + var leaderRegexp = //i; - if (leaderRegexp.test(lhs)) - { - var leaderRef = vimperator.variableReference("mapleader"); - var leader = leaderRef[0] ? leaderRef[0][leaderRef[1]] : "\\"; + if (leaderRegexp.test(lhs)) + { + var leaderRef = vimperator.variableReference("mapleader"); + var leader = leaderRef[0] ? leaderRef[0][leaderRef[1]] : "\\"; - lhs = lhs.replace(leaderRegexp, leader); - } + lhs = lhs.replace(leaderRegexp, leader); + } - if (rhs) - { - vimperator.mappings.add(new vimperator.Map([vimperator.modes.NORMAL], [lhs], - function (count) { vimperator.events.feedkeys((count > 1 ? count : "") + rhs, noremap); }, - { flags: vimperator.Mappings.flags.COUNT, rhs: rhs } - )); - } - else - { - // FIXME: no filtering for now - vimperator.mappings.list(vimperator.modes.NORMAL, lhs); + if (rhs) + { + vimperator.mappings.add(new vimperator.Map([mode[index]], [lhs], + function (count) { vimperator.events.feedkeys((count > 1 ? count : "") + rhs, noremap); }, + { flags: vimperator.Mappings.flags.COUNT, rhs: rhs, noremapping: noremap} + )); + } + else + { + // FIXME: no filtering for now + vimperator.mappings.list(mode[index], lhs); + } } } commandManager.add(new vimperator.Command(["map"], - function (args) { map(args, false); }, + function (args) { map(args, [vimperator.modes.NORMAL], false); }, { usage: ["map {lhs} {rhs}", "map {lhs}", "map"], shortHelp: "Map the key sequence {lhs} to {rhs}", @@ -1328,6 +1340,15 @@ vimperator.Commands = function () //{{{ "Mappings are NOT saved during sessions, make sure you put them in your vimperatorrc file!" } )); + commandManager.add(new vimperator.Command(["cm[ap]"], + function (args) { map(args, [vimperator.modes.COMMAND_LINE], false); }, + { + usage: ["cmap {lhs} {rhs}", "cmap {lhs}", "cmap"], + shortHelp: "Map the key sequence {lhs} to {rhs} (in command-line mode)", + help: "The {rhs} is remapped, allowing for nested and recursive mappings.
" + + "Mappings are NOT saved during sessions, make sure you put them in your vimperatorrc file!" + } + )); commandManager.add(new vimperator.Command(["mapc[lear]"], function (args) { @@ -1345,6 +1366,23 @@ vimperator.Commands = function () //{{{ ":map or :noremap are cleared." } )); + commandManager.add(new vimperator.Command(["cmapc[lear]"], + function (args) + { + if (args) + { + vimperator.echoerr("E474: Invalid argument"); + return; + } + + vimperator.mappings.removeAll(vimperator.modes.COMMAND_LINE); + }, + { + shortHelp: "Remove all mappings (in command-line mode)", + help: "All user-defined mappings which were set by " + + ":cmap or :cnoremap are cleared." + } + )); commandManager.add(new vimperator.Command(["ma[rk]"], function (args) { @@ -1411,10 +1449,14 @@ vimperator.Commands = function () //{{{ line += "\" Mappings\n"; // TODO: write user maps for all modes when we have mode dependant map support - for (var map in vimperator.mappings.getUserIterator(vimperator.modes.NORMAL)) + var mode = [[vimperator.modes.NORMAL, ""], [vimperator.modes.COMMAND_LINE, "c"]]; + for (var y = 0; y < mode.length; y++) { - for (var i = 0; i < map.names.length; i++) - line += "map " + map.names[i] + " " + map.rhs + "\n"; + for (var map in vimperator.mappings.getUserIterator(mode[y][0])) + { + for (var i = 0; i < map.names.length; i++) + line += mode[y][1] + (map.noremap ? "nore" : "") + "map " + map.names[i] + " " + map.rhs + "\n"; + } } line += "\n\" Options\n"; @@ -1480,13 +1522,22 @@ vimperator.Commands = function () //{{{ )); // TODO: remove duplication in :map commandManager.add(new vimperator.Command(["no[remap]"], - function (args) { map(args, true); }, + function (args) { map(args, [vimperator.modes.NORMAL], true); }, { usage: ["no[remap] {lhs} {rhs}", "no[remap] {lhs}", "no[remap]"], shortHelp: "Map the key sequence {lhs} to {rhs}", help: "No remapping of the {rhs} is performed." } )); + // XXX: TODO: remove duplication in :cmap + commandManager.add(new vimperator.Command(["cno[remap]"], + function (args) { map(args, [vimperator.modes.COMMAND_LINE], true); }, + { + usage: ["cno[remap] {lhs} {rhs}", "cno[remap] {lhs}", "cno[remap]"], + shortHelp: "Map the key sequence {lhs} to {rhs} (in command-line mode)", + help: "No remapping of the {rhs} is performed." + } + )); commandManager.add(new vimperator.Command(["o[pen]", "e[dit]"], function (args, special) { @@ -2293,6 +2344,28 @@ vimperator.Commands = function () //{{{ help: "" } )); + commandManager.add(new vimperator.Command(["cunm[ap]"], + function (args) + { + if (!args) + { + vimperator.echoerr("E474: Invalid argument"); + return; + } + + var lhs = args; + + if (vimperator.mappings.hasMap(vimperator.modes.COMMAND_LINE, lhs)) + vimperator.mappings.remove(vimperator.modes.COMMAND_LINE, lhs); + else + vimperator.echoerr("E31: No such mapping"); + }, + { + usage: ["cunm[ap] {lhs}"], + shortHelp: "Remove the mapping of {lhs} (in command-line mode)", + help: "" + } + )); commandManager.add(new vimperator.Command(["ve[rsion]"], function (args, special) { diff --git a/content/completion.js b/content/completion.js index 9998ecd3..7729caa1 100644 --- a/content/completion.js +++ b/content/completion.js @@ -138,8 +138,11 @@ vimperator.Completion = function () //{{{ ["addbookmark", "Add bookmarks for the current page"], ["addons", "Manage Add-ons"], ["bookmarks", "List your bookmarks"], + ["checkupdates", "Check for updates"], + ["cleardata", "Clear private data"], ["console", "JavaScript console"], ["customizetoolbar", "Customize the Toolbar"], + ["dominspector", "DOM Inspector"], ["downloads", "Manage Downloads"], ["history", "List your history"], ["import", "Import Preferences, Bookmarks, History, etc. from other browsers"], diff --git a/content/mappings.js b/content/mappings.js index 74c2fbd4..92a83f98 100644 --- a/content/mappings.js +++ b/content/mappings.js @@ -57,6 +57,7 @@ vimperator.Map = function (modes, cmds, action, extraInfo) //{{{ this.shortHelp = extraInfo.shortHelp || null; this.rhs = extraInfo.rhs || null; + this.noremap = extraInfo.noremapping || null; // XXX: needed for mkv; providing feedkeys true/false still neded? // TODO: are these limited to HINTS mode? // Only set for hints maps @@ -99,7 +100,7 @@ vimperator.Mappings = function () //{{{ /////////////////////////////////////////////////////////////////////////////{{{ var main = []; // array of default Map() objects - var user = []; // array of objects created by :map + var user = []; // array of objects created by :map or :cmap for each (var mode in vimperator.modes) { @@ -300,7 +301,7 @@ vimperator.Mappings = function () //{{{ list += ""; list += " " + vimperator.util.escapeHTML(maps[i].names[j]) + ""; if (maps[i].rhs) - list += " " + vimperator.util.escapeHTML(maps[i].rhs) + ""; + list += " " + (maps[i].noremap ? "*" : " ") + "" + "" + vimperator.util.escapeHTML(maps[i].rhs) + ""; list += ""; } }