mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-23 09:17:59 +01:00
Add Optionui.jsop to apply +/-/^ from JS
This commit is contained in:
@@ -183,6 +183,104 @@ Option.prototype = {
|
|||||||
this.value = this.defaultValue;
|
this.value = this.defaultValue;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
op: function (operator, values, scope, invert)
|
||||||
|
{
|
||||||
|
let newValue = null;
|
||||||
|
|
||||||
|
switch (this.type)
|
||||||
|
{
|
||||||
|
case "boolean":
|
||||||
|
if (operator != "=")
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (invert)
|
||||||
|
newValue = !this.value;
|
||||||
|
else
|
||||||
|
newValue = values;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "number":
|
||||||
|
let value = parseInt(values); // deduce radix
|
||||||
|
|
||||||
|
if (isNaN(value))
|
||||||
|
return "E521: Number required";
|
||||||
|
|
||||||
|
switch (operator)
|
||||||
|
{
|
||||||
|
case "+":
|
||||||
|
newValue = currentValue + value;
|
||||||
|
break;
|
||||||
|
case "-":
|
||||||
|
newValue = currentValue - value;
|
||||||
|
break;
|
||||||
|
case "^":
|
||||||
|
newValue = currentValue * value;
|
||||||
|
break;
|
||||||
|
case "=":
|
||||||
|
newValue = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "charlist":
|
||||||
|
case "stringlist":
|
||||||
|
values = Array.concat(values);
|
||||||
|
switch (operator)
|
||||||
|
{
|
||||||
|
case "+":
|
||||||
|
newValue = util.Array.uniq(Array.concat(this.values, values), true);
|
||||||
|
break;
|
||||||
|
case "^":
|
||||||
|
// NOTE: Vim doesn't prepend if there's a match in the current value
|
||||||
|
newValue = util.Array.uniq(Array.concat(values, this.values), true);
|
||||||
|
break;
|
||||||
|
case "-":
|
||||||
|
newValue = this.values.filter(function (item) values.indexOf(item) == -1);
|
||||||
|
break;
|
||||||
|
case "=":
|
||||||
|
newValue = values;
|
||||||
|
if (invert)
|
||||||
|
{
|
||||||
|
let keepValues = this.values.filter(function (item) values.indexOf(item) == -1);
|
||||||
|
let addValues = values.filter(function (item) this.values.indexOf(item) == -1);
|
||||||
|
newValue = addValues.concat(keepValues);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "string":
|
||||||
|
switch (operator)
|
||||||
|
{
|
||||||
|
case "+":
|
||||||
|
newValue = currentValue + values;
|
||||||
|
break;
|
||||||
|
case "-":
|
||||||
|
newValue = currentValue.replace(values, "");
|
||||||
|
break;
|
||||||
|
case "^":
|
||||||
|
newValue = values + currentValue;
|
||||||
|
break;
|
||||||
|
case "=":
|
||||||
|
newValue = values;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "E685: Internal error: option type `" + option.type + "' not supported";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newValue == null)
|
||||||
|
return "Operator " + operator + " not supported for option type " + this.type;
|
||||||
|
newValue = this.joinValues(newValue);
|
||||||
|
if (!this.isValidValue(newValue))
|
||||||
|
return "E474: Invalid argument: " + values;
|
||||||
|
this.set(newValue, scope);
|
||||||
|
}
|
||||||
}; //}}}
|
}; //}}}
|
||||||
|
|
||||||
function Options() //{{{
|
function Options() //{{{
|
||||||
@@ -550,108 +648,18 @@ function Options() //{{{
|
|||||||
// improved. i.e. Vim's behavior is pretty sloppy to no real benefit
|
// improved. i.e. Vim's behavior is pretty sloppy to no real benefit
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
let currentValue = opt.optionValue;
|
if (opt.option.type == "boolean")
|
||||||
let newValue;
|
|
||||||
|
|
||||||
switch (option.type)
|
|
||||||
{
|
{
|
||||||
case "boolean":
|
if (opt.valueGiven)
|
||||||
if (opt.valueGiven)
|
{
|
||||||
{
|
liberator.echoerr("E474: Invalid argument: " + args);
|
||||||
liberator.echoerr("E474: Invalid argument: " + args);
|
return;
|
||||||
return;
|
}
|
||||||
}
|
opt.values = !opt.unsetBoolean;
|
||||||
|
|
||||||
if (opt.invert)
|
|
||||||
newValue = !currentValue;
|
|
||||||
else
|
|
||||||
newValue = !opt.unsetBoolean;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "number":
|
|
||||||
let value = parseInt(opt.value); // deduce radix
|
|
||||||
|
|
||||||
if (isNaN(value))
|
|
||||||
{
|
|
||||||
liberator.echoerr("E521: Number required after =: " + args);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (opt.operator)
|
|
||||||
{
|
|
||||||
case "+":
|
|
||||||
newValue = currentValue + value;
|
|
||||||
break;
|
|
||||||
case "-":
|
|
||||||
newValue = currentValue - value;
|
|
||||||
break;
|
|
||||||
case "^":
|
|
||||||
newValue = currentValue * value;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
newValue = value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "charlist":
|
|
||||||
case "stringlist":
|
|
||||||
switch (opt.operator)
|
|
||||||
{
|
|
||||||
case "+":
|
|
||||||
newValue = util.Array.uniq(Array.concat(opt.optionValues, opt.values), true);
|
|
||||||
break;
|
|
||||||
case "^":
|
|
||||||
// NOTE: Vim doesn't prepend if there's a match in the current value
|
|
||||||
newValue = util.Array.uniq(Array.concat(opt.values, opt.optionValues), true);
|
|
||||||
break;
|
|
||||||
case "-":
|
|
||||||
newValue = opt.optionValues.filter(function (item) opt.values.indexOf(item) == -1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
newValue = opt.values;
|
|
||||||
if (opt.invert)
|
|
||||||
{
|
|
||||||
let keepValues = opt.optionValues.filter(function (item) opt.values.indexOf(item) == -1);
|
|
||||||
let addValues = opt.values .filter(function (item) opt.optionValues.indexOf(item) == -1);
|
|
||||||
newValue = addValues.concat(keepValues);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "string":
|
|
||||||
switch (opt.operator)
|
|
||||||
{
|
|
||||||
case "+":
|
|
||||||
newValue = currentValue + opt.value;
|
|
||||||
break;
|
|
||||||
case "-":
|
|
||||||
newValue = currentValue.replace(opt.value, "");
|
|
||||||
break;
|
|
||||||
case "^":
|
|
||||||
newValue = opt.value + currentValue;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
newValue = opt.value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
liberator.echoerr("E685: Internal error: option type `" + option.type + "' not supported");
|
|
||||||
}
|
}
|
||||||
|
let res = opt.option.op(opt.operator || "=", opt.values, opt.scope, opt.invert);
|
||||||
newValue = option.joinValues(newValue);
|
if (res)
|
||||||
if (option.isValidValue(newValue))
|
liberator.echoerr(res);
|
||||||
option.set(newValue, opt.scope);
|
|
||||||
else
|
|
||||||
// FIXME: need to be able to specify more specific errors
|
|
||||||
liberator.echoerr("E474: Invalid argument: " + args);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user