diff options
author | teramako | 2008-11-30 14:29:29 +0000 |
---|---|---|
committer | teramako | 2008-11-30 14:29:29 +0000 |
commit | 6f96bb02f06cb49127cf0cc1f15d1197bdd6582a (patch) | |
tree | 2d98209893764727d1d8881e7ddc636c25d00fa5 | |
parent | c1175bb5642e03ca0e702d459d5d066f8b1b0d33 (diff) | |
download | vimperator-plugins-6f96bb02f06cb49127cf0cc1f15d1197bdd6582a.tar.bz2 |
new release
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@25469 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r-- | toggler.js | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/toggler.js b/toggler.js new file mode 100644 index 0000000..d874c85 --- /dev/null +++ b/toggler.js @@ -0,0 +1,142 @@ +/* + * ==VimperatorPlugin== + * @name toggler + * @version 0.1 + * @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){ + let index = this.index + 1; + if (index >= this.cmds.length) index = 0; + if (!notUpdate) this.index = index; + return this.cmds[index]; + }, + previous: function(notUpdate){ + let index = this.index - 1; + if (index < 0) index = this.cmds.length -1; + if (!notUpdate) this.index = index; + return this.cmds[this.index]; + }, + list: function(){ + var data = []; + for (var i = 0; i<this.cmds.length; i++){ + data.push([i==this.index ? "*":"", this.cmds[i]]); + } + liberator.echo(template.table(this.name, data), true); + } +}; +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){ + let toggler = this.get(name); + if (!toggler) return; + let cmd = isPrevious ? toggler.previous() : toggler.next(); + if (cmd instanceof Array){ + cmd.forEach(function(str){ + liberator.execute(str); + }); + } else if (typeof cmd == "function"){ + cmd(); + } else { + liberator.execute(cmd); + } + }, + list: function(name){ + if (name && (name in settings)){ + settings[name].list(); + return; + } + for (let i in settings){ + settings[i].list(); + } + } +}; + +commands.addUserCommand(['toggle'],'setting toggler', + function(args){ + if (args["-list"] || args.length == 0){ + if (args.length == 0) + liberator.plugins.toggler.list(); + else + args.forEach(function(name) liberator.plugins.toggler.list(name)); + 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){ + let filter = context.filter.split(/\s+/).pop(); + let reg = new RegExp(filter ? "^" + flter : ".*", "i"); + context.title= ["Name", args.bang ? "Previous" : "Next"]; + let list = []; + for (let i in settings){ + let toggler = settings[i]; + if (reg.test(i) && !args.some(function(arg) arg==i)) + list.push([i, args.bang ? toggler.previous(true) : toggler.next(true)]); + } + context.completions = list; + } + }, + true); + +if (liberator.globalVariables.toggler){ + liberator.globalVariables.toggler.forEach(function(toggler){ + manager.add(toggler[0], toggler[1]); + }); +} +return manager; +})(); + |