mirror of
https://github.com/vale981/tridactyl
synced 2025-03-05 09:31:41 -05:00
Merge branch 'master' into actions
This commit is contained in:
commit
1605106194
18 changed files with 148 additions and 42 deletions
|
@ -48,14 +48,12 @@ jobs:
|
||||||
- run: bash -c '"$(yarn bin)/web-ext" build --source-dir ./build --overwrite-dest'
|
- run: bash -c '"$(yarn bin)/web-ext" build --source-dir ./build --overwrite-dest'
|
||||||
- run: mv web-ext-artifacts/*.zip web-ext-artifacts/tridactyl.xpi
|
- run: mv web-ext-artifacts/*.zip web-ext-artifacts/tridactyl.xpi
|
||||||
# selenium is temperamental - give it lots of chances to succeed
|
# selenium is temperamental - give it lots of chances to succeed
|
||||||
- run: bash -c 'PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
- run: bash -c 'PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests'
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
|
|
||||||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest"'
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
build_test_lint:
|
build_test_lint:
|
||||||
|
|
34
CHANGELOG.md
34
CHANGELOG.md
|
@ -1,5 +1,39 @@
|
||||||
# Tridactyl changelog
|
# Tridactyl changelog
|
||||||
|
|
||||||
|
## Release 1.19.1 / 29-05-2020
|
||||||
|
|
||||||
|
- New features
|
||||||
|
|
||||||
|
- All of our scrolling commands (e.g. j/k) now scroll the focused element ([#2417](https://github.com/tridactyl/tridactyl/issues/2417))
|
||||||
|
- The bind focus hint mode, `;;`, now hints more selectors to make it easier to select an element to scroll
|
||||||
|
- `:recontain` command to change the container of the current tab added
|
||||||
|
- See `:help recontain` before use as it has potentially surprising privacy implications
|
||||||
|
|
||||||
|
- Bug fixes
|
||||||
|
|
||||||
|
- The commandline history works again, but for real this time ([#2236](https://github.com/tridactyl/tridactyl/issues/2236))
|
||||||
|
- `g;` works again ([#2407](https://github.com/tridactyl/tridactyl/issues/2407))
|
||||||
|
- We no longer enter insert mode on readonly elements ([#2389](https://github.com/tridactyl/tridactyl/issues/2389))
|
||||||
|
- `mkt` now works even if you have used `setnull` or `unbind` ([#2415](https://github.com/tridactyl/tridactyl/issues/2415))
|
||||||
|
- We ensure nothing is written to local storage in private windows ([#2423](https://github.com/tridactyl/tridactyl/issues/2423))
|
||||||
|
- (very little was being written - namely the last ex string you executed and the tab ID of the last input you used; both of these would be overwritten regularly so the danger is low)
|
||||||
|
- this does mean that `repeat` will no longer function in private windows
|
||||||
|
- `winopen -private [url]` is no longer stored for `repeat` ([#2424](https://github.com/tridactyl/tridactyl/issues/2424))
|
||||||
|
- We now accurately attach hints to more elements ([#487](https://github.com/tridactyl/tridactyl/issues/487))
|
||||||
|
|
||||||
|
- Miscellaneous
|
||||||
|
|
||||||
|
- Our config updater no longer uses a while loop which could spin forever in certain circumstances ([#2349](https://github.com/tridactyl/tridactyl/issues/2349))
|
||||||
|
- Our E2E tests fail less often (by retrying a few times) ([#2387](https://github.com/tridactyl/tridactyl/issues/2387))
|
||||||
|
- There is now less duplication between lib/state and content/state_content ([#2422](https://github.com/tridactyl/tridactyl/issues/2422))
|
||||||
|
- Our scrolling code is now a little easier to read ([#2384](https://github.com/tridactyl/tridactyl/issues/2384))
|
||||||
|
|
||||||
|
Thanks to all of our contributors for this release: Oliver Blanthorn, dependabot-preview[bot], Matias Ammentorp Storm, MatiasStorm, Dranaxel, glacambre, Alexandre, Robert Günzler and Tanath.
|
||||||
|
|
||||||
|
Extra special thanks go to Alexandre, Dranaxel, Matias Ammentorp Storm, MatiasStorm and Tanath who all contributed for the first time.
|
||||||
|
|
||||||
|
Last, but not least - thank you to everyone who reported issues.
|
||||||
|
|
||||||
## Release 1.19.0 / 10-05-2020
|
## Release 1.19.0 / 10-05-2020
|
||||||
|
|
||||||
- New features
|
- New features
|
||||||
|
|
|
@ -11,8 +11,8 @@ Replace Firefox's control mechanism with one modelled on VIM. This is a "Firefox
|
||||||
- Notice that this tab is rubbish and you want to close it? `d`.
|
- Notice that this tab is rubbish and you want to close it? `d`.
|
||||||
- Regret that decision? `u` restores it.
|
- Regret that decision? `u` restores it.
|
||||||
- Want to write something in Vim? `Ctrl-i` in a text box opens it in Vim, if you have `:native` working.
|
- Want to write something in Vim? `Ctrl-i` in a text box opens it in Vim, if you have `:native` working.
|
||||||
- Temporarily disable all that magic because you can't stand it? `Shift-Insert`.
|
- Temporarily disable all that magic because you can't stand it? `Shift-Insert` or `Ctrl-Alt-Escape`.
|
||||||
- But how do you use your browser now? `Shift-Insert` again and we're back on.
|
- But how do you use your browser now? `Shift-Insert` or `Ctrl-Alt-Escape` again and we're back on.
|
||||||
|
|
||||||
The list could go on a bit here, but I guess you'll get the point. If you feel lost sometimes `:help` might help you a lot, and there's always `:tutor`.
|
The list could go on a bit here, but I guess you'll get the point. If you feel lost sometimes `:help` might help you a lot, and there's always `:tutor`.
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,10 @@ If changing one of these settings fixes your bug, please visit the corresponding
|
||||||
- `:set allowautofocus true` and then reload the page. This allows website to use the javascript `focus()` function. [#550](https://github.com/tridactyl/tridactyl/issues/550)
|
- `:set allowautofocus true` and then reload the page. This allows website to use the javascript `focus()` function. [#550](https://github.com/tridactyl/tridactyl/issues/550)
|
||||||
- `:set modeindicator false` and then reload the page. This disables the mode indicator. [#821](https://github.com/tridactyl/tridactyl/issues/821)
|
- `:set modeindicator false` and then reload the page. This disables the mode indicator. [#821](https://github.com/tridactyl/tridactyl/issues/821)
|
||||||
|
|
||||||
|
# Firefox settings that can break Tridactyl
|
||||||
|
|
||||||
|
If you have `privacy.resistFingerprinting` set to `true` in `about:config`, Tridactyl will have a lot of trouble understanding your keypresses. See [#760](https://github.com/tridactyl/tridactyl/issues/760#issuecomment-433679201) and [#1699](https://github.com/tridactyl/tridactyl/issues/1699). We strongly recommend setting it to `false`, as it is by default.
|
||||||
|
|
||||||
# Native Editor/Messenger issues
|
# Native Editor/Messenger issues
|
||||||
|
|
||||||
If you're having trouble running your editor on OSX, you might be having \$PATH issues: [#684](https://github.com/tridactyl/tridactyl/issues/684). The solution is to specify the absolute path to your editor, like this: `:set editorcmd /usr/local/bin/vimr`.
|
If you're having trouble running your editor on OSX, you might be having \$PATH issues: [#684](https://github.com/tridactyl/tridactyl/issues/684). The solution is to specify the absolute path to your editor, like this: `:set editorcmd /usr/local/bin/vimr`.
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
"css": "^2.2.4",
|
"css": "^2.2.4",
|
||||||
"flyd": "^0.2.8",
|
"flyd": "^0.2.8",
|
||||||
"fuse.js": "^6.0.0",
|
"fuse.js": "^6.0.0",
|
||||||
"immer": "^6.0.8",
|
"immer": "^6.0.9",
|
||||||
"mark.js": "^8.11.1",
|
"mark.js": "^8.11.1",
|
||||||
"mithril": "^2.0.4",
|
"mithril": "^2.0.4",
|
||||||
"ramda": "^0.27.0",
|
"ramda": "^0.27.0",
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^25.2.3",
|
"@types/jest": "^25.2.3",
|
||||||
"@types/mithril": "^2.0.3",
|
"@types/mithril": "^2.0.3",
|
||||||
"@types/node": "^14.0.5",
|
"@types/node": "^14.0.6",
|
||||||
"@types/selenium-webdriver": "^4.0.9",
|
"@types/selenium-webdriver": "^4.0.9",
|
||||||
"cleanslate": "^0.10.1",
|
"cleanslate": "^0.10.1",
|
||||||
"copy-webpack-plugin": "^6.0.1",
|
"copy-webpack-plugin": "^6.0.1",
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
"source-map-loader": "^1.0.0",
|
"source-map-loader": "^1.0.0",
|
||||||
"ts-jest": "^25.5.1",
|
"ts-jest": "^25.5.1",
|
||||||
"ts-loader": "^7.0.5",
|
"ts-loader": "^7.0.5",
|
||||||
"ts-node": "^8.10.1",
|
"ts-node": "^8.10.2",
|
||||||
"tsconfig-paths-webpack-plugin": "^3.2.0",
|
"tsconfig-paths-webpack-plugin": "^3.2.0",
|
||||||
"tslint": "^5.20.1",
|
"tslint": "^5.20.1",
|
||||||
"tslint-etc": "^1.10.1",
|
"tslint-etc": "^1.10.1",
|
||||||
|
|
45
src/excmds.test.ts
Normal file
45
src/excmds.test.ts
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import { tabopen } from "@src/.excmds_background.generated"
|
||||||
|
import { openInNewTab, getContext } from "@src/lib/webext"
|
||||||
|
import { fuzzyMatch } from "@src/lib/containers"
|
||||||
|
|
||||||
|
jest.mock("@src/lib/webext", () => {
|
||||||
|
return {
|
||||||
|
__esModule: true,
|
||||||
|
openInNewTab: jest.fn(() => ({ then: fn => {} })),
|
||||||
|
getContext: jest.fn(),
|
||||||
|
activeTabContainerId: jest.fn(() => ({ then: fn => fn() })),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
jest.mock("@src/lib/containers", () => {
|
||||||
|
return {
|
||||||
|
__esModule: true,
|
||||||
|
fuzzyMatch: jest.fn().mockReturnValue("firefox-container-111"),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Ideally this mock should be provided by jest-webextension-mock,
|
||||||
|
// but it isn't: https://github.com/clarkbw/jest-webextension-mock/issues/89
|
||||||
|
const windows = {
|
||||||
|
getCurrent: jest.fn().mockReturnValue({ incognito: false }),
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("excmds unit tests", () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
Object.defineProperty(browser, "windows", { value: windows })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('`tabopen("-c", "none")` opens tab with no container', async () => {
|
||||||
|
await tabopen("-c", "none")
|
||||||
|
|
||||||
|
expect(openInNewTab).toHaveBeenCalledWith(null, {})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('`tabopen("-c", "somecnt")` opens tab with some container', async () => {
|
||||||
|
await tabopen("-c", "somecnt")
|
||||||
|
|
||||||
|
expect(openInNewTab).toHaveBeenCalledWith(null, {
|
||||||
|
cookieStoreId: "firefox-container-111",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -2100,7 +2100,7 @@ export async function tabprev(increment = 1) {
|
||||||
|
|
||||||
/** Like [[open]], but in a new tab. If no address is given, it will open the newtab page, which can be set with `set newtab [url]`
|
/** Like [[open]], but in a new tab. If no address is given, it will open the newtab page, which can be set with `set newtab [url]`
|
||||||
|
|
||||||
Use the `-c` flag followed by a container name to open a tab in said container. Tridactyl will try to fuzzy match a name if an exact match is not found. If any autocontainer directives are configured and -c is not set, Tridactyl will try to use the right container automatically using your configurations.
|
Use the `-c` flag followed by a container name to open a tab in said container. Tridactyl will try to fuzzy match a name if an exact match is not found (opening the tab in no container can be enforced with "firefox-default" or "none"). If any autocontainer directives are configured and -c is not set, Tridactyl will try to use the right container automatically using your configurations.
|
||||||
Use the `-b` flag to open the tab in the background.
|
Use the `-b` flag to open the tab in the background.
|
||||||
These two can be combined in any order, but need to be placed as the first arguments.
|
These two can be combined in any order, but need to be placed as the first arguments.
|
||||||
|
|
||||||
|
@ -2133,8 +2133,13 @@ export async function tabopen(...addressarr: string[]) {
|
||||||
argParse(args)
|
argParse(args)
|
||||||
} else if (args[0] === "-c") {
|
} else if (args[0] === "-c") {
|
||||||
// Ignore the -c flag if incognito as containers are disabled.
|
// Ignore the -c flag if incognito as containers are disabled.
|
||||||
if (!win.incognito) container = await Container.fuzzyMatch(args[1])
|
if (!win.incognito) {
|
||||||
else logger.error("[tabopen] can't open a container in a private browsing window.")
|
if (args[1] === "firefox-default" || args[1].toLowerCase() === "none") {
|
||||||
|
container = "firefox-default"
|
||||||
|
} else {
|
||||||
|
container = await Container.fuzzyMatch(args[1])
|
||||||
|
}
|
||||||
|
} else logger.error("[tabopen] can't open a container in a private browsing window.")
|
||||||
|
|
||||||
args.shift()
|
args.shift()
|
||||||
args.shift()
|
args.shift()
|
||||||
|
@ -2163,7 +2168,9 @@ export async function tabopen(...addressarr: string[]) {
|
||||||
const args = { active } as any
|
const args = { active } as any
|
||||||
// Ensure -c has priority.
|
// Ensure -c has priority.
|
||||||
if (container) {
|
if (container) {
|
||||||
|
if (container !== "firefox-default") {
|
||||||
args.cookieStoreId = container
|
args.cookieStoreId = container
|
||||||
|
}
|
||||||
} else if (containerId && config.get("tabopencontaineraware") === "true") {
|
} else if (containerId && config.get("tabopencontaineraware") === "true") {
|
||||||
args.cookieStoreId = containerId
|
args.cookieStoreId = containerId
|
||||||
}
|
}
|
||||||
|
@ -3430,7 +3437,7 @@ export function autocmd(event: string, url: string, ...excmd: string[]) {
|
||||||
* This function accepts a `-u` flag to treat the pattern as a URL rather than a domain.
|
* This function accepts a `-u` flag to treat the pattern as a URL rather than a domain.
|
||||||
* For example: `autocontain -u ^https?://[^/]*youtube\.com/ google` is equivalent to `autocontain youtube\.com google`
|
* For example: `autocontain -u ^https?://[^/]*youtube\.com/ google` is equivalent to `autocontain youtube\.com google`
|
||||||
*
|
*
|
||||||
* For declaring containers that do not yet exist, consider using `auconscreatecontainer true` in your tridactylrc.
|
* For declaring containers that do not yet exist, consider using `auconcreatecontainer true` in your tridactylrc.
|
||||||
* This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
|
* This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
|
||||||
*
|
*
|
||||||
* __NB: This is an experimental feature, if you encounter issues please create an issue on GitHub.__
|
* __NB: This is an experimental feature, if you encounter issues please create an issue on GitHub.__
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
Hook into webRequests and make sure that your (least) favorite domain is contained
|
Hook into webRequests and make sure that your (least) favorite domain is contained
|
||||||
and doesn't touch your default browsing environment.
|
and doesn't touch your default browsing environment.
|
||||||
|
|
||||||
For declaring containers that do not yet exist, consider using `auconscreatecontainer true` in your tridactylrc.
|
For declaring containers that do not yet exist, consider using `auconcreatecontainer true` in your tridactylrc.
|
||||||
This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
|
This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
|
||||||
|
|
||||||
** NB: This is an experimental feature, if you encounter issues please create an issue on github. **
|
** NB: This is an experimental feature, if you encounter issues please create an issue on github. **
|
||||||
|
|
|
@ -413,7 +413,7 @@ export class default_config {
|
||||||
/**
|
/**
|
||||||
* Commands that will be run when Tridactyl first runs each time you start your browser.
|
* Commands that will be run when Tridactyl first runs each time you start your browser.
|
||||||
*
|
*
|
||||||
* Each key corresponds to a URL fragment which, if contained within the page URL, will run the corresponding command.
|
* Each key corresponds to a javascript regex that matches the hostname of the computer Firefox is running on. Note that fetching the hostname could be a little slow, if you want to execute something unconditionally, use ".*" as Tridactyl special-cases this pattern to avoid hostname lookups.
|
||||||
*/
|
*/
|
||||||
TriStart: {
|
TriStart: {
|
||||||
".*": "source_quiet",
|
".*": "source_quiet",
|
||||||
|
|
|
@ -350,19 +350,29 @@ export function mapstrMapToKeyMap(mapstrMap: Map<string, MapTarget>): KeyMap {
|
||||||
return newKeyMap
|
return newKeyMap
|
||||||
}
|
}
|
||||||
|
|
||||||
export function keyMap(conf, keys): KeyMap {
|
let KEYMAP_CACHE = {}
|
||||||
let maps: any = config.get(conf)
|
|
||||||
if (maps === undefined) throw new Error("No binds defined for this mode. Reload page with <C-r> and add binds, e.g. :bind --mode=[mode] <Esc> mode normal")
|
|
||||||
|
|
||||||
|
export function translateKeysInPlace(keys, conf): void {
|
||||||
// If so configured, translate keys using the key translation map
|
// If so configured, translate keys using the key translation map
|
||||||
if (config.get("keytranslatemodes")[conf] === "true") {
|
if (config.get("keytranslatemodes")[conf] === "true") {
|
||||||
const translationmap = config.get("keytranslatemap")
|
const translationmap = config.get("keytranslatemap")
|
||||||
translateKeysUsingKeyTranslateMap(keys, translationmap)
|
translateKeysUsingKeyTranslateMap(keys, translationmap)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a "*maps" config converted into sequences of minimalkeys (e.g. "nmaps")
|
||||||
|
*/
|
||||||
|
export function keyMap(conf): KeyMap {
|
||||||
|
if (KEYMAP_CACHE[conf]) return KEYMAP_CACHE[conf]
|
||||||
|
|
||||||
|
let maps: any = config.get(conf)
|
||||||
|
if (maps === undefined) throw new Error("No binds defined for this mode. Reload page with <C-r> and add binds, e.g. :bind --mode=[mode] <Esc> mode normal")
|
||||||
|
|
||||||
// Convert to KeyMap
|
// Convert to KeyMap
|
||||||
maps = new Map(Object.entries(maps))
|
maps = new Map(Object.entries(maps))
|
||||||
return mapstrMapToKeyMap(maps)
|
KEYMAP_CACHE[conf] = mapstrMapToKeyMap(maps)
|
||||||
|
return KEYMAP_CACHE[conf]
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
@ -435,3 +445,9 @@ export function translateKeysUsingKeyTranslateMap(
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
browser.storage.onChanged.addListener((changes, areaname) => {
|
||||||
|
if ("userconfig" in changes) {
|
||||||
|
KEYMAP_CACHE = {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "Tridactyl",
|
"name": "Tridactyl",
|
||||||
"version": "1.19.0",
|
"version": "1.19.1",
|
||||||
"icons": {
|
"icons": {
|
||||||
"64": "static/logo/Tridactyl_64px.png",
|
"64": "static/logo/Tridactyl_64px.png",
|
||||||
"100": "static/logo/Tridactyl_100px.png",
|
"100": "static/logo/Tridactyl_100px.png",
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
"applications": {
|
"applications": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
"id": "tridactyl.vim.betas@cmcaine.co.uk",
|
"id": "tridactyl.vim.betas@cmcaine.co.uk",
|
||||||
"strict_min_version": "75.0"
|
"strict_min_version": "68.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"options_ui": {
|
"options_ui": {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import * as keyseq from "@src/lib/keyseq"
|
import * as keyseq from "@src/lib/keyseq"
|
||||||
|
|
||||||
export function parser(conf, keys): keyseq.ParserResponse {
|
export function parser(conf, keys): keyseq.ParserResponse {
|
||||||
const maps = keyseq.keyMap(conf, keys)
|
const maps = keyseq.keyMap(conf)
|
||||||
|
keyseq.translateKeysInPlace(keys, conf)
|
||||||
return keyseq.parse(keys, maps)
|
return keyseq.parse(keys, maps)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,8 @@ export function parser(keys: KeyboardEvent[]) {
|
||||||
keys = keyseq.stripOnlyModifiers(keys)
|
keys = keyseq.stripOnlyModifiers(keys)
|
||||||
if (keys.length === 0) return { keys: [], isMatch: false }
|
if (keys.length === 0) return { keys: [], isMatch: false }
|
||||||
const conf = mode2maps.get(modeState.mode) || modeState.mode + "maps"
|
const conf = mode2maps.get(modeState.mode) || modeState.mode + "maps"
|
||||||
const maps: any = keyseq.keyMap(conf, keys)
|
const maps: any = keyseq.keyMap(conf)
|
||||||
|
keyseq.translateKeysInPlace(keys, conf)
|
||||||
const key = keys[0].key
|
const key = keys[0].key
|
||||||
|
|
||||||
if (key === "Escape") {
|
if (key === "Escape") {
|
||||||
|
|
|
@ -26,7 +26,7 @@ The idea behind Tridactyl is to allow you to navigate the web more efficiently w
|
||||||
- You can enter this mode with `:` and exit it with `Escape` or `Enter`.
|
- You can enter this mode with `:` and exit it with `Escape` or `Enter`.
|
||||||
- Ignore mode
|
- Ignore mode
|
||||||
- This mode passes all keypresses through to the web page. It is useful for websites that have their own keybinds, such as games and Gmail.
|
- This mode passes all keypresses through to the web page. It is useful for websites that have their own keybinds, such as games and Gmail.
|
||||||
- You can toggle the mode with `Shift-Insert`, `Ctrl-Alt-Backtick`, or `Shift-Esc`.
|
- You can toggle the mode with `Shift-Insert`, `Ctrl-Alt-Escape`, `Ctrl-Alt-Backtick`, or `Shift-Esc`.
|
||||||
- While in ignore mode, you can execute a single normal mode binding by pressing `<C-o>` followed by the keys for the binding.
|
- While in ignore mode, you can execute a single normal mode binding by pressing `<C-o>` followed by the keys for the binding.
|
||||||
|
|
||||||
Almost all of the modes are controlled by series of keypresses. In this tutorial, a sequence of keys such as `zz` should be entered by pressing the key `z`, letting go, and then pressing the key `z`. There is no need to hold both keys at once, if that were even possible. (`zz` resets the zoom level to the default, so it probably didn't seem to do anything). Sometimes `help` refers to a command that must be entered in command mode; it should hopefully always be clear from context which we mean.
|
Almost all of the modes are controlled by series of keypresses. In this tutorial, a sequence of keys such as `zz` should be entered by pressing the key `z`, letting go, and then pressing the key `z`. There is no need to hold both keys at once, if that were even possible. (`zz` resets the zoom level to the default, so it probably didn't seem to do anything). Sometimes `help` refers to a command that must be entered in command mode; it should hopefully always be clear from context which we mean.
|
||||||
|
|
|
@ -23,7 +23,7 @@ REPLACE_ME_WITH_THE_CHANGE_LOG_USING_SED
|
||||||
## Highlighted features:
|
## Highlighted features:
|
||||||
|
|
||||||
- `f`/`F` — enter the "hint mode" to select a link to follow. `F` to open it in a background tab. (Note: hint characters should be typed in lowercase.)
|
- `f`/`F` — enter the "hint mode" to select a link to follow. `F` to open it in a background tab. (Note: hint characters should be typed in lowercase.)
|
||||||
- `Shift` + `Insert` — enter "ignore mode" to send all key presses to the web page you are on. Press `Shift` + `Insert` again to return to the highly productive "normal mode".
|
- `Shift` + `Insert` or `Ctrl-Alt-Escape` — enter "ignore mode" to send all key presses to the web page you are on. Press `Shift` + `Insert` or `Ctrl-Alt-Escape` again to return to the highly productive "normal mode".
|
||||||
- `H`/`L` — go back/forward in the history.
|
- `H`/`L` — go back/forward in the history.
|
||||||
- `o`/`O` — open a URL in this tab (`O` to pre-load current URL).
|
- `o`/`O` — open a URL in this tab (`O` to pre-load current URL).
|
||||||
- `t`/`T` — open a URL in a new tab (`T` to pre-load current URL).
|
- `t`/`T` — open a URL in a new tab (`T` to pre-load current URL).
|
||||||
|
|
24
yarn.lock
24
yarn.lock
|
@ -731,10 +731,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420"
|
resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420"
|
||||||
integrity sha512-oaAg5gn74VFpPYs6Ou2pjDao3WJxnlnH29q9rLOxSGb0PTw2QtBQcTAN9xs1OAHrtI9En5kIXKM96stf7//c9w==
|
integrity sha512-oaAg5gn74VFpPYs6Ou2pjDao3WJxnlnH29q9rLOxSGb0PTw2QtBQcTAN9xs1OAHrtI9En5kIXKM96stf7//c9w==
|
||||||
|
|
||||||
"@types/node@*", "@types/node@^14.0.5":
|
"@types/node@*", "@types/node@^14.0.6":
|
||||||
version "14.0.5"
|
version "14.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.6.tgz#f9e178b2da31a4b0ec60b64649e244c31ce18daf"
|
||||||
integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==
|
integrity sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==
|
||||||
|
|
||||||
"@types/normalize-package-data@^2.4.0":
|
"@types/normalize-package-data@^2.4.0":
|
||||||
version "2.4.0"
|
version "2.4.0"
|
||||||
|
@ -4209,10 +4209,10 @@ immediate@~3.0.5:
|
||||||
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
|
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
|
||||||
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
|
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
|
||||||
|
|
||||||
immer@^6.0.8:
|
immer@^6.0.9:
|
||||||
version "6.0.8"
|
version "6.0.9"
|
||||||
resolved "https://registry.yarnpkg.com/immer/-/immer-6.0.8.tgz#3758890d66ed7baed5703b9e0763785a16156478"
|
resolved "https://registry.yarnpkg.com/immer/-/immer-6.0.9.tgz#b9dd69b8e69b3a12391e87db1e3ff535d1b26485"
|
||||||
integrity sha512-wmVdrkqL6OzhX5z2k/c0t8g+YzGy+V8B/r1GRdCTO0UcTiFkB0XVAxpJQT045KaNV2u14HzbLCYKJmt7yVCakg==
|
integrity sha512-SyCYnAuiRf67Lvk0VkwFvwtDoEiCMjeamnHvRfnVDyc7re1/rQrNxuL+jJ7lA3WvdC4uznrvbmm+clJ9+XXatg==
|
||||||
|
|
||||||
immutable@^3.8.2:
|
immutable@^3.8.2:
|
||||||
version "3.8.2"
|
version "3.8.2"
|
||||||
|
@ -8307,10 +8307,10 @@ ts-loader@^7.0.5:
|
||||||
micromatch "^4.0.0"
|
micromatch "^4.0.0"
|
||||||
semver "^6.0.0"
|
semver "^6.0.0"
|
||||||
|
|
||||||
ts-node@^8.10.1:
|
ts-node@^8.10.2:
|
||||||
version "8.10.1"
|
version "8.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3"
|
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d"
|
||||||
integrity sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==
|
integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==
|
||||||
dependencies:
|
dependencies:
|
||||||
arg "^4.1.0"
|
arg "^4.1.0"
|
||||||
diff "^4.0.1"
|
diff "^4.0.1"
|
||||||
|
|
Loading…
Add table
Reference in a new issue