diff --git a/common/content/commands.js b/common/content/commands.js index f5fff23a..7c521729 100644 --- a/common/content/commands.js +++ b/common/content/commands.js @@ -417,7 +417,7 @@ function Commands() //{{{ argCount = "*"; var args = []; // parsed options - args.__iterator__ = util.Array.iterator2; + args.__iterator__ = function () util.Array.iterator2(this); args.string = str; // for access to the unparsed string args.literalArg = ""; diff --git a/common/content/options.js b/common/content/options.js index e376c16e..86eaa25a 100644 --- a/common/content/options.js +++ b/common/content/options.js @@ -351,18 +351,18 @@ function Options() //{{{ function loadPreference(name, forcedDefault, defaultBranch) { - var defaultValue = null; // XXX + let defaultValue = null; // XXX if (forcedDefault != null) // this argument sets defaults for non-user settable options (like extensions.history.comp_history) defaultValue = forcedDefault; - var branch = defaultBranch ? prefService.getDefaultBranch("") : prefService; - var type = prefService.getPrefType(name); + let branch = defaultBranch ? prefService.getDefaultBranch("") : prefService; + let type = prefService.getPrefType(name); try { switch (type) { case prefService.PREF_STRING: - var value = branch.getComplexValue(name, Components.interfaces.nsISupportsString).data; + let value = branch.getComplexValue(name, Components.interfaces.nsISupportsString).data; // try in case it's a localized string (will throw an exception if not) if (!prefService.prefIsLocked(name) && !prefService.prefHasUserValue(name) && /^chrome:\/\/.+\/locale\/.+\.properties/.test(value)) @@ -562,114 +562,114 @@ function Options() //{{{ function (args, modifiers) { let bang = args.bang; - args = args.string; - if (bang) + if (!args.length) + args[0] = "all"; + + for (let [,arg] in args) { - var onlyNonDefault = false; - if (!args) + if (bang) { - args = "all"; - onlyNonDefault = true; - } + var onlyNonDefault = false; - let [matches, name, postfix, valueGiven, operator, value] = - args.match(/^\s*?([a-zA-Z0-9\.\-_{}]+)([?&!])?\s*(([-+^]?)=(.*))?\s*$/); - let reset = (postfix == "&"); - let invertBoolean = (postfix == "!"); + let [matches, name, postfix, valueGiven, operator, value] = + arg.match(/^\s*?([a-zA-Z0-9\.\-_{}]+)([?&!])?\s*(([-+^]?)=(.*))?\s*$/); + let reset = (postfix == "&"); + let invertBoolean = (postfix == "!"); - if (name == "all" && reset) - liberator.echoerr("You can't reset all options, it could make " + config.hostApplication + " unusable."); - else if (name == "all") - options.listPrefs(onlyNonDefault, ""); - else if (reset) - options.resetPref(name); - else if (invertBoolean) - options.invertPref(name); - else if (valueGiven) - { - switch (value) + if (name == "all" && reset) + liberator.echoerr("You can't reset all options, it could make " + config.hostApplication + " unusable."); + else if (name == "all") + options.listPrefs(onlyNonDefault, ""); + else if (reset) + options.resetPref(name); + else if (invertBoolean) + options.invertPref(name); + else if (valueGiven) { - case undefined: - value = ""; - break; - case "true": - value = true; - break; - case "false": - value = false; - break; - default: - if (/^\d+$/.test(value)) - value = parseInt(value, 10); + switch (value) + { + case undefined: + value = ""; + break; + case "true": + value = true; + break; + case "false": + value = false; + break; + default: + if (/^\d+$/.test(value)) + value = parseInt(value, 10); + } + options.setPref(name, value); } - options.setPref(name, value); - } - else - { - options.listPrefs(onlyNonDefault, name); - } - return; - } - - let opt = options.parseOpt(args, modifiers); - if (!opt) - { - liberator.echoerr("Error parsing :set command: " + args); - return; - } - - let option = opt.option; - if (option == null && !opt.all) - { - liberator.echoerr("No such option: " + opt.name); - return; - } - - // reset a variable to its default value - if (opt.reset) - { - if (opt.all) - { - for (let option in options) - option.reset(); - } - else - { - option.reset(); - } - } - // read access - else if (opt.get) - { - if (opt.all) - { - options.list(opt.onlyNonDefault, opt.scope); - } - else - { - if (option.type == "boolean") - liberator.echo((opt.optionValue ? " " : "no") + option.name); else - liberator.echo(" " + option.name + "=" + opt.optionValue); - } - } - // write access - // NOTE: the behavior is generally Vim compatible but could be - // improved. i.e. Vim's behavior is pretty sloppy to no real benefit - else - { - if (opt.option.type == "boolean") - { - if (opt.valueGiven) { - liberator.echoerr("E474: Invalid argument: " + args); - return; + options.listPrefs(onlyNonDefault, name); } - opt.values = !opt.unsetBoolean; + return; + } + + let opt = options.parseOpt(arg, modifiers); + if (!opt) + { + liberator.echoerr("Error parsing :set command: " + arg); + return; + } + + let option = opt.option; + if (option == null && !opt.all) + { + liberator.echoerr("No such option: " + opt.name); + return; + } + + // reset a variable to its default value + if (opt.reset) + { + if (opt.all) + { + for (let option in options) + option.reset(); + } + else + { + option.reset(); + } + } + // read access + else if (opt.get) + { + if (opt.all) + { + options.list(opt.onlyNonDefault, opt.scope); + } + else + { + if (option.type == "boolean") + liberator.echo((opt.optionValue ? " " : "no") + option.name); + else + liberator.echo(" " + option.name + "=" + opt.optionValue); + } + } + // write access + // NOTE: the behavior is generally Vim compatible but could be + // improved. i.e. Vim's behavior is pretty sloppy to no real benefit + else + { + if (opt.option.type == "boolean") + { + if (opt.valueGiven) + { + liberator.echoerr("E474: Invalid argument: " + arg); + return; + } + opt.values = !opt.unsetBoolean; + } + let res = opt.option.op(opt.operator || "=", opt.values, opt.scope, opt.invert); + if (res) + liberator.echoerr(res); } - let res = opt.option.op(opt.operator || "=", opt.values, opt.scope, opt.invert); - if (res) - liberator.echoerr(res); } }, { @@ -684,7 +684,11 @@ function Options() //{{{ if (filter[filter.length - 1] == "=") { context.advance(filter.length); - context.completions = [options.getPref(filter.substr(0, filter.length - 1)), "Current Value"]; + filter = filter.substr(0, filter.length - 1); + context.completions = [ + [loadPreference(filter, null, false), "Current Value"], + [loadPreference(filter, null, true), "Default Value"] + ]; return; } @@ -728,7 +732,6 @@ function Options() //{{{ completion.optionValue(context, opt.name, opt.operator); }, - literal: 0, serial: function () [ { command: this.name, @@ -886,7 +889,7 @@ function Options() //{{{ let prefs = function () { for each (let pref in prefArray) { - var userValue = prefService.prefHasUserValue(pref); + let userValue = prefService.prefHasUserValue(pref); if (onlyNonDefault && !userValue || pref.indexOf(filter) == -1) continue; diff --git a/vimperator/NEWS b/vimperator/NEWS index b8ac12bc..24a37938 100644 --- a/vimperator/NEWS +++ b/vimperator/NEWS @@ -1,5 +1,7 @@ 2008-XX-XX: * version 2.0 (probably) + * IMPORTANT: :set now sets multiple options, as in Vim. Spaces in values + must be quoted or escaped. * IMPORTANT: Due to much improved autocompletion, changed default 'complete' option value to 'sfl', listing intelligent Firefox location bar results. Removed possibility to use 'h' in 'complete'. diff --git a/vimperator/locale/en-US/options.txt b/vimperator/locale/en-US/options.txt index 55aee76c..8c891e7c 100644 --- a/vimperator/locale/en-US/options.txt +++ b/vimperator/locale/en-US/options.txt @@ -26,36 +26,44 @@ Show all options. Show all options. ____ |E518| |E519| -||:se[t] {option}?|| +||:se[t] {option}*|| ____ Show value of {option}. ____ -||:se[t] {option}|| +||:se[t] {option} [...]|| ____ Toggle option: set, switch it on. + Number option: show value. + String option: show value. ____ -||:se[t] no((option))|| + +||:se[t] no((option)) [...]|| + ____ Toggle option: Reset, switch it off. ____ -||:se[t] {option}!|| + -||:se[t] inv((option))|| + +||:se[t] {option}! [...]|| + +||:se[t] inv((option)) [...]|| + ____ Toggle option: Invert value. ____ -||:se[t] inv((option))={value}|| + +||:se[t] inv((option))={value} [...]|| + +||:se[t] {option}!={value} [...]|| + ____ For list options, toggle the specified values. + +If the option is a list, the given values are toggled. Given + :set opt=foo,bar +Then, + :set opt!=foo,baz +results in + opt=bar,baz ____ |:set-default| -||:se[t] {option}&|| +||:se[t] {option}& [...]|| ____ Reset option to its default value. ____ @@ -66,7 +74,7 @@ Set all options to their default value. ____ |:set-args| |E487| |E521| -||:se[t] {option}={value}|| + +||:se[t] {option}={value} [...]|| + ____ Set string or number option to {value}. + For numeric options the value must be given in decimal. @@ -74,7 +82,7 @@ The old value can be inserted by typing [m][m]. ____ |:set+=| -||:se[t] {option}+={value}|| + +||:se[t] {option}+={value} [...]|| + ____ Add the {value} to a number option, or append the {value} to a string option. When the option is a @@ -86,7 +94,7 @@ present the option value doesn't change. ____ |:set^=| -||:se[t] {option}^={value}|| + +||:se[t] {option}^={value} [...]|| + ____ Multiply the {value} to a number option, or prepend the {value} to a string option. When the option is a @@ -95,7 +103,7 @@ value was empty. ____ |:set-=| -||:se[t] {option}-={value}|| + +||:se[t] {option}-={value} [...]|| + ____ Subtract the {value} from a number option, or remove