読者です 読者をやめる 読者になる 読者になる

ツリー型タブをKeySnailから操作する

JavaScript Firefox KeySnail

ツリー型タブでツリー表示されたタブを,KeySnailから操作するためのスクリプトを(半年ほど?前に)書きました。「暇な時にタブ移動のコマンドとか追加してKeySnailプラグインにしよう!」と思い立ってからかなり時間がたってしまいましたが,未だにプラグイン化は達成できていないので,とりあえず現状を公開してみます。
(2010/09/09) プラグイン化しました! → d:id:gifnksm:20100909:1284012463
以下のソースコードを.keysnail.jsのPRESERVEエリアに貼り付ければOKです。

ext.add('read-this-tab-later', function(ev, arg) {
  var n = gBrowser.mCurrentTab._tPos;
  gBrowser.moveTabTo(gBrowser.mCurrentTab, gBrowser.mTabContainer.childNodes.length - 1);
  gBrowser.selectedTab = gBrowser.mTabs[n];
}, 'このタブを後回しにする');

ext.add('tst-read-this-tab-later', function(ev, arg) {
  var current = gBrowser.mCurrentTab,
      n = current._tPos,
      p = TreeStyleTabService.getParentTab(current);
  if (p === null) {
    ext.exec('read-this-tab-later', arg);
    return;
  }
  var lc = TreeStyleTabService.getLastChildTab(p);
  gBrowser.moveTabTo(current, lc._tPos);
  gBrowser.selectedTab = gBrowser.mTabs[n];
}, 'このタブを後回しにする');

ext.add('select-first-tab', function(ev, arg) {
  gBrowser.mTabContainer.selectedIndex = 0;
}, '最初のタブを選択する');
ext.add('select-last-tab', function(ev, arg) {
  gBrowser.mTabContainer.selectedIndex = gBrowser.mTabs.length - 1;
}, '最後のタブを選択する');

ext.add('tst-select-first-sibling-tab', function(ev, arg) {
  var c = gBrowser.selectedTab,
      p = TreeStyleTabService.getParentTab(c);
  if (p === null) {
    ext.exec('select-first-tab', arg);
    return;
  }
  gBrowser.selectedTab = TreeStyleTabService.getFirstChildTab(p);
}, '最初の兄弟タブを選択する');
ext.add('tst-select-last-sibling-tab', function(ev, arg) {
  var c = gBrowser.selectedTab,
      p = TreeStyleTabService.getParentTab(c);
  if (p === null) {
    var roots = TreeStyleTabService.rootTabs;
    gBrowser.selectedTab = roots[roots.length - 1];
    return;
  }
  gBrowser.selectedTab = TreeStyleTabService.getLastChildTab(p);
}, '最後の兄弟タブを選択する');

ext.add('tst-select-next-sibling-tab', function(ev, arg) {
  var c = gBrowser.selectedTab,
      n = TreeStyleTabService.getNextSiblingTab(c);
  if (n === null) {
    ext.exec('tst-select-first-sibling-tab', arg);
    return;
  }
  gBrowser.selectedTab = n;
}, '次の兄弟タブを選択する');
ext.add('tst-select-previous-sibling-tab', function(ev, arg) {
  var c = gBrowser.selectedTab,
      n = TreeStyleTabService.getPreviousSiblingTab(c);
  if (n === null) {
    ext.exec('tst-select-last-sibling-tab', arg);
    return;
  }
  gBrowser.selectedTab = n;
}, '前の兄弟タブを選択する');
ext.add('tst-select-first-child-tab', function(ev, arg) {
  var c = TreeStyleTabService.getFirstChildTab(gBrowser.selectedTab);
  if (c !== null)
    gBrowser.selectedTab = c;
}, '最初の子タブを選択する');
ext.add('tst-select-last-child-tab', function(ev, arg) {
  var c = TreeStyleTabService.getLastChildTab(gBrowser.selectedTab);
  if (c !== null)
    gBrowser.selectedTab = c;
}, '最後の子タブを選択する');

ext.add('tst-toggle-collapse-expand-tree', function (ev, arg) {
    const tst = gBrowser.treeStyleTab,
          TSTS = TreeStyleTabService;
    var target = gBrowser.selectedTab;
    if (!TSTS.hasChildTabs(target)) {
      target = TSTS.getParentTab(target);
      if (target === null)
        return;
    }
    if (TSTS.isSubtreeCollapsed(target)) {
        tst.collapseExpandSubtree(target, false);
    } else {
        tst.collapseExpandSubtree(target, true);
    }
}, 'タブの折りたたみをトグル');

ext.add('tst-toggle-autohide-tabbar', function (ev, arg) {
    const ah = gBrowser.treeStyleTab.autoHide;
    if (ah.state == "shrunken")
      ah.show();
    else
      ah.hide();
}, 'タブバーを表示', true);

「タブを後回しにする」はSo long and thanks for all the fish.からパクってます。キーバインドは,以下のように指定しています。

key.setViewKey(['t', 't'], function (ev, arg) {
    ext.exec("tst-toggle-autohide-tabbar", arg, ev);
}, 'タブバーを表示', true);

key.setViewKey(['t', '^'], function (ev, arg) {
    ext.exec("tst-select-first-child-tab", arg, ev);
}, '最初の子タブを選択する', true);

key.setViewKey(['t', '$'], function (ev, arg) {
    ext.exec("tst-select-last-child-tab", arg, ev);
}, '最後の子タブを選択する', true);

key.setViewKey(['t', 'p'], function (ev, arg) {
    ext.exec("tst-read-this-tab-later", arg, ev);
}, 'このタブを後回しにする', true);

key.setViewKey(['t', 'SPC'], function (ev, arg) {
    ext.exec("tst-toggle-collapse-expand-tree", arg, ev);
}, 'タブの折りたたみをトグル', true);

key.setViewKey('^', function (ev, arg) {
    ext.exec("tst-select-first-sibling-tab", arg, ev);
}, '最初の兄弟タブを選択する', true);

key.setViewKey('$', function (ev, arg) {
    ext.exec("tst-select-last-sibling-tab", arg, ev);
}, '最後の兄弟タブを選択する', true);
key.setViewKey('L', function (ev, arg) {
    ext.exec("tst-select-next-sibling-tab", arg, ev);
}, '次の兄弟タブを選択する', true);

key.setViewKey('H', function (ev, arg) {
    ext.exec("tst-select-previous-sibling-tab", arg, ev);
}, '前の兄弟タブを選択する', true);