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=
-HEADER=
+HEADER=
\[count\]=[count] \[args\]=[args] \[arg\]=[arg] diff --git a/vimperator/locale/en-US/eval.txt b/vimperator/locale/en-US/eval.txt index b7e51a8a..0904386d 100644 --- a/vimperator/locale/en-US/eval.txt +++ b/vimperator/locale/en-US/eval.txt @@ -26,8 +26,8 @@ ________________________________________________________________________________ |:echom| |:echomsg| ||:echom[sg] {expr}|| + ________________________________________________________________________________ -Echo the expression as an infomational message. Just like [c]:ec[ho][c], but -also saves the message in the the message history. +Echo the expression as an informational message. Just like [c]:ec[ho][c], but +also saves the message in the message history. ________________________________________________________________________________ diff --git a/vimperator/locale/en-US/map.txt b/vimperator/locale/en-US/map.txt index e3d35e20..97e4ea73 100644 --- a/vimperator/locale/en-US/map.txt +++ b/vimperator/locale/en-US/map.txt @@ -144,7 +144,7 @@ ________________________________________________________________________________ |:map-| + ________________________________________________________________________________ When the first argument to one of the mapping commands is , {rhs} -is not echoed to the commandline, nor, for that matter, is anything else +is not echoed to the command-line, nor, for that matter, is anything else until the command has completed. ________________________________________________________________________________ @@ -324,7 +324,7 @@ Custom completion Custom completion can be provided by specifying the "custom,{func}" argument to -complete. The {func} is called with two arguments, a completion context, and -an an object describing the command's arguments. It should set the context's +an object describing the command's arguments. It should set the context's \'completions' property, or return an object, with \'start' and \'items' properties, describing the completions and where the replacement is to start. diff --git a/vimperator/locale/en-US/options.txt b/vimperator/locale/en-US/options.txt index 22cdd8c7..31487e54 100644 --- a/vimperator/locale/en-US/options.txt +++ b/vimperator/locale/en-US/options.txt @@ -734,7 +734,7 @@ ____ |\'novb'| |\'novisualbell'| |\'vb'| |\'visualbell'| ||'visualbell' 'vb'|| boolean (default: off) ____ -Use visual bell instead of beeping on errors. The visualbell style is +Use visual bell instead of beeping on errors. The visual bell style is controlled by [c]:hi Bell[c]. If no bell is desired use [c]:set t_vb=[c] together with this option. ____ diff --git a/vimperator/locale/en-US/print.txt b/vimperator/locale/en-US/print.txt index 397f9dbb..458718a9 100644 --- a/vimperator/locale/en-US/print.txt +++ b/vimperator/locale/en-US/print.txt @@ -14,6 +14,8 @@ ________________________________________________________________________________ ||:ha[rdcopy][!] >{filename}|| + ________________________________________________________________________________ As above, but write the output to {filename}. + +Note: Not available on Windows. ________________________________________________________________________________ section:Firefox{nbsp}printing{nbsp}dialogs[firefox-print-dialogs] diff --git a/vimperator/locale/en-US/tutorial.txt b/vimperator/locale/en-US/tutorial.txt index 2a3db0ef..3ab9e5c9 100644 --- a/vimperator/locale/en-US/tutorial.txt +++ b/vimperator/locale/en-US/tutorial.txt @@ -62,8 +62,8 @@ and you can find out about the [m]gt[m] and [m]gT[m] mapping with :help gt :help gT -Finally, in addition to the help system itself, [c]:exusage[c] and -[c]:viusage[c] are useful quick-reference commands. +Finally, in addition to the help system itself, [c]:exusage[c], [c]:viusage[c] +and [c]:optionusage[c] are useful quick-reference commands. section:Mouseless[living-mouseless]