Vimperator から Tree Style Tab を操作


はじめに

ブラウジング環境としての Firefox + Vimperator + Tree Style Tab (ツリー型タブ) が最強なんだけど、
Vimperator からツリー型タブを操作できるようにしたらもっと快適だった。

vimperator から Tree Style Tab の API を呼ぶ

Tree Style Tab にはツリーを操作したり要素を取得するための JavaScript の API があり、これを Vimperator のマッピング等で呼び出すようにすればいろいろなことができる。
API についての説明は Tree Style Tab の公式ページ にある。

Vimperator から JavaScript の関数等を呼び出すには :javascript (または :js) コマンドを使えば良い。

例えば、現在のタブの複製を子タブに作成するようなマッピングは下記のように設定する。

.vimperatorrc
nnoremap <C-S-t> :<C-u>js TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false)<CR>:tabduplicate<CR>

TreeStyleTabService.readyToOpenChildTab というのが Tree Style Tab の API で、タブを作成するコマンド前にこいつを呼ぶと作成されたタブが現在のタブの子になる。

もっと複雑な場合

もっと複雑なことをしようとするとワンライナーで JavaScript を書くのが辛くなってくる。
そういう時は実現したいことをあらかじめ JavaScript の関数にしておいて、マッピングからその関数を呼ぶようにすれば良い。
複数行の JavaScript を Vimperator から呼ぶには :js <<EOFEOF の間の行に JavaScript を書けば良い。(EOF の部分は好きな文字列でよい)

例えば、すべてのルートのタブを折りたたむような機能は下記のように設定する。

.vimperatorrc
nnoremap zM :<C-u>js treeFoldCollapseAll()<CR>
js <<EOF
function treeFoldCollapse(tab) {
  gBrowser.treeStyleTab.collapseExpandSubtree(tab, true);
}

function treeFoldCollapseAll() {
  TreeStyleTabService.rootTabs.forEach(treeFoldCollapse);
}
EOF

※ 自分の vimperatorrc
https://github.com/cohama/dotfiles/blob/master/.vimperatorrc