aboutsummaryrefslogtreecommitdiffstats
path: root/toggler.js
blob: 0f06ca9e0cdd6640ec160be3b47ad3abdde3f05c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
1
// Vimperator plugin: gmail-biff
// Maintainer: mattn <mattn.jp@gmail.com> - http://mattn.kaoriya.net
(function(){
    const ICON1 = 'data:image/png;base64,'+
        'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAIAAADAAbR1AAAACXBIWXMAAABIAAAASABGyWs+AAAA'+
        'CXZwQWcAAAAQAAAAEABcxq3DAAAEXklEQVQ4y7WUXUxTdxyG33/bU6gIY5VSa8WkXSUu6hyDKMkM'+
        'S1TAuSUQl10sMtAsGnQKs64Vq5KAGWNxas1E/GJ1YHQJjMT4FdEZIqgJBkRnZA7mV0uFCuLgcNpz'+
        '2vP/7UKz7GLJrnwu3svn5k0eRkREhNeGDiFswzYMUiVVIpmtYqtgww7sANCABgAxxP7XUoxiPMU5'+
        'nMNT8pAHZraVbYUVdajD+OKzj84+Cma7FrsWD3+8q3dXr/zjXcNdA5EUlsJEk/ZJO5EYESNEoiIq'+
        'RKIsykSTwqRAJMmSHCt/Yntie/bcO9M7M5jmvOO889TQpDapkhSZEpmikz99kPAgQWxt97f70Udl'/**
 * ==VimperatorPlugin==
 * @name toggler
 * @version 0.2
 * @author teramako <teramako at gmail.com>
 * ==/VimperatorPlugin==
 *
 * 何かしらの設定をクルクル変更したい人へ
 *
 * まず、最初に以下の例ように.vimperatorrcに定義する
js <<EOM
liberator.globalVariables.toggler = {
  name: [ setting commands ]],
  go: ["set go=","set go=m","set go=b"],
  sb: ["sbclose","sbar Console"],
  go_and_sb: [
    ["set go=","sbclose"],
    ["set go=mTb","sbar Console"]
  ],
  //...
};
EOM
 *
 * 次に
 * :toggle go
 * とコマンドを実行するとsetting commands配列の次を実行する
 * 最後までいくと最初に戻る
 * つまり、最初に :toggle go をすると set go=m が実行される
 * もう一度実行すると、set go=b が実行される
 * もう一度すると、最初に戻って、set go= が実行される
 *
 * :map <F2> :toggle go<CR>
 * などとやっておくとボタン一つでクルクル替わる
 */
liberator.plugins.toggler = (function(){

var settings = {};
function Toggler(name, cmds){
	if (!cmds || cmds.length < 2) throw new Error("arguments are not enough");
	this.name = name;
	this.cmds = cmds;
	this.index = 0;
}
Toggler.prototype = {
	next: function(notUpdate){
		var index = this.index + 1;
		if (index >= this.cmds.length) index = 0;
		if (!notUpdate) this.index = index;
		return this.cmds[index];
	},
	previous: function(notUpdate){
		var index = this.index - 1;
		if (index < 0) index = this.cmds.length -1;
		if (!notUpdate) this.index = index;
		return this.cmds[this.index];
	},
	list: function() template.table(this.name, this.cmds.map(function(cmd, i) [i==this.index ? "*" : "", cmd], this))
};
var manager = {
	add: function(name, cmds){
		if (name in settings){
			liberator.echoerr(name + " is already exists");
			return;
		}
		settings[name] = new Toggler(name, cmds);
	},
	get: function(name){
		if (name in settings){
			return settings[name];
		}
		liberator.echoerr(name + " is not exists");
		return false;
	},
	toggle: function(name, isPrevious){
		var toggler = this.get(name);
		if (!toggler) return;
		var cmd = isPrevious ? toggler.previous() : toggler.next();
		if (cmd instanceof Array){
			cmd.forEach(liberator.execute);
		} else if (typeof cmd == "function"){
			cmd();
		} else {
			liberator.execute(cmd);
		}
	},
	reload: function(){
		if (liberator.globalVariables.toggler){
			settings = {};
			for (let [name, toggler] in Iterator(liberator.globalVariables.toggler))
				this.add(name, toggler);
		}
	},
	list: function(name){
		var xml = <></>;
		if (name && (name in settings)){
			xml += settings[name].list();
		} else {
			for each (let setting in settings){
				xml += setting.list();
			}
		}
		liberator.echo(xml, true);
	}
};

commands.addUserCommand(["toggle"],"setting toggler",
	function(args){
		if (args["-list"] || args.length == 0){
			if (args.length == 0)
				liberator.plugins.toggler.list();
			else
				args.forEach(liberator.plugins.toggler.list);
			return;
		}
		args.forEach(function(name){
			liberator.plugins.toggler.toggle(name, args.bang);
		});
	},{
		argCount: "*",
		bang: true,
		options: [
			[["-list","-l"], commands.OPTION_NOARG]
		],
		completer: function(context,args){
			var filter = args.length > 0 ? args[args.length-1] : "";
			var reg = new RegExp(filter ? "^" + filter : "");
			context.title= ["Name", args.bang ? "Previous" : "Next"];
			var list = [];
			for (let i in settings){
				let toggler = settings[i];
				if (reg.test(i.toLowerCase()) && !args.some(function(arg) arg==i))
					list.push([i, args.bang ? toggler.previous(true) : toggler.next(true)]);
			}
			context.completions = list;
		}
	},
	true);

manager.reload();
return manager;
})();