Skip to content

Code snippets for custom keyboard shortcuts

sumyungguy edited this page Oct 30, 2017 · 21 revisions

Firefox already has a very large number of keyboard shortcuts, and other addons also provide their own keyboard shortcuts, I cannot find out safe combinations for my features. So I gave up and decided to provide only APIs for other addons. Please use other addons (for example: Dorando keyconfig) to customize keyboard shortcuts which can define custom actions based on scripts. Sorry.

See also:

Firefox built-in shortcuts

Switch between tabs

Ctrl-PageUp and Ctrl-PageDown are available to switch to previous/next tab by default.

Focus tab bar, Home/End, move tabs, etc.

Firefox also has additional keyboard shortcuts to move focus between tabs, and to move tabs, but they are deactivated by default. They can be re-activated, but better results might be obtained using the scripts below. In that case, the following CSS is not required.

If you want to use Firefox's additional keyboard shortcuts anyway, you can activate them in userChrome.css like:

.tabbrowser-tab {
  -moz-user-focus: normal !important;
}

That way, clicking on a tab gives focus to the tab bar. Then shortcuts like up/down arrow and home/end will apply to the tab bar instead of the page's contents. Ctrl-Up/Left and Ctrl-Down/Right can be used to move tabs, but the "Move tabs" scripts below give better control.

Note that on macOS / OS X, this does not currently (Firefox 47) work as expected.

Scripts for shortcuts using customization addons

Using Dorando keyconfig for example, open its preferences, click "Add a new key", give it a name, and paste one of the scripts in the /* CODE */ section. Then select the key combination for the shortcut. You may also use FireGestures or other customization addons.

Toggle show/hide the tab bar

if (gBrowser.treeStyleTab.tabbarShown) {
  gBrowser.treeStyleTab.hideTabbar();
} else {
  gBrowser.treeStyleTab.showTabbar();
}

Close the current and all descendant tabs

gBrowser.treeStyleTab.removeTabSubtree(gBrowser.selectedTab);

Reload ancestor tabs

TreeStyleTabService.getAncestorTabs(gBrowser.selectedTab).forEach(function(aTab) {
  gBrowser.reloadTab(aTab);
});

Jump to the previous tree

var root = TreeStyleTabService.getRootTab(gBrowser.selectedTab);
var prev = TreeStyleTabService.getPreviousSiblingTab(root);
if (prev)
  gBrowser.selectedTab = prev;

Jump to the next tree

var root = TreeStyleTabService.getRootTab(gBrowser.selectedTab);
var next = TreeStyleTabService.getNextSiblingTab(root);
if (next)
  gBrowser.selectedTab = next;

Open New Tab

...as Child Tab

TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab);
openUILinkIn(BROWSER_NEW_TAB_URL, "tab");

...as Sibling Tab

var parent = TreeStyleTabService.getParentTab(gBrowser.selectedTab);
if (parent)
	TreeStyleTabService.readyToOpenChildTab(parent);
openUILinkIn(BROWSER_NEW_TAB_URL, "tab");

...as Independent Tab

openUILinkIn(BROWSER_NEW_TAB_URL, "tab");

Move tab

Right

gBrowser.treeStyleTab.demoteCurrentTab();

Left

gBrowser.treeStyleTab.promoteCurrentTab();

Down

var tab = gBrowser.selectedTab, b = gBrowser.treeStyleTab.getTabBrowserFromChild(tab).treeStyleTab, next = b.getNextVisibleTab(tab);
if (next) {
    var getTabLevel = (tab) => b.getAncestorTabs(tab).length;
    var nextLevel = getTabLevel(next), tabLevel = getTabLevel(tab);
    if (nextLevel >= tabLevel) {
        if (nextLevel > tabLevel)
            next = b.getNextSiblingTab(tab);
        if (next) {
            while (b.hasChildTabs(next))
                next = b.getLastChildTab(next);
            gBrowser.moveTabTo(tab, next._tPos);
        }
    }
}

Up

var tab = gBrowser.selectedTab, b = gBrowser.treeStyleTab.getTabBrowserFromChild(tab).treeStyleTab, prev = b.getPreviousVisibleTab(tab);
if (prev) {
	var getTabLevel = (tab) => b.getAncestorTabs(tab).length;
	var prevLevel = getTabLevel(prev), tabLevel = getTabLevel(tab);
	if (prevLevel >= tabLevel) {
		if (prevLevel > tabLevel)
			prev = b.getPreviousSiblingTab(tab);
		gBrowser.moveTabTo(tab, prev._tPos);
		var newLevel = getTabLevel(tab);
		while (newLevel-- > tabLevel)
			b.promoteTab(tab);
	}
}

Duplicate tab

First install "Multiple Tab Handler" to get "Duplicate" function in tab context (right click) menu.

...as Child Tab:

TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab);
gBrowser.duplicateTab(gBrowser.mCurrentTab);

...as Next Sibling Tab:

gBrowser.selectedTab = gBrowser.duplicateTab(gBrowser.mCurrentTab);
gBrowser.treeStyleTab.promoteCurrentTab();

...as Independent Tab:

gBrowser.selectedTab = gBrowser.duplicateTab(gBrowser.mCurrentTab);
setTimeout("gBrowser.moveTabTo(gBrowser.selectedTab);", 0);
Clone this wiki locally