Vimperator であの娘のサイトへスピーディにダイアル!

Vimperator Advent Calendar 2012 16日目参加記事です.

まずは QuickMarks,でも足りなくなったら・・・?

よく訪れるサイトへは QuickMarks(詳細は :help quickmarks)を常用してたけどそれだけでは足りない!そんな場合に,どのようにしてスムーズに各サイトへ行けば良いの?

解決法としてパッと思いついたものを以下に3つ挙げてみる.

  1. Vimperator の Bookmarks (詳細は :help bookmarks)を使う.
  2. Vimperator のプラグインを使う.
  3. Firefox のアドオンを探す.

まず 1. について,自分はまだ Bookmarks を使ってないのでよく分からない.

次に 2. については vimpr/vimperator-plugins をざっと眺めるとどうやら exopen.js というプラグインを使うと,予め .vimperatorrc で登録してあるサイトへ簡単に行けそうだ,ということが分かった.あとはキーバインドさえうまく設定してやれば今回の目的にちょうど合いそうだ.

だがしかし,今回は 2 + 3 の方法を取り上げたいと思う.すなわち Speed Dial アドオンを Vimperator から操作する ことで問題の解決としたい(と強引に記事タイトルの方向へ持っていくぅ)

できる男は電話が早い!

というわけで記事タイトルですでにネタバレ済みだけど今回は Firefox アドオンの Speed Dial を使う方法を提示してみたい.Speed Dial というのは Opera で有名なのでご存知の方も多いと思われるが,当該アドオンのページのスクショを見ていただければどんなものか直感でわかっていただけると思う. → 「Speed Dial | Firefox アドオン | Mozilla Japan の公式アドオン紹介サイト

また,数年前のものだけどアドオン公開初期の紹介記事があったのであわせてどうぞ. → 「窓の杜 - 【NEWS】「Opera」の“スピードダイアル”機能を再現するFirefox拡張「Speed Dial」

で,Vimperator からこのアドオンを操作するプラグイン speeddial.js (mattn 氏作)が vimpr にすでに公開されている.

使い方はコマンドラインから :sd のあとに半角スペースまで打つと,登録済みのダイアルが補完で現れるので,そこから選択することによってお好きなサイトへ行ける.

で,これでも十分便利なのだけど,このプラグイン公開当時から数年経ってる今,アドオン本体のほうも機能アップしているので,それを活かすためにオリジナル作者の mattn 氏のコードを改変したものを用意してみた.

気になるあの娘のサイトが沢山あるケースへの対応

どうやら昔の Speed Dial はダイアル数が9個固定で変更できなかったみたいだけど,現在のものは行数や列数を自由に変更可能.さらにグループ機能を搭載していて,これはつまり Firefox のタブグループ機能みたいなもんで,あるまとまったダイアル群ごとにグルーピングできる.前回の自分の Vimperator Advent Calendar 2012 の参加記事「パノラマワールドへのいざない」でもご紹介したように,グルーピング機能があると例えばカテゴリごとに分けられたりして便利.

なので,今 vimpr に上がっている speeddial.js でも動作はするけど,より高機能になった Speed Dial アドオンの性能を引き出すために mattn 氏のプラグインをちょこっと改造したものを置いておく.

mattn さんによる speeddial.js オリジナル (※本記事公開時の最新版)

拙作改変阪 speeddial.js (※本記事公開時の最新版)

なお,これは後日 vimpr の方に Pull Request する予定.

.vimperatorrc 設定例

では,自分の .vimperatorrc から speeddial.js 設定部分を抜粋してみる.

" speeddial.js
nnoremap <Leader>sd :<C-u>sd<CR>
nnoremap <Leader><Leader>sd :<C-u>sd!<CR>


js<<EOM
function addLocalMappings(buffer, maps) {
  maps.forEach(
    function (map) {
      let [cmd, action, extra] = map;
      let actionFunc = action;
      extra || (extra = {});

      if (typeof action == "string") {
        if (action.charAt(0) == ':')
          actionFunc = extra.open ? function () commandline.open("", action, modes.EX)
                                  : function () liberator.execute(action);
        else
          actionFunc = function () events.feedkeys(action, extra.noremap, true);
      }
      extra.matchingUrls = buffer;
      mappings.addUserMap(
        [modes.NORMAL],
        [cmd],
        "Local mapping for " + buffer,
        actionFunc,
        extra
      );
    }
  );
}

// require: x-hint.js
addLocalMappings(
  /^chrome:\/\/speeddial\/content\/speeddial\.xul$/,
  [
    ['f', ':xhintdo \'//*[starts-with(@id, "speedDialTab")] | //*[@class="speeddialThumb"]\' elem.click()', ],
  ]
);
EOM

これで,<Leader>sdカレントタブに Speed Dial を表示<Leader><Leader>sd新規タブに Speed Dial を表示する.

また,開いた Speed Dial 画面ではマウスに手を伸ばすことなく Vimperator らしくヒントを使ってダイアルを選択できるようにするために,vimpr にある x-hint.js っていうプラグインを使うことによってヒント機能を使えるようにしている.

なお,上記設定内の addLocalMappings 関数は .vimperatorrc 内ではよく使われる(?)関数のコピペなのですでに書いてある場合には今回は書く必要はない.

また設定例には書いてないけど :sd のあとに続けて半角スペースまで打つと,補完機能が働いて全ダイアルから選択することもできる.(が,登録数が多いとここから選ぶのは面倒)

おしまい

今回の speeddial.js を見つけたときもそうだったけど,たまにふと https://github.com/vimpr/vimperator-plugins を覗くと以前は気にならなかったプラグインを「発見」したりすることがあって面白いですよ.

さぁこれで気になるあの娘たち(人数制限無し)のサイトへスピーディにダイアルして,できる男になっちゃいましょう!

補足

一番最初に解決法として3つ挙げたけどよく考えたら,URL や タイトルの一部が分かってるならそれを元に絞り込める :tabopen も便利ですねっ!

Let's enjoy Vimperator!