tridactyl/readme.md

368 lines
19 KiB
Markdown
Raw Normal View History

2017-11-11 23:55:54 +00:00
![Tridactyl logo](src/static/logo/Tridactyl_200px.png)
# Tridactyl [![Build Status](https://travis-ci.org/tridactyl/tridactyl.svg?branch=master)](https://travis-ci.org/tridactyl/tridactyl) [![Matrix Chat][matrix-badge]][matrix-link] [![Gitter Chat][gitter-badge]][gitter-link]
2017-09-24 23:36:23 +01:00
Replace Firefox's default control mechanism with one modelled on the one true editor, Vim.
2017-09-24 23:36:23 +01:00
2018-05-16 16:25:36 +01:00
![Gigantic GIF showing Tridactyl in action](doc/AMO_screenshots/trishowcase.gif)
2017-11-11 02:26:36 +00:00
## Installing
2018-08-19 22:30:54 +01:00
[Simply click this link in Firefox to install our latest "beta" build][riskyclick]. These [betas][betas] are updated with each commit to master on this repo. 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). Alternatively, you can get our "stable" builds straight from [Mozilla][amo]. The changelog for the stable versions can be found [here](https://github.com/cmcaine/tridactyl/blob/master/CHANGELOG.md). 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.
2017-11-11 02:26:36 +00:00
2018-05-04 21:40:27 +01:00
Type `:help` or press `<F1>` for online help once you're in :)
2018-05-17 22:43:55 +01:00
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.
We can now run on addons.mozilla.org and a few other websites if you run `fixamo` once you've installed the native messenger. `help fixamo` tells you exactly what it does.
2018-04-16 16:36:15 +01:00
If you're enjoying Tridactyl, or not, please leave a review on the [AMO](https://addons.mozilla.org/en-US/firefox/addon/tridactyl-vim/reviews/).
## 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
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` — enter "hint mode" to select a link to follow. `F` to open in a background tab (note: hint characters should be typed in lowercase)
* `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
#### Find mode
Find mode is still incomplete and uses the built-in Firefox search. This will be improved eventually.
* `/` — open the find search box
* `C-g`/`C-G` — find the next/previous instance of the last find operation (note: these are the standard Firefox shortcuts)
#### 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
#### 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
2018-05-25 16:24:24 +01:00
* `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^`/`g$` — go to the first/last 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
2018-05-28 15:13:23 +01:00
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 Ctrl-L (or F6), Ctrl-Tab and Ctrl-W are your escape hatches.
* addons.mozilla.org is now supported so long as you run `fixamo` first.
* 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`.
2017-11-11 02:26:36 +00:00
2017-12-21 22:27:22 +00:00
## Frequently asked questions
* Why doesn't Tridactyl respect my search engine settings?
It's a webextension limitation. Firefox doesn't allow reading user preferences.
2017-12-21 22:27:22 +00:00
* How can I change the search engine?
2017-12-21 22:27:22 +00:00
2017-12-24 13:08:19 +00:00
`set searchengine duckduckgo`
2017-12-21 22:27:22 +00:00
* How can I add a search engine?
2017-12-21 22:27:22 +00:00
`set searchurls.esa http://www.esa.int/esasearch?q=`
2017-12-21 22:27:22 +00:00
2018-05-17 21:06:15 +01:00
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 configuration file just like Vimperator?
2017-12-21 22:27:22 +00:00
Yes, if you have `native` working, `$XDG_CONFIG_DIR/tridactyl/tridactylrc` or `~/.tridactylrc` will be read at startup via an `autocmd` and `source`. There is an [example file available on our repository](https://github.com/cmcaine/tridactyl/blob/master/.tridactylrc).
2017-12-22 10:58:46 +00:00
If you can't use the native messenger for some reason, there is a workaround: if you do `set storageloc local`, a JSON file will appear at `<your firefox profile>\browser-extension-data\tridactyl.vim@cmcaine.co.uk\storage.js`. You can find your profile folder by going to `about:support`. You can edit this file to your heart's content.
2017-12-21 22:27:22 +00:00
* I hate the light, can I get a dark theme/dark mode?
2018-03-08 22:34:22 +00:00
2018-05-17 21:06:15 +01:00
Yes: `set theme dark` or `colors dark`. Thanks to @fugerf.
2018-03-08 22:34:22 +00:00
* How can I pretend that I'm not a 1337 h4x0r?
2018-05-21 21:21:41 +01:00
We cater for you, too! `set theme shydactyl`. Thanks to @atrnh.
* How can I pretend that I'm a 1337 h4x0r?
2018-05-21 21:21:41 +01:00
We cater for you, too! `set theme greenmat`. Thanks to @caputchinefrobles.
* How can I bind keys using the control/alt key modifiers (eg: `ctrl+^`)?
2017-12-21 22:27:22 +00:00
2018-04-16 09:06:52 +01:00
`:bind <C-f> scrollpage 1`. Special keys can be bound too: `:bind <F3> set theme dark` and with modifiers: `:bind <S-F3> set theme default` and with multiple modifiers: `:bind <SA-F3> composite set hintchars 1234567890 | set hintfiltermode vimperator-reflow`
2018-04-16 09:06:52 +01:00
The modifiers are case insensitive. Special key names are not. The names used are those reported by Javascript with a limited number of vim compatibility aliases (e.g. `CR == Enter`).
If you want to bind <C-^> you'll find that you'll probably need to press Control+Shift+6 to trigger it. The default bind is <C-6> which does not require you to press shift.
2017-12-21 22:27:22 +00:00
* How can I tab complete from bookmarks?
2017-12-21 22:27:22 +00:00
`bmarks`. Bookmarks are not currently supported on `*open`: see [issue #214](https://github.com/cmcaine/tridactyl/issues/214).
2017-12-21 22:27:22 +00:00
* When I type 'f', can I type link names (like Vimperator) in order to narrow down the number of highlighted links?
2017-12-21 22:27:22 +00:00
You can, thanks to @saulrh. First `set hintfiltermode vimperator` and then `set hintchars 1234567890`.
2017-12-21 22:27:22 +00:00
* How to remap keybindings in both normal mode and ex mode?
2017-12-21 22:27:22 +00:00
2017-12-24 13:08:19 +00:00
You cannot. We only support normal mode bindings for now, with `bind [key] [excmd]`
2017-12-21 22:27:22 +00:00
* Where can I find a changelog for the different versions (to see what is new in the latest version)?
2017-12-21 22:27:22 +00:00
[Here.](https://github.com/cmcaine/tridactyl/blob/master/CHANGELOG.md)
2017-12-21 22:27:22 +00:00
* Why can't I use my bookmark keywords?
2017-12-21 22:27:22 +00:00
2017-12-24 13:08:19 +00:00
Mozilla doesn't give us access to them. See [issue #73](https://github.com/cmcaine/tridactyl/issues/73).
2017-12-21 22:27:22 +00:00
* Why doesn't Tridactyl work on websites with frames?
2017-12-21 22:27:22 +00:00
It should work on some frames now. See [#122](https://github.com/cmcaine/tridactyl/issues/122).
2017-12-21 22:27:22 +00:00
* Can I change proxy via commands?
2017-12-21 22:27:22 +00:00
Not yet, but this feature will eventually be implemented.
2017-12-21 22:27:22 +00:00
* How do I disable Tridactyl on certain sites?
2017-12-21 22:27:22 +00:00
2018-06-05 06:25:21 +02:00
In the beta you can use `blacklistadd`, like this: `blacklistadd mail.google.com/mail`.
2017-12-21 22:27:22 +00:00
* How can I list the current bindings?
2017-12-21 22:27:22 +00:00
2018-04-16 09:06:52 +01:00
`viewconfig nmaps` works OK, but Tridactyl commands won't work on the shown page for "security reasons". We'll eventually provide a better way. See [#98](https://github.com/cmcaine/tridactyl/issues/98).
2017-12-21 22:27:22 +00:00
* Why doesn't Tridactyl work on some pages?
2017-12-21 22:27:22 +00:00
2018-06-05 06:25:21 +02:00
One possible reason is that the site has a strict content security policy. You can try to use `set csp clobber` to fix this, but know that it could worsen the security of sensitive pages.
2017-12-21 22:27:22 +00:00
* How can I know which mode I'm in/have a status line?
2017-12-21 22:27:22 +00:00
2018-05-21 21:21:41 +01:00
Press `j` and see if you scroll down :) There's no status line yet: see [#210](https://github.com/cmcaine/tridactyl/issues/210), but we do have a "mode indicator" in the bottom right. It even goes purple when you're in a private window :).
2017-12-21 22:27:22 +00:00
* Does anyone actually use Tridactyl?
In addition to the developers, some other people do. Mozilla keeps tabs on them [here](https://addons.mozilla.org/en-US/firefox/addon/tridactyl-vim/statistics/?last=30).
2017-12-21 22:27:22 +00:00
2018-06-05 06:25:21 +02:00
* How do I prevent websites from stealing focus?
There are two ways to do that, the first one is `set allowautofocus false` (if you do this you'll probably also want to set `browser.autofocus` to false in `about:config`). This will prevent the page's `focus()` function from working and could break javascript text editors such as Ace or CodeMirror. Another solution is to use `autocmd TabEnter .* unfocus` in the beta, JS text editors should still work but pages won't steal focus when entering their tabs anymore.
2018-06-21 14:47:02 +01:00
* Help! A website I use is totally blank when I try to use it with Tridactyl enabled!
Try `set noiframeon [space separated list of URLs to match]`. If that doesn't work, please file an issue.
2017-09-25 05:25:24 +01:00
## Contributing
### Building and installing
Onboarding:
2017-09-25 05:25:24 +01:00
```
git clone https://github.com/cmcaine/tridactyl.git
2017-10-02 10:02:15 +01:00
cd tridactyl
2017-09-25 05:25:24 +01:00
npm install
npm run build
2017-09-25 05:25:24 +01:00
```
Each time package.json or package-lock.json change after you checkout or pull, you should run `npm install` again.
Addon is built in tridactyl/build. Load it as a temporary addon in firefox with `about:debugging` or see [Development loop](#Development-loop). The addon should work in Firefox 52+, but we're only deliberately supporting >=57.
2017-09-25 05:25:24 +01:00
If you want to install a local copy of the add-on into your developer or nightly build of firefox then you can enable installing unsigned add-ons and then build it like so:
2017-10-02 10:02:15 +01:00
```
# Build tridactyl if you haven't done that yet
npm run build
# Package for a browser
$(npm bin)/web-ext build -s build
2017-10-02 10:02:15 +01:00
```
If you want to build a signed copy (e.g. for the non-developer release), you can do that with `web-ext sign`. You'll need some keys for AMO and to edit the application id in `src/manifest.json`. There's a helper script in `scripts/sign` that's used by our build bot and for manual releases.
### Building on Windows
2018-05-15 08:14:07 +10:00
* Install [Git for Windows][win-git]
* Install [NodeJS for Windows][win-nodejs]
2018-05-15 08:14:07 +10:00
* Current 8.11.1 LTS seems to work fine
2018-05-15 08:14:07 +10:00
* Launch the installation steps described above from MinTTY shell
* Also known as "Git Bash"
2018-05-15 08:14:07 +10:00
2018-05-21 08:16:11 +10:00
[win-git]: https://git-scm.com/download/win
[win-nodejs]: https://nodejs.org/dist/v8.11.1/node-v8.11.1-x64.msi
[pyinstaller]: https://www.pyinstaller.org
[gpg4win]: https://www.gpg4win.org
<!--- ## Disable GPG signing for now, until decided otherwise later
### Cryptographically Verifying the Compiled Native Binary on Windows
- `native_main.py` is compiled to `native_main.exe` for Windows using [PyInstaller][pyinstaller]. The goal is to relieve Tridactyl users on Windows from having to install the whole Python 3 distribution.
- Due to `native_main.exe` being a binary-blob and difficult to easily review like the plain-text `native_main.py` counterpart, it is **strongly** recommended the users verify the SHA-256 hash and GPG signatures using the following commands on Powershell.
**Verifying SHA-256 Hash**
```
## Change directory to Tridactyl's native-messanger directory
PS C:\> cd "$env:HOME\.tridactyl"
## Run `dir` and check `native_main.exe` is found
PS C:\Users\{USERNAME}\.tridactyl> dir
## Download `native_main.exe.sha256` containing the SHA-256 sum
PS C:\Users\{USERNAME}\.tridactyl> iwr https://raw.githubusercontent.com/gsbabil/tridactyl/master/native/native_main.exe.sha256 -OutFile native_main.exe.sha256
## Print the SHA-256 sum from `native_main.exe.sha256`
PS C:\Users\{USERNAME}\.tridactyl> (Get-FileHash native_main.exe -Algorithm SHA256).Hash.ToLower()
## Compute SHA-256 sum from `native_main.exe`
PS C:\Users\{USERNAME}\.tridactyl> Get-Content -Path native_main.exe.sha256 | %{$_ .Split(' ')[0]}
## Compare results of the of the last two commands ...
```
**Verifying OpenPGP Signature***
- First, download [`GPG4Win`][gpg4win] from this website and
install in on your system
- Once `gpg2` is on your path, go to Powershell and run the
following commands to verify OpenPGP signature:
```
## Change directory to Tridactyl's native-messanger directory
PS C:\> cd "$env:HOME\.tridactyl"
## Run `dir` and check `native_main.exe` is found
PS C:\Users\{USERNAME}\.tridactyl> dir
## Download `native_main.exe.sig` containing the OpenPGP signature
PS C:\Users\{USERNAME}\.tridactyl> iwr https://raw.githubusercontent.com/gsbabil/tridactyl/master/native/native_main.exe.sig -OutFile native_main.exe.sig
## Download `gsbabil-pub.asc` to verify the signature
PS C:\Users\{USERNAME}\.tridactyl> iwr https://raw.githubusercontent.com/gsbabil/tridactyl/master/native/gsbabil-pub.asc -OutFile gsbabil-pub.asc
## Import `gsbabil-pub.asc` into your GPG key-ring
PS C:\Users\{USERNAME}\.tridactyl> gpg2 --armor --import gsbabil-pub.asc
## Verify signature using `gpg2`
PS C:\Users\{USERNAME}\.tridactyl> gpg2 --verify .\native_main.exe.sig .\native_main.exe
```
2018-05-21 08:16:11 +10:00
--->
2017-10-02 10:02:15 +01:00
### Development loop
```
npm run build & npm run run
2017-10-02 10:02:15 +01:00
```
<!-- This will compile and deploy your files each time you save them. -->
You'll need to run `npm run build` every time you edit the files, and press "r" in the `npm run run` window to make sure that the files are properly reloaded.
2017-10-02 10:02:15 +01:00
### Committing
A pre-commit hook is added by `npm install` that simply runs `npm test`. If you know that your commit doesn't break the tests you can commit with `git commit -n` to ignore the hooks. If you're making a PR, travis will check your build anyway.
### Documentation
2017-11-11 02:26:36 +00:00
Ask in `#tridactyl` on [matrix.org][matrix-link], freenode, or [gitter][gitter-link]. We're friendly!
Default keybindings are currently best discovered by reading the [default config](./src/config.ts).
2017-11-21 13:33:39 -05:00
Development notes are in the doc directory, but they're mostly out of date now. Code is quite short and not _too_ badly commented, though.
2017-09-25 05:25:24 +01:00
## Principles and objectives
2017-09-24 23:36:23 +01:00
Principles:
* Keyboard > mouse
* default keybinds should be Vim-like
* actions should be composable and repeatable
* ex mode should expose all the browser functionality anyone might want
* Arguable: most (all?) actions should have an ex mode version (departure from Vim?)
* users can map and define their own actions and commands
2017-09-24 23:36:23 +01:00
Other objectives:
* be fast - the whole point of a keyboard interface is to be more efficient, don't compromise that with slow code
* don't crash - we're the new UI and we shouldn't crash
* be maintainable - code should be well documented, reasoned about and tested.
2017-11-11 23:55:54 +00:00
## Logo acknowledgement
The logo was designed by Jake Beazley using free vector art by <a target="_blank" href="https://www.Vecteezy.com">www.Vecteezy.com</a>
2017-11-11 23:55:54 +00:00
[gitter-badge]: https://badges.gitter.im/Join%20Chat.svg
[gitter-link]: https://gitter.im/tridactyl/Lobby
[matrix-badge]: https://matrix.to/img/matrix-badge.svg
[matrix-link]: https://riot.im/app/#/room/#tridactyl:matrix.org
[betas]: https://tridactyl.cmcaine.co.uk/betas/?sort=time&order=desc
2018-08-19 22:30:54 +01:00
[riskyclick]: https://tridactyl.cmcaine.co.uk/betas/tridactyl-latest.xpi
2018-05-06 12:51:47 +01:00
[amo]: https://addons.mozilla.org/en-US/firefox/addon/tridactyl-vim?src=external-github