diff --git a/content/commands.js b/content/commands.js index 10bcdb59..caa4b8d7 100644 --- a/content/commands.js +++ b/content/commands.js @@ -258,14 +258,13 @@ function Commands() //{{{ // TODO: add parsing of a " comment here: if (in_double_string || in_single_string) - return [-1, "unterminated string literal"]; + return [-1, "E114: Missing quote"]; if (in_escape_key) return [-1, "trailing \\"]; else return [str.length, arg]; } - var args = []; // parsed arguments var opts = []; // parsed options if (!options) @@ -305,7 +304,10 @@ function Commands() //{{{ { [count, arg] = getNextArg(sub.substr(optname.length + 1)); if (count == -1) - return { error: "Invalid argument for option " + optname, opts: [], args: [] } + { + vimperator.echoerr("Invalid argument for option " + optname); + return null; + } count++; // to compensate the "=" character } @@ -313,7 +315,10 @@ function Commands() //{{{ { [count, arg] = getNextArg(sub.substr(optname.length + 1)); if (count == -1) - return { error: "Invalid argument for option " + optname, opts: [], args: [] } + { + vimperator.echoerr("Invalid argument for option " + optname); + return null; + } // if we add the argument to an option after a space, it MUST not be empty if (arg.length == 0) @@ -333,7 +338,10 @@ function Commands() //{{{ { case OPTION_NOARG: if (arg != null) - return { error: "No argument allowed for option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("No argument allowed for option: " + optname); + return null; + } break; case OPTION_BOOL: if (arg == "true" || arg == "1" || arg == "on") @@ -341,25 +349,40 @@ function Commands() //{{{ else if (arg == "false" || arg == "0" || arg == "off") arg = false; else - return { error: "Invalid argument for boolean option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Invalid argument for boolean option: " + optname); + return null; + } break; case OPTION_STRING: if (arg == null) - return { error: "Argument required for string option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Argument required for string option: " + optname); + return null; + } break; case OPTION_INT: arg = parseInt(arg); if (isNaN(arg)) - return { error: "Numeric argument required for integer option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Numeric argument required for integer option: " + optname); + return null; + } break; case OPTION_FLOAT: arg = parseFloat(arg); if (isNaN(arg)) - return { error: "Numeric argument required for float option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Numeric argument required for float option: " + optname); + return null; + } break; case OPTION_LIST: if (arg == null) - return { error: "Argument required for list option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Argument required for list option: " + optname); + return null; + } arg = arg.split(/\s*,\s*/); break; } @@ -368,7 +391,10 @@ function Commands() //{{{ if (typeof options[opt][2] == "function") { if (options[opt][2].call(this, arg) == false) - return { error: "Invalid argument for option: " + optname, opts: [], args: [] } + { + vimperator.echoerr("Invalid argument for option: " + optname); + return null; + } } opts.push([options[opt][0][0], arg]); // always use the first name of the option @@ -383,7 +409,10 @@ function Commands() //{{{ // if not an option, treat this token as an argument var [count, arg] = getNextArg(sub); if (count == -1) - return { error: "Error parsing arguments: " + arg, opts: [], args: [] } + { + vimperator.echoerr("Error parsing arguments: " + arg); + return null; + } if (arg != null) args.push(arg); @@ -391,7 +420,7 @@ function Commands() //{{{ i += count; // hopefully count is always >0, otherwise we get an endless loop } - return { error: null, opts: opts, args: args } + return { opts: opts, args: args } } function getOption(opts, option, def) @@ -562,11 +591,8 @@ function Commands() //{{{ function(args) { var res = parseArgs(args, this.args); - if (res.error) - { - vimperator.echoerr(res.error); - return false; - } + if (!res) + return; var url = res.args.length == 0 ? vimperator.buffer.URL : res.args[0]; var title = getOption(res.opts, "-title", res.args.length == 0 ? vimperator.buffer.title : null); @@ -583,7 +609,7 @@ function Commands() //{{{ { usage: ["bma[rk] [-title=title] [-keyword=kw] [-tags=tag1,tag2] [url]"], short_help: "Add a bookmark", - help: "If you don't add a custom title, either the title of the web page or the URL will be taken as the title.
" + + help: "If you don't add a custom title, either the title of the web page or the URL is taken as the title.
" + "You can omit the optional [url] argument, so just do :bmark to bookmark the currently loaded web page with a default title and without any tags.
" + "The following options are interpreted:
" + " -title=\"custom title\"
" + @@ -598,12 +624,9 @@ function Commands() //{{{ function(args, special) { var res = parseArgs(args, this.args); - if (res.error) - { - vimperator.echoerr(res.error); - return false; - } - + if (!res) + return; + var tags = getOption(res.opts, "-tags", []); vimperator.bookmarks.list(res.args.join(" "), tags, special); }, @@ -611,7 +634,7 @@ function Commands() //{{{ usage: ["bmarks [filter]", "bmarks!"], short_help: "Show bookmarks", help: "Open the message window at the bottom of the screen with all bookmarks which match [filter] either in the title or URL.
" + - "The special version :bmarks! will open the default Firefox bookmarks window.
" + + "The special version :bmarks! opens the default Firefox bookmarks window.
" + "Filter can also contain the following options:
" + "-tags=comma,separated,tag,list
", completer: function(filter) { return vimperator.bookmarks.get(filter); }, @@ -653,7 +676,6 @@ function Commands() //{{{ function(args, special) { var url = args; - if (!url) url = vimperator.buffer.URL; @@ -667,8 +689,7 @@ function Commands() //{{{ "If ommited, [url] defaults to the URL of the current buffer. " + "Use <Tab> key on a string to complete the URL which you want to delete.
" + "The following options WILL be interpreted in the future:
" + - " [!] a special version to delete ALL bookmarks
" + - " -T comma,separated,tag,list
", + " [!] a special version to delete ALL bookmarks
", completer: function(filter) { return vimperator.bookmarks.get(filter); } } )); @@ -676,12 +697,10 @@ function Commands() //{{{ function(args) { var res = parseArgs(args, this.args); - if (res.error) - vimperator.echoerr(res.error); - else - { - vimperator.echo(vimperator.util.colorize(res.args)); - } + if (!res) + return; + + vimperator.echo(vimperator.util.colorize(res.args)); }, { usage: ["com[mand][!] [{attr}...] {cmd} {rep}"], @@ -739,9 +758,9 @@ function Commands() //{{{ usage: ["delm[arks] {marks}", "delm[arks]!"], short_help: "Delete the specified marks", help: "Marks are presented as a list. Example:
" + - ":delmarks Aa b p will delete marks A, a, b and p
" + - ":delmarks b-p will delete all marks in the range b to p
" + - ":delmarks! will delete all marks for the current buffer" + ":delmarks Aa b p deletes marks A, a, b and p
" + + ":delmarks b-p deletes all marks in the range b to p
" + + ":delmarks! deletes all marks for the current buffer" } )); @@ -769,9 +788,9 @@ function Commands() //{{{ usage: ["delqm[arks] {marks}", "delqm[arks]!"], short_help: "Delete the specified QuickMarks", help: "QuickMarks are presented as a list. Example:
" + - ":delqmarks Aa b p will delete QuickMarks A, a, b and p
" + - ":delqmarks b-p will delete all QuickMarks in the range b to p
" + - ":delqmarks! will delete all QuickMarks" + ":delqmarks Aa b p deletes QuickMarks A, a, b and p
" + + ":delqmarks b-p deletes all QuickMarks in the range b to p
" + + ":delqmarks! deletes all QuickMarks" } )); addDefaultCommand(new Command(["downl[oads]", "dl"], @@ -841,11 +860,21 @@ function Commands() //{{{ } )); addDefaultCommand(new Command(["exe[cute]"], - function(args) { vimperator.execute(args) }, + function(args) + { + // TODO: :exec has some difficult semantics -> later + // var res = parseArgs(args, this.args); + // if (!res) + // return; + // + // vimperator.execute(res.args); + + vimperator.execute(args); + }, { usage: ["exe[cute] {expr1} [ ... ]"], short_help: "Execute the string that results from the evaluation of {expr1} as an Ex command.", - help: ":execute echo test would show a message with the text "test".
" + help: "Example: :execute echo test shows a message with the text "test".
" } )); addDefaultCommand(new Command(["exu[sage]"], @@ -916,7 +945,7 @@ function Commands() //{{{ "
  • :help 'complete' for options (surrounded by ' and ')
  • " + "
  • :help o for mappings (no pre- or postfix)
  • " + "" + - "You can however use partial stings in the tab completion, so :help he<Tab> will complete :help :help.", + "You can however use partial stings in the tab completion, so :help he<Tab> completes :help :help.", completer: function(filter) { return vimperator.completion.get_help_completions(filter); } } )); @@ -926,7 +955,7 @@ function Commands() //{{{ usage: ["hist[ory] [filter]", "history!"], short_help: "Show recently visited URLs", help: "Open the message window at the bottom of the screen with all history items which match [filter] either in the title or URL.
    " + - "The special version :history! will open the default Firefox history window.", + "The special version :history! opens the default Firefox history window.", completer: function(filter) { return vimperator.history.get(filter); } } )); @@ -970,9 +999,9 @@ function Commands() //{{{ usage: ["javas[cript] {cmd}", "javascript <<{endpattern}\\n{script}\\n{endpattern}", "javascript[!]"], // \\n is changed to
    in the help.js code short_help: "Run any JavaScript command through eval()", help: "Acts as a JavaScript interpreter by passing the argument to eval().
    " + - ":javascript alert('Hello world') would show a dialog box with the text \"Hello world\".
    " + - ":javascript <<EOF would read all the lines until a line starting with 'EOF' is found, and will eval() them.
    " + - "The special version :javascript! will open the JavaScript console of Firefox.
    " + + ":javascript alert('Hello world') shows a dialog box with the text \"Hello world\".
    " + + ":javascript <<EOF reads all the lines until a line starting with 'EOF' is found, and interpret them with the JavaScript eval() function.
    " + + "The special version :javascript! opens the JavaScript console of Firefox.
    " + "Rudimentary <Tab> completion is available for :javascript {cmd}<Tab> (but not yet for the " + ":js <<EOF multiline widget). Be aware that Vimperator needs to run {cmd} through eval() " + "to get the completions, which could have unwanted side effects.", @@ -1196,7 +1225,7 @@ function Commands() //{{{ { usage: ["norm[al][!] {commands}"], short_help: "Execute Normal mode commands", - help: ":normal 20j would scroll 20 lines down." + help: "Example: :normal 20j scrolls 20 lines down." } )); // TODO: remove duplication in :map @@ -1276,20 +1305,20 @@ function Commands() //{{{ "
      " + "
    1. Transformed to a relative URL of the current location if it starts with . or .. or ...;
      " + "... is special and moves up the directory hierarchy as far as possible." + - "
    2. " + + "" + "
    3. Opened with the specified search engine if the token looks like a search string " + "and the first word is the name of a search engine (:open wikipedia linus torvalds " + - "will open the wikipedia entry for linus torvalds). The short name of a search engine is automatically guessed from its name. " + + "opens the wikipedia entry for linus torvalds). The short name of a search engine is automatically guessed from its name. " + "If you want to set a custom name, open the $FIREFOX_PROFILE/searchplugins/*.xml file of the search engine, and add/change " + "<Alias>myalias</Alias>
    4. " + "
    5. Opened with the default search engine or keyword (specified with the 'defsearch' option) " + - "if the first word is no search engine (:open linus torvalds will open a Google search for linux torvalds).
    6. " + - "
    7. Passed directly to Firefox in all other cases (:open www.osnews.com, www.slashdot.org will " + - "open OSNews in the current, and Slashdot in a new background tab).
    8. " + + "if the first word is no search engine (:open linus torvalds opens a Google search for linux torvalds)." + + "
    9. Passed directly to Firefox in all other cases (:open www.osnews.com, www.slashdot.org " + + "opens OSNews in the current, and Slashdot in a new background tab).
    10. " + "
    " + - "You WILL be able to use :open [-T \"linux\"] torvalds<Tab> to complete bookmarks " + - "with tag \"linux\" and which contain \"torvalds\". Note that -T support is only available for tab completion, not for the actual command.
    " + + "You can use :open -tags linux torvalds<Tab> to complete bookmarks " + + "with tag \"linux\" and which contain \"torvalds\". Note that -tags support is only available for tab completion, not for the actual command.
    " + "The items which are completed on <Tab> are specified in the 'complete' option.
    " + "Without argument, reloads the current page.
    " + "Without argument but with !, reloads the current page skipping the cache.", @@ -1596,8 +1625,8 @@ function Commands() //{{{ ":set option! and :set invoption invert the value of a boolean option.
    " + ":set option? or :set option(for string and list options) shows the current value of an option.
    " + ":set option& resets an option to its default value.
    " + - ":set option+={value} and :set option-={value} will add/subtract {value} to a number option and append/remove {value} to a string option.
    " + - ":set all will show the current value of all options and :set all& will reset all options to their default values.
    ", + ":set option+={value} and :set option-={value} adds/subtracts {value} to a number option and append/remove {value} to a string option.
    " + + ":set all shows the current value of all options and :set all& resets all options to their default values.
    ", completer: function(filter) { return vimperator.completion.get_options_completions(filter); } } )); diff --git a/content/mappings.js b/content/mappings.js index 66547249..e24660b4 100644 --- a/content/mappings.js +++ b/content/mappings.js @@ -1065,7 +1065,7 @@ function Mappings() //{{{ short_help: "Search forward for a pattern", usage: ["/{pattern}[/]"], help: "Search forward for the first occurance of {pattern}.
    " + - "When \"\\c\" appears anywhere in the pattern the whole pattern is handled as though 'ignorecase' is on. " + + "If \"\\c\" appears anywhere in the pattern the whole pattern is handled as though 'ignorecase' is on. " + "\"\\C\" forces case-sensitive matching for the whole pattern.
    " + "If \"\\l\" appears in the pattern only the text of links is searched for a match as though 'linksearch' is on. " + "\"\\L\" forces the entire page to be searched for a match." @@ -1077,7 +1077,7 @@ function Mappings() //{{{ short_help: "Search backwards for a pattern", usage: ["?{pattern}[?]"], help: "Search backward for the first occurance of {pattern}.
    " + - "When \"\\c\" appears anywhere in the pattern the whole pattern is handled as though 'ignorecase' is on. " + + "If \"\\c\" appears anywhere in the pattern the whole pattern is handled as though 'ignorecase' is on. " + "\"\\C\" forces case-sensitive matching for the whole pattern.
    " + "If \"\\l\" appears in the pattern only the text of links is searched for a match as though 'linksearch' is on. " + "\"\\L\" forces the entire page to be searched for a match.
    " + diff --git a/content/util.js b/content/util.js index 0d8c7d6f..05f66838 100644 --- a/content/util.js +++ b/content/util.js @@ -29,7 +29,7 @@ the terms of any one of the MPL, the GPL or the LGPL. vimperator.util = { escapeHTML: function(str) { - // XXX: the following code is _much- slower then a simple .replace() + // XXX: the following code is _much_ slower than a simple .replace() // :history display went down from 2 to 1 second after changing // // var e = window.content.document.createElement("div");