select 要素で completer

通販の入力をしてて select 要素が 煩わしかったので作ってみた。

こんな感じ


XUL/Migemo が あれば migemo検索、 無ければ 通常の部分一致で絞れます。


一応、変更後 change eventを 発行していますので、
多段型の場合でも動作するはずです。


optgroup が ある場合は「グループラベル/オプションのText」と なります。


で すぐに completerが 開くようにしていますが、
autoShowComplete = 0 で off にできます。


また、入力状態無しで 一覧を見たかったので、先頭にわざと[" ",""]を挿入しています。
「" "」なのは、completer で "" は 想定されていないようで、ちょっと表示がおかしくなるからです。
(補完しようとしているのに、文字が無いわけですから、当然といえば当然なんですけどね…)


商品は買えなかったけど達成感は手に入りました…


//optionSelector.js
(function(){
	const autoShowComplete = 1;
	//Register.add("s",function(){ selectInput();return "";});
	mappings.addUserMap([modes.INSERT],["<C-s>"],"select completer",function() selectInput());
	
  function has(a,b) (b in a)
	function is(a,b) a instanceof b
	function selectInput(elem){
		if(!elem) elem = liberator.focus;
		if(!is(elem,HTMLSelectElement)) return;
		commandline.input("select input:",function(arg){
			let selected = /^(\d+)/.exec(arg.trim())[1];
			if(!selected) return;

			elem.selectedIndex = selected;
			//let evt=events.create(elem.ownerDocument,"change");
			let evt = elem.ownerDocument.createEvent("HTMLEvents");
			evt.initEvent("change",true,true);
			elem.dispatchEvent(evt);
		},{
			completer:function(context){
        context.filter = context.filter.trim();
        if(has(window,"migemo")){
					let re = window.migemo.getRegExp(context.filter,"i");
					context.match = function(str) re.test(str); 
				}else{
          context.match = function(str) str.indexOf(this.filter)>=0;
        }
				context.completions = [[" ",""]].concat([ [<>{i}:{let(s=opt.parentNode.label) s? (s+"/"):""}{opt.text}</>,opt.value]
					for([i,opt] in Iterator(elem.options)) if(!opt.disabled && !opt.parentNode.disabled)
				]);
			},onCancel:function(){
				window.setTimeout(function() elem.focus(),0);
			}
		});
		autoShowComplete&&commandline._tabTimer.tell({shitKey:false});
	}
})();

余談
liberator の便利関数に events.create というものがあります。
events.create(doc,"click")の ような形式で簡易的に eventが生成できます。
(第3引数を利用すれば詳細も指定できます)


しかし、今まで使う機会が無かったので 今回 嬉々として利用しようとしたのですが、
"change"に 対応してませんでした… orz


そして ここまで書いて、検索してみたのですが、すでに 同様のpluginありますね…orz
(こちら)
命名の仕方もほぼ同じですし…


2010/05/14 22:32
やっぱり optgroupは completerのfork使って グループ分けするかも…

2010/05/14 22:44
c/migemoXUL/Migemo

2010/05/15 02:10
ブクマ コメみると 「plugin」がリンクされていることに気づきにくいようなので修正