vimperator の command を userChrome.js で拡張する
/*
* [
* 0: [all names of this command],
* 1: usage,
* 2: short help
* 3: helptext
* 4: function (arguments in this order: args, special, count, modifiers)
* 5: completefunc
* ]
*/
setTimeout(function () {
// for reloading uc.js
if (g_commands._orig_g_commands) {
g_commands = g_commands._orig_g_commands.concat();
} else {
g_commands._orig_g_commands = g_commands.concat();
}
showStatusbarMessage("Loading Additional Commands...", STATUSFIELD_URL);
const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var proxySetting = [
function Disable () {
prefs.setIntPref("network.proxy.type", 0);
},
function LocalSocks () {
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.socks", "localhost");
prefs.setIntPref("network.proxy.socks_port", 10080);
},
function ArrogationCharlotte () {
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "charlotte");
prefs.setIntPref("network.proxy.http_port", 5432);
},
function ArrogationLocal () {
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "charlotte");
prefs.setIntPref("network.proxy.http_port", 5432);
},
function School () {
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "proxy");
prefs.setIntPref("network.proxy.http_port", 8081);
},
];
g_commands.push([
["proxy"],
["proxy {setting name}"],
"Change proxy settings.",
"",
function (args, special, count) {
var name = args;
for (var i = 0; i < proxySetting.length; i++) {
if (proxySetting[i].name.toLowerCase() == name.toLowerCase()) {
proxySetting[i]();
showStatusbarMessage("Loading Setting " + name, STATUSFIELD_URL);
break;
}
}
},
function (filter) {
g_completions = [];
g_substrings = []; // これやらないと変な補完される?
proxySetting.forEach(function ($_) {
if ($_.name.toLowerCase().indexOf(filter.toLowerCase()) == 0) {
g_completions.push([$_.name, ""]);
}
});
return g_completions;
}
]);
}, 500);vimperator は Chrome Window のグローバル変数を汚染しまくる。(g_commands とか g_ からはじまるやつはグローバル変数。g_substring を補完関数で初期化しないと変な補完がされる。なんてこった)
拡張が実行される順序がよくわからないので setTimeout してる。
help は g_commands から自動生成されているので、うえのがちゃんとロードされると、ヘルプページの最後に :proxy の説明がでてくるよ!