mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-01-08 04:04:12 +01:00
Merge default.
--HG-- branch : mode-refactoring
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
//
|
||||
// This work is licensed for reuse under an MIT license. Details are
|
||||
// given in the LICENSE.txt file included with this file.
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @scope modules */
|
||||
|
||||
|
||||
@@ -32,6 +32,10 @@ const Bookmarks = Module("bookmarks", {
|
||||
|
||||
// if starOnly = true it is saved in the unfiledBookmarksFolder, otherwise in the bookmarksMenuFolder
|
||||
add: function add(starOnly, title, url, keyword, tags, force) {
|
||||
// FIXME
|
||||
if (isObject(starOnly))
|
||||
var { starOnly, title, url, keyword, tags, post, force } = starOnly;
|
||||
|
||||
try {
|
||||
let uri = util.createURI(url);
|
||||
if (!force && bookmarks.isBookmarked(uri.spec))
|
||||
@@ -54,6 +58,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
if (!id)
|
||||
return false;
|
||||
|
||||
PlacesUtils.setPostDataForBookmark(id, post);
|
||||
if (keyword)
|
||||
services.get("bookmarks").setKeywordForBookmark(id, keyword);
|
||||
}
|
||||
@@ -65,6 +70,17 @@ const Bookmarks = Module("bookmarks", {
|
||||
return true;
|
||||
},
|
||||
|
||||
addSearchKeyword: function (elem) {
|
||||
let [url, post] = util.parseForm(elem);
|
||||
let options = { "-title": "Search " + elem.ownerDocument.title };
|
||||
if (post != null)
|
||||
options["-post"] = post;
|
||||
|
||||
commandline.open(":",
|
||||
commands.commandToString({ command: "bmark", options: options, arguments: [url] }) + " -keyword ",
|
||||
modes.EX);
|
||||
},
|
||||
|
||||
toggle: function toggle(url) {
|
||||
if (!url)
|
||||
return;
|
||||
@@ -104,11 +120,16 @@ const Bookmarks = Module("bookmarks", {
|
||||
.getBookmarkIdsForURI(uri, {})
|
||||
.filter(bookmarkcache.closure.isRegularBookmark);
|
||||
}
|
||||
bmarks.forEach(services.get("bookmarks").removeItem);
|
||||
bmarks.forEach(function (id) {
|
||||
let bmark = bookmarkcache.bookmarks[id];
|
||||
if (bmark)
|
||||
PlacesUtils.tagging.untagURI(util.newURI(bmark.url), null);
|
||||
services.get("bookmarks").removeItem(id);
|
||||
});
|
||||
return bmarks.length;
|
||||
}
|
||||
catch (e) {
|
||||
dactyl.reportError(e);
|
||||
dactyl.reportError(e, true);
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
@@ -132,7 +153,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
if (engine.alias != alias)
|
||||
engine.alias = alias;
|
||||
|
||||
searchEngines.push([engine.alias, engine.description, engine.iconURI && engine.iconURI.spec]);
|
||||
searchEngines.push({ keyword: engine.alias, title: engine.description, icon: engine.iconURI && engine.iconURI.spec });
|
||||
}
|
||||
|
||||
return searchEngines;
|
||||
@@ -286,10 +307,9 @@ const Bookmarks = Module("bookmarks", {
|
||||
args.completeFilter = have.pop();
|
||||
|
||||
let prefix = filter.substr(0, filter.length - args.completeFilter.length);
|
||||
let tags = array.uniq(array.flatten([b.tags for ([k, b] in Iterator(bookmarkcache.bookmarks)) if (b.tags)]));
|
||||
|
||||
context.keys = { text: 0, description: 1 };
|
||||
return [[prefix + tag, tag] for ([i, tag] in Iterator(tags)) if (have.indexOf(tag) < 0)];
|
||||
context.generate = function () array(b.tags for (b in bookmarkcache) if (b.tags)).flatten().uniq().array;
|
||||
context.keys = { text: function (tag) prefix + tag, description: util.identity };
|
||||
context.filters.push(function (tag) have.indexOf(tag) < 0);
|
||||
},
|
||||
type: CommandOption.LIST
|
||||
};
|
||||
@@ -310,6 +330,17 @@ const Bookmarks = Module("bookmarks", {
|
||||
type: CommandOption.STRING
|
||||
};
|
||||
|
||||
const post = {
|
||||
names: ["-post", "-p"],
|
||||
description: "Bookmark POST data",
|
||||
completer: function post(context, args) {
|
||||
context.keys.text = "post";
|
||||
context.keys.description = "url";
|
||||
return bookmarks.get(args.join(" "), args["-tags"], null, { keyword: args["-keyword"], post: context.filter });
|
||||
},
|
||||
type: CommandOption.STRING
|
||||
};
|
||||
|
||||
const keyword = {
|
||||
names: ["-keyword", "-k"],
|
||||
description: "Keyword by which this bookmark may be opened (:open {keyword})",
|
||||
@@ -324,18 +355,23 @@ const Bookmarks = Module("bookmarks", {
|
||||
commands.add(["bma[rk]"],
|
||||
"Add a bookmark",
|
||||
function (args) {
|
||||
let url = args.length == 0 ? buffer.URL : args[0];
|
||||
let title = args["-title"] || (args.length == 0 ? buffer.title : null);
|
||||
let keyword = args["-keyword"] || null;
|
||||
let tags = args["-tags"] || [];
|
||||
let opts = {
|
||||
force: args.bang,
|
||||
starOnly: false,
|
||||
keyword: args["-keyword"] || null,
|
||||
post: args["-post"] || null,
|
||||
tags: args["-tags"] || [],
|
||||
title: args["-title"] || (args.length === 0 ? buffer.title : null),
|
||||
url: args.length === 0 ? buffer.URL : args[0]
|
||||
};
|
||||
|
||||
if (bookmarks.add(false, title, url, keyword, tags, args.bang)) {
|
||||
let extra = (title == url) ? "" : " (" + title + ")";
|
||||
dactyl.echomsg({ domains: [util.getHost(url)], message: "Added bookmark: " + url + extra },
|
||||
if (bookmarks.add(opts)) {
|
||||
let extra = (opts.title == opts.url) ? "" : " (" + opts.title + ")";
|
||||
dactyl.echomsg({ domains: [util.getHost(opts.url)], message: "Added bookmark: " + opts.url + extra },
|
||||
1, commandline.FORCE_SINGLELINE);
|
||||
}
|
||||
else
|
||||
dactyl.echoerr("Exxx: Could not add bookmark " + title.quote(), commandline.FORCE_SINGLELINE);
|
||||
dactyl.echoerr("Exxx: Could not add bookmark " + opts.title.quote(), commandline.FORCE_SINGLELINE);
|
||||
}, {
|
||||
argCount: "?",
|
||||
bang: true,
|
||||
@@ -350,7 +386,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
}
|
||||
completion.bookmark(context, args["-tags"], { keyword: args["-keyword"], title: args["-title"] });
|
||||
},
|
||||
options: [title, tags, keyword]
|
||||
options: [keyword, title, tags, post]
|
||||
});
|
||||
|
||||
commands.add(["bmarks"],
|
||||
@@ -383,7 +419,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
commandline.input("This will delete all bookmarks. Would you like to continue? (yes/[no]) ",
|
||||
function (resp) {
|
||||
if (resp && resp.match(/^y(es)?$/i)) {
|
||||
bookmarkcache.bookmarks.forEach(function (bmark) { services.get("bookmarks").removeItem(bmark.id); });
|
||||
Object.keys(bookmarkcache.bookmarks).forEach(function (id) { services.get("bookmarks").removeItem(id); });
|
||||
dactyl.echomsg("All bookmarks deleted", 1, commandline.FORCE_SINGLELINE);
|
||||
}
|
||||
});
|
||||
@@ -477,7 +513,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
if (v != null)
|
||||
context.filters.push(function (item) item.item[k] != null && this.matchString(v, item.item[k]));
|
||||
});
|
||||
context.completions = bookmarkcache.bookmarks;
|
||||
context.generate = function () values(bookmarkcache.bookmarks);
|
||||
completion.urls(context, tags);
|
||||
};
|
||||
|
||||
@@ -487,8 +523,8 @@ const Bookmarks = Module("bookmarks", {
|
||||
let engines = bookmarks.getSearchEngines();
|
||||
|
||||
context.title = ["Search Keywords"];
|
||||
context.completions = keywords.concat(engines);
|
||||
context.keys = { text: 0, description: 1, icon: 2 };
|
||||
context.completions = array(values(keywords)).concat(engines).array;
|
||||
context.keys = { text: "keyword", description: "title", icon: "icon" };
|
||||
|
||||
if (!space || noSuggest)
|
||||
return;
|
||||
@@ -496,7 +532,7 @@ const Bookmarks = Module("bookmarks", {
|
||||
context.fork("suggest", keyword.length + space.length, this, "searchEngineSuggest",
|
||||
keyword, true);
|
||||
|
||||
let item = keywords.filter(function (k) k.keyword == keyword)[0];
|
||||
let item = keywords[keyword];
|
||||
if (item && item.url.indexOf("%s") > -1)
|
||||
context.fork("keyword/" + keyword, keyword.length + space.length, null, function (context) {
|
||||
context.format = history.format;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
*/
|
||||
const Browser = Module("browser", {
|
||||
}, {
|
||||
// TODO: support 'nrformats'? -> probably not worth it --mst
|
||||
incrementURL: function (count) {
|
||||
let matches = buffer.URL.match(/(.*?)(\d+)(\D*)$/);
|
||||
dactyl.assert(matches);
|
||||
@@ -122,10 +121,8 @@ const Browser = Module("browser", {
|
||||
}
|
||||
}
|
||||
|
||||
if (count < 1)
|
||||
count = 1;
|
||||
count = Math.max(count, 1);
|
||||
|
||||
// XXX
|
||||
let url = buffer.URL;
|
||||
for (let i = 0; i < count; i++) {
|
||||
if (isDirectory(url))
|
||||
|
||||
@@ -1649,7 +1649,7 @@ const Buffer = Module("buffer", {
|
||||
let elements = frames.map(function (win) [m for (m in util.evaluateXPath(xpath, win.document))])
|
||||
.flatten().filter(function (elem) {
|
||||
|
||||
if (elem.readOnly || elem instanceof HTMLInputElement && !set.has(Events.editableInputs, elem.type))
|
||||
if (elem.readOnly || elem instanceof HTMLInputElement && !set.has(util.editableInputs, elem.type))
|
||||
return false;
|
||||
|
||||
let computedStyle = util.computedStyle(elem);
|
||||
|
||||
@@ -555,7 +555,6 @@ const CommandLine = Module("commandline", {
|
||||
* @param {string} str
|
||||
* @param {string} highlightGroup
|
||||
*/
|
||||
// TODO: resize upon a window resize
|
||||
_echoMultiline: function echoMultiline(str, highlightGroup) {
|
||||
let doc = this.widgets.multilineOutput.contentDocument;
|
||||
let win = this.widgets.multilineOutput.contentWindow;
|
||||
|
||||
@@ -38,7 +38,6 @@ CommandOption.defaultValue("description", function () "");
|
||||
CommandOption.defaultValue("type", function () CommandOption.NOARG);
|
||||
CommandOption.defaultValue("multiple", function () false);
|
||||
update(CommandOption, {
|
||||
// FIXME: remove later, when our option handler is better
|
||||
/**
|
||||
* @property {number} The option argument is unspecified. Any argument
|
||||
* is accepted and caller is responsible for parsing the return
|
||||
|
||||
@@ -100,7 +100,7 @@ const ConfigBase = Class(ModuleBase, {
|
||||
* @property {Object} A map between key names for key events should be ignored,
|
||||
* and a mask of the modes in which they should be ignored.
|
||||
*/
|
||||
ignoreKeys: {}, // XXX: be aware you can't put useful values in here, as "modes.NORMAL" etc. are not defined at this time
|
||||
ignoreKeys: {}, // NOTE: be aware you can't put useful values in here, as "modes.NORMAL" etc. are not defined at this time
|
||||
|
||||
/**
|
||||
* @property {string} The ID of the application's main XUL window.
|
||||
|
||||
@@ -294,7 +294,8 @@ const Dactyl = Module("dactyl", {
|
||||
|
||||
if (!context)
|
||||
context = userContext;
|
||||
return Cu.evalInSandbox("with (window) {" + str + "}", context, "1.8", fileName, lineNumber);
|
||||
context[EVAL_STRING] = str;
|
||||
return Cu.evalInSandbox("with (window) { eval(" + EVAL_STRING + ") }", context, "1.8", fileName, lineNumber);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -630,7 +631,6 @@ const Dactyl = Module("dactyl", {
|
||||
</item></>.toXMLString(), true);
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Opens the help page containing the specified <b>topic</b> if it
|
||||
* exists.
|
||||
@@ -824,7 +824,7 @@ const Dactyl = Module("dactyl", {
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch(e) {}
|
||||
catch (e) {}
|
||||
// Unfortunately, failed page loads throw exceptions and
|
||||
// cause a lot of unwanted noise. This solution means that
|
||||
// any genuine errors go unreported.
|
||||
|
||||
@@ -689,7 +689,7 @@ const Events = Module("events", {
|
||||
if (elem && elem.readOnly)
|
||||
return;
|
||||
|
||||
if (elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type) ||
|
||||
if (elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type) ||
|
||||
elem instanceof HTMLSelectElement) {
|
||||
dactyl.mode = modes.INSERT;
|
||||
if (hasHTMLDocument(win))
|
||||
@@ -697,7 +697,7 @@ const Events = Module("events", {
|
||||
return;
|
||||
}
|
||||
|
||||
if(isinstance(elem, [HTMLEmbedElement, HTMLEmbedElement])) {
|
||||
if (isinstance(elem, [HTMLEmbedElement, HTMLEmbedElement])) {
|
||||
dactyl.mode = modes.EMBED;
|
||||
return;
|
||||
}
|
||||
@@ -982,7 +982,7 @@ const Events = Module("events", {
|
||||
onMouseDown: function (event) {
|
||||
let elem = event.target;
|
||||
let win = elem.ownerDocument && elem.ownerDocument.defaultView || elem;
|
||||
for(; win; win = win != win.parent && win.parent)
|
||||
for (; win; win = win != win.parent && win.parent)
|
||||
win.dactylFocusAllowed = true;
|
||||
},
|
||||
|
||||
@@ -1022,9 +1022,6 @@ const Events = Module("events", {
|
||||
}
|
||||
}
|
||||
}, {
|
||||
editableInputs: set(["date", "datetime", "datetime-local", "email", "file",
|
||||
"month", "number", "password", "range", "search",
|
||||
"tel", "text", "time", "url", "week"]),
|
||||
isContentNode: function (node) {
|
||||
let win = (node.ownerDocument || node).defaultView;
|
||||
for (; win; win = win.parent != win && win.parent)
|
||||
@@ -1034,7 +1031,7 @@ const Events = Module("events", {
|
||||
},
|
||||
isInputElemFocused: function () {
|
||||
let elem = dactyl.focus;
|
||||
return elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type) ||
|
||||
return elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type) ||
|
||||
isinstance(elem, [HTMLIsIndexElement, HTMLEmbedElement,
|
||||
HTMLObjectElement, HTMLTextAreaElement]);
|
||||
}
|
||||
|
||||
@@ -119,7 +119,6 @@ const RangeFinder = Module("rangefinder", {
|
||||
// Called when the search is canceled - for example if someone presses
|
||||
// escape while typing a search
|
||||
onCancel: function () {
|
||||
// TODO: code to reposition the document to the place before search started
|
||||
if (this.rangeFind)
|
||||
this.rangeFind.cancel();
|
||||
},
|
||||
@@ -152,11 +151,9 @@ const RangeFinder = Module("rangefinder", {
|
||||
modes.addMode("FIND_BACKWARD", true);
|
||||
},
|
||||
commandline: function () {
|
||||
// Event handlers for search - closure is needed
|
||||
commandline.registerCallback("change", modes.FIND_FORWARD, this.closure.onKeyPress);
|
||||
commandline.registerCallback("submit", modes.FIND_FORWARD, this.closure.onSubmit);
|
||||
commandline.registerCallback("cancel", modes.FIND_FORWARD, this.closure.onCancel);
|
||||
// TODO: allow advanced myModes in register/triggerCallback
|
||||
commandline.registerCallback("change", modes.FIND_BACKWARD, this.closure.onKeyPress);
|
||||
commandline.registerCallback("submit", modes.FIND_BACKWARD, this.closure.onSubmit);
|
||||
commandline.registerCallback("cancel", modes.FIND_BACKWARD, this.closure.onCancel);
|
||||
|
||||
@@ -54,9 +54,10 @@ const Hints = Module("hints", {
|
||||
this.addMode("t", "Follow hint in a new tab", function (elem) buffer.followLink(elem, dactyl.NEW_TAB));
|
||||
this.addMode("b", "Follow hint in a background tab", function (elem) buffer.followLink(elem, dactyl.NEW_BACKGROUND_TAB));
|
||||
this.addMode("w", "Follow hint in a new window", function (elem) buffer.followLink(elem, dactyl.NEW_WINDOW));
|
||||
this.addMode("O", "Generate an ':open URL' using hint", function (elem, loc) commandline.open(":", "open " + loc, modes.EX));
|
||||
this.addMode("T", "Generate a ':tabopen URL' using hint", function (elem, loc) commandline.open(":", "tabopen " + loc, modes.EX));
|
||||
this.addMode("W", "Generate a ':winopen URL' using hint", function (elem, loc) commandline.open(":", "winopen " + loc, modes.EX));
|
||||
this.addMode("O", "Generate an ‘:open URL’ prompt", function (elem, loc) commandline.open(":", "open " + loc, modes.EX));
|
||||
this.addMode("T", "Generate a ‘:tabopen URL’ prompt", function (elem, loc) commandline.open(":", "tabopen " + loc, modes.EX));
|
||||
this.addMode("W", "Generate a ‘:winopen URL’ prompt", function (elem, loc) commandline.open(":", "winopen " + loc, modes.EX));
|
||||
this.addMode("S", "Add a search keyword", function (elem) bookmarks.addSearchKeyword(elem));
|
||||
this.addMode("v", "View hint source", function (elem, loc) buffer.viewSource(loc, false));
|
||||
this.addMode("V", "View hint source in external editor", function (elem, loc) buffer.viewSource(loc, true));
|
||||
this.addMode("y", "Yank hint location", function (elem, loc) dactyl.clipboardWrite(loc, true));
|
||||
@@ -128,7 +129,7 @@ const Hints = Module("hints", {
|
||||
|
||||
let type = elem.type;
|
||||
|
||||
if (elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type))
|
||||
if (elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type))
|
||||
return [elem.value, false];
|
||||
else {
|
||||
for (let [, option] in Iterator(options["hintinputs"])) {
|
||||
@@ -494,8 +495,9 @@ const Hints = Module("hints", {
|
||||
if ((modes.extended & modes.HINTS) && !this._continue)
|
||||
modes.pop();
|
||||
commandline._lastEcho = null; // Hack.
|
||||
this._hintMode.action(elem, elem.href || elem.src || "",
|
||||
this._extendedhintCount, top);
|
||||
dactyl.trapErrors(this._hintMode.action, this._hintMode,
|
||||
elem, elem.href || elem.src || "",
|
||||
this._extendedhintCount, top);
|
||||
}, timeout);
|
||||
return true;
|
||||
},
|
||||
@@ -766,7 +768,7 @@ const Hints = Module("hints", {
|
||||
this._hintMode = this._hintModes[minor];
|
||||
dactyl.assert(this._hintMode);
|
||||
|
||||
commandline.input(this._hintMode.prompt + ": ", null, {
|
||||
commandline.input(UTF8(this._hintMode.prompt) + ": ", null, {
|
||||
extended: modes.HINTS,
|
||||
leave: function (stack) {
|
||||
if (!stack.push)
|
||||
@@ -917,18 +919,6 @@ const Hints = Module("hints", {
|
||||
this._processHints(followFirst);
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: add resize support
|
||||
// window.addEventListener("resize", onResize, null);
|
||||
|
||||
// function onResize(event)
|
||||
// {
|
||||
// if (event)
|
||||
// doc = event.originalTarget;
|
||||
// else
|
||||
// doc = window.content.document;
|
||||
// }
|
||||
|
||||
//}}}
|
||||
}, {
|
||||
translitTable: Class.memoize(function () {
|
||||
@@ -1087,7 +1077,9 @@ const Hints = Module("hints", {
|
||||
"XPath string of hintable elements activated by ';'",
|
||||
"regexmap", "[iI]:" + Option.quote(util.makeXPath(["img"])) +
|
||||
",[OTivVWy]:" + Option.quote(util.makeXPath(
|
||||
["{a,area}[@href]", "{img,iframe}[@src]"])),
|
||||
["{a,area}[@href]", "{img,iframe}[@src]"])) +
|
||||
",[S]:" + Option.quote(util.makeXPath(
|
||||
["input[not(@type='hidden')]", "textarea", "button", "select"])),
|
||||
{ validator: Option.validateXPath });
|
||||
|
||||
options.add(["hinttags", "ht"],
|
||||
|
||||
@@ -55,7 +55,6 @@ const History = Module("history", {
|
||||
return obj;
|
||||
},
|
||||
|
||||
// TODO: better names
|
||||
stepTo: function stepTo(steps) {
|
||||
let start = 0;
|
||||
let end = window.getWebNavigation().sessionHistory.count - 1;
|
||||
|
||||
@@ -67,7 +67,6 @@ const IO = Module("io", {
|
||||
services.get("downloadManager").addListener(this.downloadListener);
|
||||
},
|
||||
|
||||
|
||||
// TODO: there seems to be no way, short of a new component, to change
|
||||
// the process's CWD - see https://bugzilla.mozilla.org/show_bug.cgi?id=280953
|
||||
/**
|
||||
@@ -392,9 +391,11 @@ lookup:
|
||||
dactyl.execute(line, { setFrom: file });
|
||||
}
|
||||
catch (e) {
|
||||
dactyl.echoerr("Error detected while processing " + file.path);
|
||||
dactyl.echomsg("line\t" + this.sourcing.line + ":");
|
||||
dactyl.reportError(e, true);
|
||||
if (!silent) {
|
||||
dactyl.echoerr("Error detected while processing " + file.path);
|
||||
dactyl.echomsg("line\t" + this.sourcing.line + ":");
|
||||
dactyl.reportError(e, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -407,7 +408,8 @@ lookup:
|
||||
dactyl.log("Sourced: " + filename, 3);
|
||||
}
|
||||
catch (e) {
|
||||
dactyl.reportError(e);
|
||||
if (!(e instanceof FailedAssertion))
|
||||
dactyl.reportError(e);
|
||||
let message = "Sourcing file: " + (e.echoerr || file.path + ": " + e);
|
||||
if (!silent)
|
||||
dactyl.echoerr(message);
|
||||
|
||||
@@ -17,10 +17,10 @@ const Marks = Module("marks", {
|
||||
this._urlMarks = storage.newMap("url-marks", { privateData: true, replacer: replacer, store: true });
|
||||
|
||||
try {
|
||||
if(isArray(Iterator(this._localMarks).next()[1]))
|
||||
if (isArray(Iterator(this._localMarks).next()[1]))
|
||||
this._localMarks.clear();
|
||||
}
|
||||
catch(e) {}
|
||||
catch (e) {}
|
||||
|
||||
this._pendingJumps = [];
|
||||
},
|
||||
|
||||
@@ -1166,7 +1166,6 @@ const Options = Module("options", {
|
||||
if (options["verbose"] > 0 && option.setFrom)
|
||||
msg += "\n Last set from " + option.setFrom.path;
|
||||
|
||||
// FIXME: Message highlight group wrapping messes up the indent up for multi-arg verbose :set queries
|
||||
dactyl.echo(<span highlight="CmdOutput">{msg}</span>);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,14 @@ const QuickMarks = Module("quickmarks", {
|
||||
return res;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the URL of the given QuickMark, or null if none exists.
|
||||
*
|
||||
* @param {string} mark The mark to find.
|
||||
* @returns {string} The mark's URL.
|
||||
*/
|
||||
get: function (mark) this._qmarks.get(mark) || null,
|
||||
|
||||
/**
|
||||
* Deletes the specified quickmarks. The <b>filter</b> is a list of
|
||||
* quickmarks and ranges are supported. Eg. "ab c d e-k".
|
||||
@@ -77,7 +85,7 @@ const QuickMarks = Module("quickmarks", {
|
||||
* URL. See {@link Dactyl#open}.
|
||||
*/
|
||||
jumpTo: function jumpTo(qmark, where) {
|
||||
let url = this._qmarks.get(qmark);
|
||||
let url = this.get(qmark);
|
||||
|
||||
if (url)
|
||||
dactyl.open(url, where);
|
||||
@@ -148,8 +156,17 @@ const QuickMarks = Module("quickmarks", {
|
||||
{
|
||||
argCount: "+",
|
||||
completer: function (context, args) {
|
||||
if (args.length == 2)
|
||||
return completion.url(context);
|
||||
if (args.length == 1)
|
||||
return completion.quickmark(context);
|
||||
if (args.length == 2) {
|
||||
context.fork("current", 0, this, function (context) {
|
||||
context.title = ["Extra Completions"];
|
||||
context.completions = [
|
||||
[quickmarks.get(args[0]), "Current Value"]
|
||||
].filter(function ([k, v]) k);
|
||||
});
|
||||
context.fork("url", 0, completion, "url");
|
||||
}
|
||||
},
|
||||
literal: 1
|
||||
});
|
||||
@@ -168,6 +185,12 @@ const QuickMarks = Module("quickmarks", {
|
||||
literal: 0
|
||||
});
|
||||
},
|
||||
completion: function () {
|
||||
completion.quickmark = function (context) {
|
||||
context.title = ["QuickMark", "URL"];
|
||||
context.generate = function () Iterator(quickmarks._qmarks);
|
||||
}
|
||||
},
|
||||
mappings: function () {
|
||||
var myModes = config.browserModes;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user