detached 0afb76e

docs(vim): document input and heading navigation

commit
0afb76ec1451dfea76e756f63beef3af305412bc
author
brice · · 2026-08-14 13:55 UTC
parent
fc18cde
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
3 files · +41 -9
M docs/config/index.md +17 -2
@@ -433,6 +433,18 @@ desc = "Scroll page down fast"
433433 keys = ["shift+k"]
434434 desc = "Scroll page up fast"
435435
436+[workspace.vim_mode.actions.focus-input]
437+keys = ["gi"]
438+desc = "Focus next page input"
439+
440+[workspace.vim_mode.actions.heading-next]
441+keys = ["]]"]
442+desc = "Jump to next heading"
443+
444+[workspace.vim_mode.actions.heading-prev]
445+keys = ["[["]
446+desc = "Jump to previous heading"
447+
436448 [workspace.vim_mode.actions.confirm]
437449 keys = ["enter"]
438450 desc = "Confirm action"
@@ -443,9 +455,12 @@ desc = "Cancel/exit mode"
443455 ```
444456
445457 Notes:
446-- Vim Mode scrolls the active webpage inside the active pane only.
447-- The default `timeout_ms = 0` means Vim Mode stays active until you exit it or focus moves into an editable/browser UI context.
458+- Vim Mode scrolls and navigates the active webpage inside the active pane only.
459+- `gi` focuses the next visible editable page input, starting at the first when no input is active and wrapping after the last.
460+- `]]` and `[[` move through visible `h1`–`h6` headings and use the current Dumber theme accent for the selected-heading outline.
461+- The default `timeout_ms = 0` means Vim Mode stays active until you exit it or focus moves into an editable/browser UI context. `Ctrl+Y` can still activate it when a page input is already focused.
448462 - Arrow keys still use the browser engine's native page-navigation path while Vim Mode is active.
463+- `Tab` and `Shift+Tab` keep focus traversal inside the page while a page input is focused.
449464 - Other app-level shortcuts stay suspended until Vim Mode exits, except for the Vim Mode toggle itself.
450465 - `workspace.styling.pane_mode_color`, `workspace.styling.transition_duration`, and `workspace.styling.mode_indicator_toaster_enabled` control the pane-local Vim Mode visuals.
451466 - Scroll execution: CEF and WebKit both use the shared `BuildPageScrollByJS` resolver when the page is ready. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. The application repeater owns held-key cadence; each engine executes one immediate scroll step per tick. Cross-origin frame contents remain best-effort. CEF may use native precision-wheel input only as a pre-frame fallback before the browser/main frame is ready.
@@ -433,6 +433,18 @@ desc = "Scroll page down fast"
433 keys = ["shift+k"]433 keys = ["shift+k"]
434 desc = "Scroll page up fast"434 desc = "Scroll page up fast"
435 435
436+[workspace.vim_mode.actions.focus-input]
437+keys = ["gi"]
438+desc = "Focus next page input"
439+
440+[workspace.vim_mode.actions.heading-next]
441+keys = ["]]"]
442+desc = "Jump to next heading"
443+
444+[workspace.vim_mode.actions.heading-prev]
445+keys = ["[["]
446+desc = "Jump to previous heading"
447+
436 [workspace.vim_mode.actions.confirm]448 [workspace.vim_mode.actions.confirm]
437 keys = ["enter"]449 keys = ["enter"]
438 desc = "Confirm action"450 desc = "Confirm action"
@@ -443,9 +455,12 @@ desc = "Cancel/exit mode"
443 ```455 ```
444 456
445 Notes:457 Notes:
446-- Vim Mode scrolls the active webpage inside the active pane only.458+- Vim Mode scrolls and navigates the active webpage inside the active pane only.
447-- The default `timeout_ms = 0` means Vim Mode stays active until you exit it or focus moves into an editable/browser UI context.459+- `gi` focuses the next visible editable page input, starting at the first when no input is active and wrapping after the last.
460+- `]]` and `[[` move through visible `h1`–`h6` headings and use the current Dumber theme accent for the selected-heading outline.
461+- The default `timeout_ms = 0` means Vim Mode stays active until you exit it or focus moves into an editable/browser UI context. `Ctrl+Y` can still activate it when a page input is already focused.
448 - Arrow keys still use the browser engine's native page-navigation path while Vim Mode is active.462 - Arrow keys still use the browser engine's native page-navigation path while Vim Mode is active.
463+- `Tab` and `Shift+Tab` keep focus traversal inside the page while a page input is focused.
449 - Other app-level shortcuts stay suspended until Vim Mode exits, except for the Vim Mode toggle itself.464 - Other app-level shortcuts stay suspended until Vim Mode exits, except for the Vim Mode toggle itself.
450 - `workspace.styling.pane_mode_color`, `workspace.styling.transition_duration`, and `workspace.styling.mode_indicator_toaster_enabled` control the pane-local Vim Mode visuals.465 - `workspace.styling.pane_mode_color`, `workspace.styling.transition_duration`, and `workspace.styling.mode_indicator_toaster_enabled` control the pane-local Vim Mode visuals.
451 - Scroll execution: CEF and WebKit both use the shared `BuildPageScrollByJS` resolver when the page is ready. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. The application repeater owns held-key cadence; each engine executes one immediate scroll step per tick. Cross-origin frame contents remain best-effort. CEF may use native precision-wheel input only as a pre-frame fallback before the browser/main frame is ready.466 - Scroll execution: CEF and WebKit both use the shared `BuildPageScrollByJS` resolver when the page is ready. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. The application repeater owns held-key cadence; each engine executes one immediate scroll step per tick. Cross-origin frame contents remain best-effort. CEF may use native precision-wheel input only as a pre-frame fallback before the browser/main frame is ready.
M docs/getting-started.md +6 -4
@@ -16,7 +16,7 @@ Dumber uses modal keybindings inspired by Zellij:
1616 |------|------------|---------|
1717 | Pane Mode | `Ctrl+P` | Split, close, focus panes |
1818 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |
19-| Vim Mode | `Ctrl+Y` | Scroll the active webpage with `h/j/k/l` and `Shift+J/K`; arrow keys stay native and other app shortcuts wait until exit |
19+| Vim Mode | `Ctrl+Y` | Scroll, navigate headings, and focus page inputs with Vim-style commands; arrow keys stay native and page focus stays inside the page while other app shortcuts wait until exit |
2020 | Resize Mode | `Ctrl+N` | Resize pane splits |
2121 | Session Mode | `Ctrl+O` | Session management |
2222
@@ -36,9 +36,11 @@ Vim Mode stays local to the active pane and automatically leaves the mode when f
3636 2. Use `h`, `j`, `k`, `l` to scroll left, down, up, or right
3737 3. Use `Shift+J` / `Shift+K` for faster vertical jumps
3838 4. Arrow keys continue to use the browser engine's native page navigation while Vim Mode is active
39-5. Other app-level shortcuts stay suspended until you leave Vim Mode
40-6. Press `Escape` or `Enter` to leave the mode
41-7. If a page input or editor is already focused, `Ctrl+Y` is passed through instead of stealing the keypress
39+5. Use `gi` to cycle through visible page inputs; use `]]` and `[[` to move through headings
40+6. `Tab` and `Shift+Tab` traverse focusable page controls while a page input is focused
41+7. Other app-level shortcuts stay suspended until you leave Vim Mode
42+8. Press `Escape` or `Enter` to leave the mode
43+9. `Ctrl+Y` can activate Vim Mode even when a page input or editor is already focused
4244
4345 > **Engine behavior**: CEF and WebKit execute Vim Mode scroll steps with the
4446 > shared `BuildPageScrollByJS` resolver (viewport-center start, nested-scroller
@@ -16,7 +16,7 @@ Dumber uses modal keybindings inspired by Zellij:
16 |------|------------|---------|16 |------|------------|---------|
17 | Pane Mode | `Ctrl+P` | Split, close, focus panes |17 | Pane Mode | `Ctrl+P` | Split, close, focus panes |
18 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |18 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |
19-| Vim Mode | `Ctrl+Y` | Scroll the active webpage with `h/j/k/l` and `Shift+J/K`; arrow keys stay native and other app shortcuts wait until exit |19+| Vim Mode | `Ctrl+Y` | Scroll, navigate headings, and focus page inputs with Vim-style commands; arrow keys stay native and page focus stays inside the page while other app shortcuts wait until exit |
20 | Resize Mode | `Ctrl+N` | Resize pane splits |20 | Resize Mode | `Ctrl+N` | Resize pane splits |
21 | Session Mode | `Ctrl+O` | Session management |21 | Session Mode | `Ctrl+O` | Session management |
22 22
@@ -36,9 +36,11 @@ Vim Mode stays local to the active pane and automatically leaves the mode when f
36 2. Use `h`, `j`, `k`, `l` to scroll left, down, up, or right36 2. Use `h`, `j`, `k`, `l` to scroll left, down, up, or right
37 3. Use `Shift+J` / `Shift+K` for faster vertical jumps37 3. Use `Shift+J` / `Shift+K` for faster vertical jumps
38 4. Arrow keys continue to use the browser engine's native page navigation while Vim Mode is active38 4. Arrow keys continue to use the browser engine's native page navigation while Vim Mode is active
39-5. Other app-level shortcuts stay suspended until you leave Vim Mode39+5. Use `gi` to cycle through visible page inputs; use `]]` and `[[` to move through headings
40-6. Press `Escape` or `Enter` to leave the mode40+6. `Tab` and `Shift+Tab` traverse focusable page controls while a page input is focused
41-7. If a page input or editor is already focused, `Ctrl+Y` is passed through instead of stealing the keypress41+7. Other app-level shortcuts stay suspended until you leave Vim Mode
42+8. Press `Escape` or `Enter` to leave the mode
43+9. `Ctrl+Y` can activate Vim Mode even when a page input or editor is already focused
42 44
43 > **Engine behavior**: CEF and WebKit execute Vim Mode scroll steps with the45 > **Engine behavior**: CEF and WebKit execute Vim Mode scroll steps with the
44 > shared `BuildPageScrollByJS` resolver (viewport-center start, nested-scroller46 > shared `BuildPageScrollByJS` resolver (viewport-center start, nested-scroller
M docs/reference/keybindings.md +18 -3
@@ -8,12 +8,12 @@ Dumber uses modal keybindings inspired by Zellij. Press a mode activation key, t
88 |------|-----|---------|
99 | Pane Mode | `Ctrl+P` | Split, close, focus panes |
1010 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |
11-| Vim Mode | `Ctrl+Y` | Scroll the active webpage with `h/j/k/l` and `Shift+J/K`; arrow keys stay native and other app shortcuts wait until exit |
11+| Vim Mode | `Ctrl+Y` | Scroll, navigate headings, and focus page inputs with Vim-style commands; arrow keys stay native and page focus stays inside the page while other app shortcuts wait until exit |
1212 | Resize Mode | `Ctrl+N` | Resize pane splits |
1313 | Session Mode | `Ctrl+O` | Session management |
1414
1515 Press `Escape` or `Enter` to exit any mode.
16-Vim Mode activation is passed through when the focused webpage element is already editable, so browser-page editors keep their own `Ctrl+Y` behavior.
16+`Ctrl+Y` can activate Vim Mode even when a page input is already focused, so you can use Vim commands without first moving focus away from the editor.
1717
1818 Keybinding tables use uppercase letters as visual labels for unshifted letter keys. In config, use lowercase (for example, `["w"]` for Pane Mode eject). Shifted keys are shown with an explicit `Shift+` prefix.
1919
@@ -55,10 +55,12 @@ Keybinding tables use uppercase letters as visual labels for unshifted letter ke
5555
5656 ## Vim Mode (`Ctrl+Y`)
5757
58-Vim Mode is an explicit Vim-style scrolling mode for the active pane only. It applies a pane-local accent from `workspace.styling.pane_mode_color`, and when `workspace.styling.mode_indicator_toaster_enabled` is true, shows a persistent bottom-left `VIM MODE` toaster while the mode is active; the toaster hides on exit, when the mode is toggled off, or when the toaster is disabled in config. The mode exits automatically when focus moves into the omnibox, find bar, overlays, or an editable element inside the page. The default `timeout_ms` is `0`, so Vim Mode does not auto-time out unless you configure one. Arrow keys continue to flow through the browser engine's native page-navigation path while Vim Mode is active, while other app-level shortcuts stay suspended until you leave the mode.
58+Vim Mode is an explicit Vim-style navigation mode for the active pane only. It applies a pane-local accent from `workspace.styling.pane_mode_color`, and when `workspace.styling.mode_indicator_toaster_enabled` is true, shows a persistent bottom-left `VIM MODE` toaster while the mode is active; the toaster hides on exit, when the mode is toggled off, or when the toaster is disabled in config. The mode exits automatically when focus moves into the omnibox, find bar, overlays, or an editable element inside the page. The default `timeout_ms` is `0`, so Vim Mode does not auto-time out unless you configure one. Arrow keys continue to flow through the browser engine's native page-navigation path while Vim Mode is active, while other app-level shortcuts stay suspended until you leave the mode. `Ctrl+Y` remains available when an editable page control is already focused.
5959
6060 CEF and WebKit execute Vim Mode scroll commands (`h/j/k/l`, `Shift+J/K`) with the shared `BuildPageScrollByJS` resolver. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. Cross-origin frame contents remain best-effort.
6161
62+`gi` focuses the next visible, editable page input. With no eligible input focused it starts at the first one; repeated `gi` commands cycle through the inputs. `]]` and `[[` move through visible `h1`–`h6` headings and outline the selected heading with the current Dumber theme accent. When a page input is focused, `Tab` and `Shift+Tab` keep focus traversal inside the page; traversal stops safely at the page boundaries instead of moving into the host window.
63+
6264 | Action | Keys |
6365 |--------|------|
6466 | Scroll left | `H` |
@@ -67,6 +69,10 @@ CEF and WebKit execute Vim Mode scroll commands (`h/j/k/l`, `Shift+J/K`) with th
6769 | Scroll right | `L` |
6870 | Scroll down fast | `Shift+J` |
6971 | Scroll up fast | `Shift+K` |
72+| Focus next page input | `gi` |
73+| Next heading | `]]` |
74+| Previous heading | `[[` |
75+| Page focus traversal | `Tab`, `Shift+Tab` |
7076 | Confirm | `Enter` |
7177 | Cancel | `Escape` |
7278
@@ -159,6 +165,15 @@ keys = ["shift+j"]
159165 [workspace.vim_mode.actions.vim-scroll-up-fast]
160166 keys = ["shift+k"]
161167
168+[workspace.vim_mode.actions.focus-input]
169+keys = ["gi"]
170+
171+[workspace.vim_mode.actions.heading-next]
172+keys = ["]]"]
173+
174+[workspace.vim_mode.actions.heading-prev]
175+keys = ["[["]
176+
162177 [workspace.shortcuts.actions.close-pane]
163178 keys = ["ctrl+w"]
164179
@@ -8,12 +8,12 @@ Dumber uses modal keybindings inspired by Zellij. Press a mode activation key, t
8 |------|-----|---------|8 |------|-----|---------|
9 | Pane Mode | `Ctrl+P` | Split, close, focus panes |9 | Pane Mode | `Ctrl+P` | Split, close, focus panes |
10 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |10 | Tab Mode | `Ctrl+T` | Create, close, switch tabs |
11-| Vim Mode | `Ctrl+Y` | Scroll the active webpage with `h/j/k/l` and `Shift+J/K`; arrow keys stay native and other app shortcuts wait until exit |11+| Vim Mode | `Ctrl+Y` | Scroll, navigate headings, and focus page inputs with Vim-style commands; arrow keys stay native and page focus stays inside the page while other app shortcuts wait until exit |
12 | Resize Mode | `Ctrl+N` | Resize pane splits |12 | Resize Mode | `Ctrl+N` | Resize pane splits |
13 | Session Mode | `Ctrl+O` | Session management |13 | Session Mode | `Ctrl+O` | Session management |
14 14
15 Press `Escape` or `Enter` to exit any mode.15 Press `Escape` or `Enter` to exit any mode.
16-Vim Mode activation is passed through when the focused webpage element is already editable, so browser-page editors keep their own `Ctrl+Y` behavior.16+`Ctrl+Y` can activate Vim Mode even when a page input is already focused, so you can use Vim commands without first moving focus away from the editor.
17 17
18 Keybinding tables use uppercase letters as visual labels for unshifted letter keys. In config, use lowercase (for example, `["w"]` for Pane Mode eject). Shifted keys are shown with an explicit `Shift+` prefix.18 Keybinding tables use uppercase letters as visual labels for unshifted letter keys. In config, use lowercase (for example, `["w"]` for Pane Mode eject). Shifted keys are shown with an explicit `Shift+` prefix.
19 19
@@ -55,10 +55,12 @@ Keybinding tables use uppercase letters as visual labels for unshifted letter ke
55 55
56 ## Vim Mode (`Ctrl+Y`)56 ## Vim Mode (`Ctrl+Y`)
57 57
58-Vim Mode is an explicit Vim-style scrolling mode for the active pane only. It applies a pane-local accent from `workspace.styling.pane_mode_color`, and when `workspace.styling.mode_indicator_toaster_enabled` is true, shows a persistent bottom-left `VIM MODE` toaster while the mode is active; the toaster hides on exit, when the mode is toggled off, or when the toaster is disabled in config. The mode exits automatically when focus moves into the omnibox, find bar, overlays, or an editable element inside the page. The default `timeout_ms` is `0`, so Vim Mode does not auto-time out unless you configure one. Arrow keys continue to flow through the browser engine's native page-navigation path while Vim Mode is active, while other app-level shortcuts stay suspended until you leave the mode.58+Vim Mode is an explicit Vim-style navigation mode for the active pane only. It applies a pane-local accent from `workspace.styling.pane_mode_color`, and when `workspace.styling.mode_indicator_toaster_enabled` is true, shows a persistent bottom-left `VIM MODE` toaster while the mode is active; the toaster hides on exit, when the mode is toggled off, or when the toaster is disabled in config. The mode exits automatically when focus moves into the omnibox, find bar, overlays, or an editable element inside the page. The default `timeout_ms` is `0`, so Vim Mode does not auto-time out unless you configure one. Arrow keys continue to flow through the browser engine's native page-navigation path while Vim Mode is active, while other app-level shortcuts stay suspended until you leave the mode. `Ctrl+Y` remains available when an editable page control is already focused.
59 59
60 CEF and WebKit execute Vim Mode scroll commands (`h/j/k/l`, `Shift+J/K`) with the shared `BuildPageScrollByJS` resolver. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. Cross-origin frame contents remain best-effort.60 CEF and WebKit execute Vim Mode scroll commands (`h/j/k/l`, `Shift+J/K`) with the shared `BuildPageScrollByJS` resolver. Each step starts under the viewport center, walks up through ancestors that can move in the requested direction, and hands scrolling to the document when a nested container reaches its boundary. Cross-origin frame contents remain best-effort.
61 61
62+`gi` focuses the next visible, editable page input. With no eligible input focused it starts at the first one; repeated `gi` commands cycle through the inputs. `]]` and `[[` move through visible `h1`–`h6` headings and outline the selected heading with the current Dumber theme accent. When a page input is focused, `Tab` and `Shift+Tab` keep focus traversal inside the page; traversal stops safely at the page boundaries instead of moving into the host window.
63+
62 | Action | Keys |64 | Action | Keys |
63 |--------|------|65 |--------|------|
64 | Scroll left | `H` |66 | Scroll left | `H` |
@@ -67,6 +69,10 @@ CEF and WebKit execute Vim Mode scroll commands (`h/j/k/l`, `Shift+J/K`) with th
67 | Scroll right | `L` |69 | Scroll right | `L` |
68 | Scroll down fast | `Shift+J` |70 | Scroll down fast | `Shift+J` |
69 | Scroll up fast | `Shift+K` |71 | Scroll up fast | `Shift+K` |
72+| Focus next page input | `gi` |
73+| Next heading | `]]` |
74+| Previous heading | `[[` |
75+| Page focus traversal | `Tab`, `Shift+Tab` |
70 | Confirm | `Enter` |76 | Confirm | `Enter` |
71 | Cancel | `Escape` |77 | Cancel | `Escape` |
72 78
@@ -159,6 +165,15 @@ keys = ["shift+j"]
159 [workspace.vim_mode.actions.vim-scroll-up-fast]165 [workspace.vim_mode.actions.vim-scroll-up-fast]
160 keys = ["shift+k"]166 keys = ["shift+k"]
161 167
168+[workspace.vim_mode.actions.focus-input]
169+keys = ["gi"]
170+
171+[workspace.vim_mode.actions.heading-next]
172+keys = ["]]"]
173+
174+[workspace.vim_mode.actions.heading-prev]
175+keys = ["[["]
176+
162 [workspace.shortcuts.actions.close-pane]177 [workspace.shortcuts.actions.close-pane]
163 keys = ["ctrl+w"]178 keys = ["ctrl+w"]
164 179

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close