aboutsummaryrefslogtreecommitdiffstats
path: root/migemo_completion.js
blob: 255725f989a906c6527e68e14ac2511a45303149 (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
/**
 * ==VimperatorPlugin==
 * @name           migemo_completion.js
 * @description    replace completion function with using Migemo
 * @description-ja �⊮�֐���Migemo���g�p�������̂Ɏ����ւ���
 * @author         Trapezoid
 * @version        0.2
 * ==/VimperatorPlugin==
 *
 * Support commands:
 *  - :buffer
 *  - :sidebar
 *  - :emenu
 *  - :dialog
 *  - :help
 *  - :macros
 *  - :play
 *  and more
 **/

(function () {
  var XMigemoCore;
  try{
      XMigemoCore = Components.classes['@piro.sakura.ne.jp/xmigemo/factory;1']
                              .getService(Components.interfaces.pIXMigemoFactory)
                              .getService("ja");
  }
  catch(ex if ex instanceof TypeError){}

  function replaceFunction(target,symbol,f,originalArguments){
      var oldFunction = target[symbol];
      target[symbol] = function() f.apply(target,[oldFunction.apply(target,originalArguments || arguments), arguments]);
  }

  replaceFunction(liberator.modules.completion,"buffer",function(oldResult,args){
      var filter = args[0];
      var migemoPattern = new RegExp(XMigemoCore.getRegExp(filter));
      return [0, oldResult[1].filter(function([value,label]){
          return migemoPattern.test(value) || migemoPattern.test(label)
          })];
  },[""]);
  liberator.modules.completion.filter = function(array,filter,matchFromBeginning){
      if(!filter) return array;

      var migemoString = XMigemoCore.getRegExp(filter);
      if(matchFromBeginning)
          migemoString ="^(" + migemoString + ")";
      var migemoPattern = new RegExp(migemoString);

      return array.filter(function([value,label]){
              return migemoPattern.test(value) || migemoPattern.test(label)
          });
  }
})();