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):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.: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 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.: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.:javascript! opens the JavaScript console of Firefox.<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() //{{{
":open ... with current location \"http://www.example.com/dir1/dir2/file.html\" will open \"http://www.example.com\":open ./foo.html with current location \"http://www.example.com/dir1/dir2/file.html\" will open \"http://www.example.com/dir1/dir2/foo.html\":open ... with current location \"http://www.example.com/dir1/dir2/file.html\" opens \"http://www.example.com\":open ./foo.html with current location \"http://www.example.com/dir1/dir2/file.html\" opens \"http://www.example.com/dir1/dir2/foo.html\":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>'defsearch' option) " +
- "if the first word is no search engine (:open linus torvalds will open a Google search for linux torvalds).:open www.osnews.com, www.slashdot.org will " +
- "open OSNews in the current, and Slashdot in a new background tab).:open linus torvalds opens a Google search for linux torvalds)." +
+ ":open www.osnews.com, www.slashdot.org " +
+ "opens OSNews in the current, and Slashdot in a new background tab).: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.: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.<Tab> are specified in the 'complete' option.!, 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.{pattern}.'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.'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}[?]{pattern}.'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.'linksearch' is on. " +
"\"\\L\" forces the entire page to be searched for a match.