sleipnirのショートカット検索をfirefoxで実現するための UserChrome.js

検索バーで「w ほげ」と打つとWikiPediaで「ほげ」を検索する機能を追加する。

firefoxにはアドレスバーで同じようなことができるスマートキーワードという機能があるが、やはり使い慣れた検索バーでできた方が嬉しいし、検索プラグインとスマートキーワード用のサイトが別管理なのも面倒くさい。

準備として、各サーチエンジンの定義ファイル (profile/searchplugins/*.xml) 内の
または でキーワードを定義しておく。


w


(function MySearchBar() {
  
  /* 1. SearchBar をクリックすると全選択。
        (キーボードショートカットなら全選択になるが、クリックだとならないので。)
     2. sleipnir のショートカット検索を実装。
        - アドレスバーでなく検索バーで keyword + 検索語
   */
  var RETURN_TO_ORIG_ENGINE = true; // 検索後にデフォルトのエンジンに戻るか?

  
  var bar = document.getElementById("searchbar");
  var textbox = bar._textbox;
  
  var quick_search = function(){
    var qs_engines = bar._engines;
    var alias = null;
    var qs_num = -1;
    for(var i=0; i < qs_engines.length; i++){
      alias = qs_engines[i].alias;
      if(alias != null && textbox.value.indexOf(alias + " ") == 0){
        qs_num = i;
        break;
      }
    }
    dump("QS: " + qs_num + "\n");
    if(qs_num > -1){
      bar._origEngine = bar.currentEngine;
      bar.currentEngine = qs_engines[qs_num];
      textbox.value = textbox.value.substr(alias.length+1);
      setTimeout(function(){bar.focus();}, 0);
    }
  };

  if(RETURN_TO_ORIG_ENGINE){
    eval("bar.handleSearchCommand = " + bar.handleSearchCommand.toString().
       replace('return;', 'if(this._origEngine){this.currentEngine = this._origEngine; this._origEngine = null;} return;'));
    dump(bar.handleSearchCommand.toString());
    dump("\n---\n");
  }
  
  bar.addEventListener('focus', function(){textbox.select();}, true);
  bar.addEventListener('input', function(){quick_search();}, true);
})();

[2007.3.21]

  • 普通の検索の時に例外が発生していたのを修正。

[2007.5.17]

  • 検索語が入力済みの状態でも先頭にキーワードを入れるとエンジンが切り替わるようにした。
  • フォーカスが外れる問題の回避策を当てずっぽうで仕込んでみた。