select 要素で completer
通販の入力をしてて select 要素が 煩わしかったので作ってみた。
XUL/Migemo が あれば migemo検索、 無ければ 通常の部分一致で絞れます。
一応、変更後 change eventを 発行していますので、
多段型の場合でも動作するはずです。
optgroup が ある場合は「グループラベル/オプションのText」と なります。
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/migemo→XUL/Migemo
2010/05/15 02:10
ブクマ コメみると 「plugin」がリンクされていることに気づきにくいようなので修正