diff --git a/common/Makefile.common b/common/Makefile.common index fcb9ebbc..8bb4edaf 100644 --- a/common/Makefile.common +++ b/common/Makefile.common @@ -113,3 +113,11 @@ ${DOC_FILES}: %.html: %.txt $(BASE)/Makefile.common locale/en-US/asciidoc.conf @echo "DOC $@" ${ASCIIDOC} --unsafe -a linkcss -a quirks! -a doctitle="$(shell basename $@)" -o $@ $< +T2T = $(wildcard locale/*/*.t2t) +t2t: $(T2T:%.t2t=%.xhtml) +$(T2T:%.t2t=%.xhtml): locale/en-US/config.t2t + +%.xhtml: %.t2t + @echo "T2T $@" + txt2tags --quiet $< + diff --git a/common/content/buffer.js b/common/content/buffer.js index 732f4ae5..4ce32dca 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -1651,6 +1651,15 @@ function Marks() //{{{ return { + /** + * Add a named mark for the current buffer, at its current position. + * If mark matches [A-Z], it's considered a URL mark, and will jump to + * the same position at the same URL no matter what buffer it's + * selected from. If it matches [a-z'"], it's a local mark, and can + * only be recalled from a buffer with a matching URL. + * + * @param {string} mark + */ // TODO: add support for frameset pages add: function (mark, silent) { @@ -1686,6 +1695,15 @@ function Marks() //{{{ } }, + /** + * Remove all marks matching filter. If special is + * given, removes all local marks. + * + * @param {string} filter A string containing one character for each + * mark to be removed. + * @param {boolean} special Whether to delete all local marks. + */ + // FIXME: Shouldn't special be replaced with a null filter? remove: function (filter, special) { if (special) @@ -1696,20 +1714,24 @@ function Marks() //{{{ } else { - let pattern = new RegExp("[" + filter.replace(/\s+/g, "") + "]"); for (let [mark,] in urlMarks) { - if (pattern.test(mark)) + if (filter.indexOf(mark) >= 0) removeURLMark(mark); } for (let [mark,] in localMarks) { - if (pattern.test(mark)) + if (filter.indexOf(mark) >= 0) removeLocalMark(mark); } } }, + /** + * Jumps to the named mark. See {@link #add} + * + * @param {string} mark The mark to jump to. + */ jumpTo: function (mark) { let ok = false; @@ -1765,6 +1787,11 @@ function Marks() //{{{ liberator.echoerr("E20: Mark not set"); // FIXME: move up? }, + /** + * List all marks matching filter. + * + * @param {string} filter + */ list: function (filter) { let marks = getSortedMarks(); diff --git a/common/content/commands.js b/common/content/commands.js index d357918d..6e7bd58e 100644 --- a/common/content/commands.js +++ b/common/content/commands.js @@ -28,6 +28,12 @@ the terms of any one of the MPL, the GPL or the LGPL. /** @scope modules */ +/** + * A class representing EX commands. Instances are created by + * the {@link Commands} class. + * + * @private + */ // Do NOT create instances of this class yourself, use the helper method // commands.add() instead function Command(specs, description, action, extraInfo) //{{{ @@ -73,30 +79,79 @@ function Command(specs, description, action, extraInfo) //{{{ }; let expandedSpecs = parseSpecs(specs); + /** @property {string[]} All of this command's name spacs. e.g., "com[mand]" */ this.specs = specs; + /** @property {string[]} All of this command's short names, e.g., "com" */ this.shortNames = expandedSpecs.shortNames; + /** @property {string[]} All of this command's long names, e.g., "command" */ this.longNames = expandedSpecs.longNames; - // return the primary command name (the long name of the first spec listed) + /** @property {string} The command's cannonical name. */ this.name = this.longNames[0]; + /** @property {string[]} All of this command's long and short names. */ this.names = expandedSpecs.names; // return all command name aliases + + /** @property {string} This command's description, as shown in :exinfo */ this.description = description || ""; + /** @property {function (Args)} The function called to execute this command. */ this.action = action; + /** @property {string} This command's argument count spec. @see Commands#parseArguments */ this.argCount = extraInfo.argCount || 0; + /** @property {function (CompletionContext, Args)} This command's completer. @see CompletionContext */ this.completer = extraInfo.completer || null; + /** @property {boolean} Whether this command accepts a here document. */ this.hereDoc = extraInfo.hereDoc || false; + /** @property {Array} The options this command takes. @see Commands@parseArguments */ this.options = extraInfo.options || []; + /** @property {boolean} Whether this command may be called with a bang, e.g., :com! */ this.bang = extraInfo.bang || false; + /** @property {boolean} Whether this command may be called with a count, e.g., :12bdel */ this.count = extraInfo.count || false; + /** + * @property {boolean} At what index this command's literal + * arguments begin. For instance, with a value of 2, all arguments + * starting with the third are parsed as a single string, with all + * quoting characters passed literally. This is especially useful for + * commands which take key mappings or ex command lines as + * arguments. + */ this.literal = extraInfo.literal == null ? null : extraInfo.literal; + /** + * @property {function} Should return an array of Objects + * suitable to be passed to {@link Commands#commandToString}, one + * for each past invocation which should be restored on subsequent + * @liberator startups. + */ this.serial = extraInfo.serial; + /** + * @property {boolean} Specifies whether this is a user command. + * User commands may be created by plugins, or directly by users, + * and, unlike basic commands, may be overwritten. Users and + * plugin authors should create only user commands. + */ this.isUserCommand = extraInfo.isUserCommand || false; + /** + * @property {string} For commands defined via :command, contains + * the EX command line to be executed upon invocation. + */ this.replacementText = extraInfo.replacementText || null; }; Command.prototype = { + /** + * Execute this command. + * + * @param {Args} args The parsed args to be passed to + * {@link #action}. + * @param {boolean} bang @deprecated Whether this command was + * executed with a trailing !. + * @param {number} count @deprecated Whether this command was + * executed a leading count. + * @param modifiers Any modifiers to be passed to + * {@link action} + */ execute: function (args, bang, count, modifiers) { // XXX @@ -130,6 +185,11 @@ Command.prototype = { exec(args); }, + /** + * Returns whether this command may be invoked via name. + * + * @param {string} name + */ hasName: function (name) { for (let [,spec] in Iterator(this.specs)) @@ -145,6 +205,18 @@ Command.prototype = { return false; }, + /** + * A helper function to parse an argument string. + * + * @param {string} args The argument string to parse. + * @param {CompletionContext} complete A completion context. + * Non-null when the arguments are being parsed for completion + * purposes. + * @param {Object} extra Extra keys to be spliced into the + * returned Args object. + * @returns Args + * @see Commands#parseArgs + */ parseArgs: function (args, complete, extra) commands.parseArgs(args, this.options, this.argCount, false, this.literal, complete, extra) }; //}}} diff --git a/common/content/hints.js b/common/content/hints.js index 27a1dbb5..3b2f3bd1 100644 --- a/common/content/hints.js +++ b/common/content/hints.js @@ -499,10 +499,12 @@ function Hints() //{{{ return function (linkText) { + liberator.dump(hintStrings); + if (hintStrings.length == 1 && hintStrings[0].length == 0) return true; - let words = tokenize(linkText, wordSplitRegex); + let words = tokenize(wordSplitRegex, linkText); if (hintStrings.length == 1) return charsAtBeginningOfWords(hintStrings[0], words, allowWordOverleaping); else @@ -510,8 +512,7 @@ function Hints() //{{{ }; } //}}} - let hintMatching = options["hintmatching"]; - switch (hintMatching) + switch (options["hintmatching"]) { case "contains" : return containsMatcher(hintString); case "wordstartswith": return wordStartsWithMatcher(hintString, /*allowWordOverleaping=*/ true); diff --git a/common/content/io.js b/common/content/io.js index c4354850..28b2d97f 100644 --- a/common/content/io.js +++ b/common/content/io.js @@ -868,6 +868,8 @@ lookup: { ioManager.sourcing.line = i + 1; // skip line comments and blank lines + line = line.replace(/\r$/, ""); + if (/^\s*(".*)?$/.test(line)) continue; @@ -899,7 +901,7 @@ lookup: if (matches) { args = matches[1]; - heredocEnd = new RegExp("^" + matches[2] + "$", "m"); + heredocEnd = RegExp("^" + matches[2] + "$", "m"); if (matches[1]) heredoc = matches[1] + "\n"; } diff --git a/common/content/ui.js b/common/content/ui.js index 1e55e730..64729de1 100644 --- a/common/content/ui.js +++ b/common/content/ui.js @@ -267,7 +267,6 @@ function CommandLine() //{{{ substring = substring.substr(value.length); this.removeSubstring = substring; - // highlight="Preview" won't work in the editor. let node = util.xmlToDom({substring}, document); let start = this.caret; @@ -1085,8 +1084,6 @@ function CommandLine() //{{{ } else if (event.type == "input") { - if (completions) - completions.previewClear(); this.resetCompletions(); liberator.triggerCallback("change", currentExtendedMode, command); } @@ -1445,7 +1442,10 @@ function CommandLine() //{{{ { autocompleteTimer.reset(); if (completions) - completions.reset(); + { + completions.wildIndex = -1; + completions.previewClear(); + } if (history) history.reset(); } diff --git a/vimperator/TODO b/vimperator/TODO index 0965f954..f30bee47 100644 --- a/vimperator/TODO +++ b/vimperator/TODO @@ -25,6 +25,7 @@ BUGS: - BookmarkAdd is fired once for each bookmark periodically i.e. not in response to adding a bookmark FEATURES: +9 finish :help TODOs 9 fix local options 9 adaptive timeout for auto-completions, :set completions can be updated more often than :open foo diff --git a/vimperator/locale/en-US/asciidoc.conf b/vimperator/locale/en-US/asciidoc.conf index e46c276d..525cdc3f 100644 --- a/vimperator/locale/en-US/asciidoc.conf +++ b/vimperator/locale/en-US/asciidoc.conf @@ -22,7 +22,7 @@ email=stubenschrott@gmx.net [replacements] LOGO=