MCPcopy Index your code
hub / github.com/tridactyl/tridactyl

github.com/tridactyl/tridactyl @1.24.6 sqlite

repository ↗ · DeepWiki ↗ · release 1.24.6 ↗
1,409 symbols 3,276 edges 144 files 124 documented · 9%
README

Tridactyl Logo Tridactyl

Replace Firefox's default control mechanism with one modelled on the one true editor, Vim.

Build Status Matrix Chat Join Gitter Chat Join Discord Chat Mozilla Addon Store

InstallationChangelogFirst LookFeaturesFAQContributing

Tridactyl GIF

Installation

[Click this link in Firefox to install our latest "beta" build][riskyclick]. If it doesn't install automatically, you may need to 1) rename the extension from .zip to .xpi and 2) open it with Firefox; a fool-proof method is to go to about:addons, click the extensions tab, click the cog in the top right, then click "Install Add-on From File...". If you want more options, read on.

Stable

Our "stable" builds are essentially just frozen versions of our beta builds. Our beta builds themselves are not much less stable; all our developers and about half of our users use the beta builds. Stable builds, however, do get new features documented in the changelog, whereas beta builds get new features before they are documented there.

Arch Linux

Run pacman -S firefox-tridactyl in a terminal and then restart Firefox twice.

All other operating systems (Microsoft Windows, Macintosh, Linux etc.)

Tridactyl stable can be installed from the [Mozilla add-ons website (the AMO)][amo].

Beta

[Click this in Firefox to install our "beta" builds][riskyclick]. These [betas][betas] used to be updated with each commit to master on this repo but are now built manually when bovine3dom remembers - see issue #3605. Your browser will automatically update from there once a day. If you want more frequent updates, you can change extensions.update.interval in about:config to whatever time you want, say, 15 minutes (900 seconds). There is also another beta build that comes without a new tab page. You can get it from [here][nonewtablink].

Extra features through Native Messaging

If you want to use advanced features such as edit-in-Vim, you'll also need to install the native messenger or executable, instructions for which can be found by typing :installnative and hitting enter once you are in Tridactyl. Arch users can install the AUR package firefox-tridactyl-native instead.

Containerized/sandboxed Firefox Installations

Snap and Flatpak: Native Messaging support here is fairly recent and may require:

  • Upgrading to a beta version of Firefox (>= 106.0b6)
  • Enabling webextension permissions: flatpak permission-set webextensions tridactyl snap.firefox yes
  • Rebooting your system (and likely nothing short of it)

See this call for testing thread and this PR for more details and troubleshooting tips.

Firejail will require explicit path whitelisting, but should be feasible based on https://github.com/netblue30/firejail/issues/2109.

For other containerized installs, see troubleshooting steps in https://github.com/tridactyl/tridactyl/issues/2406 and the links above. With packaging that does support Native Messaging, the trick is usually ensuring the containerized app has permission to run the executable and can find the manifest json file.

Migrating between beta and stable builds

Our beta and stable versions store their configurations in separate places. To migrate between the two, see the wiki.

Changelog

The changelog for the stable versions can be found here.

First look

Type :help or press <F1> for online help once you're in, or :tutor for a friendly introduction. You might also find the unofficial Tridactyl Memrise course (requires login) useful for memorising keybinds.

Remember that Tridactyl cannot run on any page on about:*, data:*, view-source:* and file:*. We're sorry about that and we're working with Firefox to improve this situation by removing restrictions on existing APIs and developing a new API.

If you're enjoying Tridactyl, or not, please leave a review on the AMO.

Highlighted features

Like Vim, Tridactyl is modal, with the default mode being "normal mode". In "normal mode", many functions are available using keybindings. In "command mode" (when the command line is shown), you can execute more complex commands, known as "ex-commands". All Tridactyl functionality can be accessed by ex-commands. You can bind any ex-command to a normal-mode shortcut. We also support a .tridactylrc file, of which there is an example in the root of this repository.

Default normal-mode bindings

This is a (non-exhaustive) list of the most common normal-mode bindings. Type :help to open the online help for more details.

  • : — activate the command line
  • Shift + Insert — enter "ignore mode". Press Shift + Insert again to return to "normal mode".
  • ZZ — close all tabs and windows, but only "save" them if your about:preferences are set to "show your tabs and windows from last time"
  • . — repeat the last command
  • <C-v> – send a single keystroke to the current website, bypassing bindings

You can try :help key to know more about key. If it is an existing binding, it will take you to the help section of the command that will be executed when pressing key. For example :help . will take you to the help section of the repeat command.

Navigating with the current page

  • j/k — scroll down/up
  • h/l — scroll left/right
  • ^/$ — scroll to left/right margin
  • gg/G — scroll to start/end of page
  • f/F/gF — enter "hint mode" to select a link to follow. F to open in a background tab (note: hint characters should be typed in lowercase). gF to repeatedly open links until you hit <Escape>.
  • gi — scroll to and focus the last-used input on the page
  • r/R — reload page or hard reload page
  • yy — copy the current page URL to the clipboard
  • [[/]] — navigate forward/backward though paginated pages, for example comics, multi-part articles, search result pages, etc.
  • ]c/[c — increment/decrement the current URL by 1
  • gu — go to the parent of the current URL
  • gU — go to the root domain of the current URL
  • gr — open Firefox reader mode (note: Tridactyl will not work in this mode)
  • zi/zo/zz — zoom in/out/reset zoom
  • <C-f>/<C-b> — jump to the next/previous part of the page
  • g? — Apply Caesar cipher to page (run g? again to switch back)
  • g! — Jumble words on page

Find mode

Find mode is still incomplete and uses the Firefox feature "Quick Find". This will be improved eventually.

  • / — open the Quick Find search box
  • / then <C-f> — open the Find in page search box
  • <C-g>/<C-G> — find the next/previous instance of the last find operation (note: these are the standard Firefox shortcuts)

Please note that Tridactyl overrides Firefox's <C-f> search, replacing it with a binding to go to the next part of the page. If you want to be able to use <C-f> to search for things, use <C-f> after opening the Quick Find box (/), or any input field such as the address bar or search bar (use default browser shortcuts to activate these). To allow usage of <C-f> at any time, use unbind <C-f> to unset the scrollpage binding.

Bookmarks and quickmarks

  • A — bookmark the current page
  • a — bookmark the current page, but allow the URL to be modified first
  • M<key> — bind a quickmark to the given key
  • go<key>/gn<key>/gw<key> — open a given quickmark in current tab/new tab/new window

If you want to use Firefox's default <C-b> binding to open the bookmarks sidebar, make sure to run unbind <C-b> because Tridactyl replaces this setting with one to go to the previous part of the page.

Marks

  • m a-zA-Z — set a local mark (lowercase letter), or a global mark (uppercase letter)
  • ` a-zA-Z — jump to a local mark (lowercase letter), or a global mark (uppercase letter)
  • `` — jump to the location before the last mark jump

Navigating to new pages:

  • o/O — open a URL (or default search) in this tab (O to pre-load current URL)
  • t/T — open a URL (or default search) in a new tab (T to pre-load current URL)
  • w/W — open a URL (or default search) in a new window (W to pre-load current URL)
  • p/P — open the clipboard contents in the current/new tab
  • s/S — force a search using the default Tridactyl search engine, opening in the current/new tab. This is useful when searching for something that would otherwise be treated as a URL by o or t
  • H/L — go back/forward in the tab history
  • gh/gH — go to the pages you have set with set home [url1] [url2] ...

Handling tabs

  • d — close the current tab
  • u — undo the last tab/window closure
  • gt/gT — go to the next/previous tab
  • g^ OR g0/g$ — go to the first/last tab
  • ga — go to the tab currently playing audio
  • <C-^> — go to the last active tab
  • b — bring up a list of open tabs in the current window; you can type the tab ID or part of the title or URL to choose a tab

Extended hint mode

Extended hint modes allow you to perform actions on page items:

  • ;i/;I — open an image (in current/new tab)
  • ;s/;a — save/save-as the linked resource
  • ;S/;A — save/save-as the selected image
  • ;p — copy an element's text to the clipboard
  • ;P — copy an element's title/alt text to the clipboard
  • ;y — copy an element's link URL to the clipboard
  • ;# — copy an element's anchor URL to the clipboard
  • ;r — read the element's text with text-to-speech
  • ;k — delete an element from the page
  • ;; — focus an element

Additionally, you can hint elements matching a custom CSS selector with :hint -c [selector] which is useful for site-specific versions of the standard f hint mode.

Binding custom commands

You can bind your own shortcuts in normal mode with the :bind command. For example :bind J tabprev to bind J to switch to the previous tab. See :help bind for details about this command.

WebExtension-related issues

  • Navigation to any about:* pages using :open requires the native messenger.
  • Firefox will not load Tridactyl on about:*, some file:* URIs, view-source:*, or data:*. On these pages <C-,> - that's "Ctrl-Comma" - and the tri omnibox keyword are your escape hatches.
    • addons.mozilla.org is not supported.
  • Tridactyl now supports changing the Firefox GUI if you have the native messenger installed via guiset. There's quite a few options available, but guiset gui none is probably what you want, perhaps followed up with guiset tabs always. See :help guiset for a list of all possible options.

Frequently asked questions (FAQ)

  • Why doesn't Tridactyl work/why does it break the websites I'm trying to use? or 'Help! A website I use is totally blank when I try to use it with Tridactyl enabled!' or 'Why doesn't Tridactyl work on some pages?'

    Please visit our troubleshooting guide.

  • How can I change the default search engine?

    :set searchengine [searchurl name], e.g. :set searchengine google

    For instance, to use the European Space Agency as the default search engine (which may not necessarily be a good idea):

    :set searchurls.esa http://www.esa.int/esasearch?q=

    :set searchengine esa

    Note that this does not apply to :open when run without arguments, as it simply opens the newtab page which can be set like this:

    :set newtab [newtab url], e.g. :set newtab https://www.google.com

  • How can I add a search engine?

    :set searchurls.esa http://www.esa.int/esasearch?q=

    You can also add %s to specify exactly where the search query should go, which is useful for more inventive uses, such as

    :set searchurls.phrasebook https://translate.google.co.uk/#en/%s/my%20hovercraft%20is%20full%20of%20eels

    after which :open phrasebook [fr|de|la|es|hi|it...] will work as expected.

  • Can I import/export settings, and does Tridactyl use an external configuratio

Extension points exported contracts — how you extend this code

Type (Interface)
(no doc) [24 implementers]
compiler/types/Type.ts
IAutoContain (Interface)
(no doc) [1 implementers]
src/lib/autocontainers.ts
Tab (Interface)
(no doc)
e2e_tests/e2e.test.ts
Number (Interface)
(no doc)
src/tridactyl.d.ts
CompletionOptionFuse (Interface)
(no doc)
src/completions.ts
MetricNameInfo (Interface)
(no doc)
src/perf.ts
Hintables (Interface)
(no doc)
src/content/hinting.ts
HintOptions (Interface)
(no doc) [1 implementers]
src/lib/hint_util.ts

Core symbols most depended-on inside this repo

get
called by 201
src/lib/requests.ts
push
called by 154
src/content/controller_content.ts
filter
called by 85
src/completions/Help.ts
debug
called by 68
src/lib/logging.ts
error
called by 48
src/lib/logging.ts
activeTab
called by 30
src/lib/webext.ts
splitOnPrefix
called by 27
src/completions/Bmark.ts
match
called by 24
src/lib/keyseq.ts

Shape

Function 886
Method 314
Class 179
Interface 27
Enum 3

Languages

TypeScript98%
Python2%

Modules by API surface

src/excmds.ts262 symbols
src/content/hinting.ts76 symbols
src/lib/native.ts39 symbols
src/lib/dom.ts34 symbols
src/perf.ts30 symbols
src/lib/webext.ts29 symbols
src/lib/config.ts29 symbols
src/lib/keyseq.ts27 symbols
src/lib/tab_groups.ts23 symbols
src/content/finding.ts20 symbols
src/lib/profiles.ts19 symbols
src/completions/Bmark.ts19 symbols

Dependencies from manifests, versioned

@types/css0.0.38 · 1×
@types/firefox-webext-browser120.0.4 · 1×
@types/jest27.5.0 · 1×
@types/nearley2.11.5 · 1×
@types/selenium-webdriver4.1.10 · 1×
@typescript-eslint/eslint-plugin4.33.0 · 1×
@typescript-eslint/eslint-plugin-tslint6.21.0 · 1×
cleanslategit+https://github.c · 1×
command-line-args6.0.1 · 1×
compute-scroll-into-view3.0.0 · 1×

For agents

$ claude mcp add tridactyl \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact