detached af377b4

docs(floating-pane): clarify shortcut behavior and modifier combos

Document toggle-vs-close semantics and Alt-key conflict caveats so floating pane bindings are predictable. Add unit coverage for ctrl+alt and ctrl+shift floating profile shortcuts to keep docs aligned with behavior.
commit
af377b45714e850a32809cac41afc52017fb5bdd
author
brice · · 2026-02-09 10:59 UTC
parent
482d014
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
8 files · +120 -5
M README.md +10 -0
@@ -23,6 +23,7 @@ https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118
2323
2424 **Features:**
2525 - Zellij-style panes with modal keyboard navigation
26+- Floating workspace pane with profile shortcuts
2627 - Wayland native (Sway, Hyprland, River, Niri)
2728 - Session resurrection with auto-snapshots
2829 - Built-in ad blocking (UBlock-based)
@@ -90,6 +91,15 @@ Four modal modes. Enter a mode, take action, escape out. Vim and Zellij users wi
9091 | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows |
9192 | Session | `Ctrl+O` | Save · Restore · Browse |
9293
94+## Floating Pane
95+
96+- `Alt+F` toggles the floating pane and preserves its state while hidden.
97+- `Ctrl+W` closes the active pane; if the floating pane is active, it is fully released for a fresh next open.
98+- Profile shortcuts like `Alt+G` are optional and configured under `workspace.floating_pane.profiles`.
99+- Some `Alt+<key>` bindings may conflict with default WebKit shortcuts or desktop-level handlers.
100+
101+See [Floating Pane Reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details.
102+
93103 ## Development
94104
95105 Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI.
@@ -23,6 +23,7 @@ https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118
23 23
24 **Features:**24 **Features:**
25 - Zellij-style panes with modal keyboard navigation25 - Zellij-style panes with modal keyboard navigation
26+- Floating workspace pane with profile shortcuts
26 - Wayland native (Sway, Hyprland, River, Niri)27 - Wayland native (Sway, Hyprland, River, Niri)
27 - Session resurrection with auto-snapshots28 - Session resurrection with auto-snapshots
28 - Built-in ad blocking (UBlock-based)29 - Built-in ad blocking (UBlock-based)
@@ -90,6 +91,15 @@ Four modal modes. Enter a mode, take action, escape out. Vim and Zellij users wi
90 | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows |91 | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows |
91 | Session | `Ctrl+O` | Save · Restore · Browse |92 | Session | `Ctrl+O` | Save · Restore · Browse |
92 93
94+## Floating Pane
95+
96+- `Alt+F` toggles the floating pane and preserves its state while hidden.
97+- `Ctrl+W` closes the active pane; if the floating pane is active, it is fully released for a fresh next open.
98+- Profile shortcuts like `Alt+G` are optional and configured under `workspace.floating_pane.profiles`.
99+- Some `Alt+<key>` bindings may conflict with default WebKit shortcuts or desktop-level handlers.
100+
101+See [Floating Pane Reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details.
102+
93 ## Development103 ## Development
94 104
95 Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI.105 Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI.
M docs/config/index.md +4 -1
@@ -301,7 +301,7 @@ Global shortcuts are configured under `workspace.shortcuts.actions` using the sa
301301 | Action | Default Keys | Description |
302302 |--------|--------------|-------------|
303303 | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) |
304-| `close_pane` | `ctrl+w` | Close active pane (closes tab if last pane) |
304+| `close_pane` | `ctrl+w` | Close active pane (or release floating pane when floating is active) |
305305 | `next_tab` | `ctrl+tab` | Switch to next tab |
306306 | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab |
307307 | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked |
@@ -339,6 +339,9 @@ The floating workspace pane is a persistent overlay session: hiding it does not
339339
340340 - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`).
341341 - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default.
342+- `Alt+F` toggles visibility only and preserves floating state.
343+- `Ctrl+W` on an active floating pane closes and releases that floating session for a fresh next open.
344+- Floating profile keybindings support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
342345
343346 | Key | Type | Default | Description |
344347 |-----|------|---------|-------------|
@@ -301,7 +301,7 @@ Global shortcuts are configured under `workspace.shortcuts.actions` using the sa
301 | Action | Default Keys | Description |301 | Action | Default Keys | Description |
302 |--------|--------------|-------------|302 |--------|--------------|-------------|
303 | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) |303 | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) |
304-| `close_pane` | `ctrl+w` | Close active pane (closes tab if last pane) |304+| `close_pane` | `ctrl+w` | Close active pane (or release floating pane when floating is active) |
305 | `next_tab` | `ctrl+tab` | Switch to next tab |305 | `next_tab` | `ctrl+tab` | Switch to next tab |
306 | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab |306 | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab |
307 | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked |307 | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked |
@@ -339,6 +339,9 @@ The floating workspace pane is a persistent overlay session: hiding it does not
339 339
340 - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`).340 - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`).
341 - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default.341 - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default.
342+- `Alt+F` toggles visibility only and preserves floating state.
343+- `Ctrl+W` on an active floating pane closes and releases that floating session for a fresh next open.
344+- Floating profile keybindings support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
342 345
343 | Key | Type | Default | Description |346 | Key | Type | Default | Description |
344 |-----|------|---------|-------------|347 |-----|------|---------|-------------|
M docs/getting-started.md +8 -0
@@ -35,6 +35,14 @@ Press `Ctrl+L` to open the omnibox for:
3535 - Search (uses default search engine)
3636 - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub)
3737
38+## Floating Pane
39+
40+- Press `Alt+F` to toggle the floating pane.
41+- Press `Ctrl+W` to close the active pane; if floating is active, this fully releases it for a fresh next open.
42+- Some `Alt+<key>` bindings can conflict with default WebKit shortcuts or desktop-level handlers.
43+
44+See [Floating Pane](./reference/floating-pane.md) for profile shortcuts and configuration.
45+
3846 ## Configuration
3947
4048 Edit `~/.config/dumber/config.toml` or use:
@@ -35,6 +35,14 @@ Press `Ctrl+L` to open the omnibox for:
35 - Search (uses default search engine)35 - Search (uses default search engine)
36 - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub)36 - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub)
37 37
38+## Floating Pane
39+
40+- Press `Alt+F` to toggle the floating pane.
41+- Press `Ctrl+W` to close the active pane; if floating is active, this fully releases it for a fresh next open.
42+- Some `Alt+<key>` bindings can conflict with default WebKit shortcuts or desktop-level handlers.
43+
44+See [Floating Pane](./reference/floating-pane.md) for profile shortcuts and configuration.
45+
38 ## Configuration46 ## Configuration
39 47
40 Edit `~/.config/dumber/config.toml` or use:48 Edit `~/.config/dumber/config.toml` or use:
M docs/index.md +1 -0
@@ -33,6 +33,7 @@ A browser designed for Wayland compositors that works like your favorite termina
3333
3434 - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu
3535 - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference
36+- [Floating Pane](./reference/floating-pane.md) - Floating pane behavior, shortcuts, and profiles
3637 - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions
3738
3839 ## Requirements
@@ -33,6 +33,7 @@ A browser designed for Wayland compositors that works like your favorite termina
33 33
34 - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu34 - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu
35 - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference35 - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference
36+- [Floating Pane](./reference/floating-pane.md) - Floating pane behavior, shortcuts, and profiles
36 - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions37 - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions
37 38
38 ## Requirements39 ## Requirements
A docs/reference/floating-pane.md +57 -0
@@ -0,0 +1,57 @@
1+# Floating Pane
2+
3+The floating pane is an overlay workspace pane for quick-access pages like search, chat, email, or docs.
4+
5+## Core Behavior
6+
7+| Action | Default Key | Result |
8+|--------|-------------|--------|
9+| Toggle floating pane | `Alt+F` | Show or hide the floating pane while keeping its current page and state |
10+| Open profile in floating pane | User-defined (for example `Alt+G`) | Open or focus a named floating profile URL |
11+| Close active pane | `Ctrl+W` | Close active pane; if floating is active, fully release floating session/WebView |
12+
13+### Toggle vs Close
14+
15+- `Alt+F` is a visibility toggle. It hides or shows the floating pane without resetting content.
16+- `Ctrl+W` on an active floating pane is a full close. It releases that floating session and its WebView.
17+- After a floating pane is closed with `Ctrl+W`, opening it again starts from a fresh state.
18+
19+## Configuration
20+
21+| Key | Type | Default | Description |
22+|-----|------|---------|-------------|
23+| `workspace.floating_pane.width_pct` | float | `0.82` | Floating pane width as a fraction of workspace width (`(0,1]`) |
24+| `workspace.floating_pane.height_pct` | float | `0.72` | Floating pane height as a fraction of workspace height (`(0,1]`) |
25+| `workspace.floating_pane.profiles.<name>.keys` | `[]string` | - | Shortcut keys for a profile |
26+| `workspace.floating_pane.profiles.<name>.url` | string | - | URL to load for the profile |
27+| `workspace.floating_pane.profiles.<name>.desc` | string | - | Optional description |
28+
29+## Example
30+
31+```toml
32+[workspace.shortcuts.actions.toggle_floating_pane]
33+keys = ["alt+f"]
34+desc = "Toggle floating pane"
35+
36+[workspace.floating_pane]
37+width_pct = 0.82
38+height_pct = 0.72
39+
40+[workspace.floating_pane.profiles.gmail]
41+keys = ["alt+m"]
42+url = "https://mail.google.com"
43+desc = "Open Gmail in floating pane"
44+
45+[workspace.floating_pane.profiles.google]
46+keys = ["alt+g"]
47+url = "https://google.com"
48+desc = "Open Google in floating pane"
49+```
50+
51+## Practical Notes
52+
53+- The default install only binds `Alt+F` for floating pane toggle.
54+- Profile shortcuts are opt-in and empty by default.
55+- Profile shortcuts support multi-modifier combos using `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
56+- Some `Alt+<key>` shortcuts can conflict with default WebKit shortcuts, website handlers, or your desktop environment.
57+- If a shortcut does not fire in Dumber, bind a different key.
@@ -0,0 +1,57 @@
1+# Floating Pane
2+
3+The floating pane is an overlay workspace pane for quick-access pages like search, chat, email, or docs.
4+
5+## Core Behavior
6+
7+| Action | Default Key | Result |
8+|--------|-------------|--------|
9+| Toggle floating pane | `Alt+F` | Show or hide the floating pane while keeping its current page and state |
10+| Open profile in floating pane | User-defined (for example `Alt+G`) | Open or focus a named floating profile URL |
11+| Close active pane | `Ctrl+W` | Close active pane; if floating is active, fully release floating session/WebView |
12+
13+### Toggle vs Close
14+
15+- `Alt+F` is a visibility toggle. It hides or shows the floating pane without resetting content.
16+- `Ctrl+W` on an active floating pane is a full close. It releases that floating session and its WebView.
17+- After a floating pane is closed with `Ctrl+W`, opening it again starts from a fresh state.
18+
19+## Configuration
20+
21+| Key | Type | Default | Description |
22+|-----|------|---------|-------------|
23+| `workspace.floating_pane.width_pct` | float | `0.82` | Floating pane width as a fraction of workspace width (`(0,1]`) |
24+| `workspace.floating_pane.height_pct` | float | `0.72` | Floating pane height as a fraction of workspace height (`(0,1]`) |
25+| `workspace.floating_pane.profiles.<name>.keys` | `[]string` | - | Shortcut keys for a profile |
26+| `workspace.floating_pane.profiles.<name>.url` | string | - | URL to load for the profile |
27+| `workspace.floating_pane.profiles.<name>.desc` | string | - | Optional description |
28+
29+## Example
30+
31+```toml
32+[workspace.shortcuts.actions.toggle_floating_pane]
33+keys = ["alt+f"]
34+desc = "Toggle floating pane"
35+
36+[workspace.floating_pane]
37+width_pct = 0.82
38+height_pct = 0.72
39+
40+[workspace.floating_pane.profiles.gmail]
41+keys = ["alt+m"]
42+url = "https://mail.google.com"
43+desc = "Open Gmail in floating pane"
44+
45+[workspace.floating_pane.profiles.google]
46+keys = ["alt+g"]
47+url = "https://google.com"
48+desc = "Open Google in floating pane"
49+```
50+
51+## Practical Notes
52+
53+- The default install only binds `Alt+F` for floating pane toggle.
54+- Profile shortcuts are opt-in and empty by default.
55+- Profile shortcuts support multi-modifier combos using `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
56+- Some `Alt+<key>` shortcuts can conflict with default WebKit shortcuts, website handlers, or your desktop environment.
57+- If a shortcut does not fire in Dumber, bind a different key.
M docs/reference/index.md +1 -0
@@ -6,6 +6,7 @@
66 - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing)
77 - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu
88 - [Keybindings](./keybindings.md) - All keyboard shortcuts
9+- [Floating Pane](./floating-pane.md) - Floating-pane behavior, profiles, and shortcut semantics
910 - [Troubleshooting](./troubleshooting.md) - Common issues and solutions
1011 - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation
1112
@@ -6,6 +6,7 @@
6 - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing)6 - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing)
7 - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu7 - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu
8 - [Keybindings](./keybindings.md) - All keyboard shortcuts8 - [Keybindings](./keybindings.md) - All keyboard shortcuts
9+- [Floating Pane](./floating-pane.md) - Floating-pane behavior, profiles, and shortcut semantics
9 - [Troubleshooting](./troubleshooting.md) - Common issues and solutions10 - [Troubleshooting](./troubleshooting.md) - Common issues and solutions
10 - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation11 - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation
11 12
M docs/reference/keybindings.md +9 -4
@@ -80,7 +80,7 @@ These work outside modal modes:
8080 | Action | Keys |
8181 |--------|------|
8282 | Toggle floating pane | `Alt+F` |
83-| Close pane | `Ctrl+W` |
83+| Close pane (or release floating pane) | `Ctrl+W` |
8484 | Next tab | `Ctrl+Tab` |
8585 | Previous tab | `Ctrl+Shift+Tab` |
8686 | Consume/expel left | `Alt+[` |
@@ -88,12 +88,17 @@ These work outside modal modes:
8888 | Consume/expel up | `Alt+{` |
8989 | Consume/expel down | `Alt+}` |
9090
91-`Alt+F` is the only floating-pane shortcut enabled by default.
92-Any URL-opening shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`.
91+- `Alt+F` is the only floating-pane shortcut enabled by default.
92+- `Alt+F` toggles floating visibility and keeps floating pane state intact.
93+- `Ctrl+W` closes the active pane; when the floating pane is active, it fully releases that floating session.
94+- Any URL shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`.
95+- Floating profile shortcuts support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
9396
94-Warning: some `Alt+<key>` combinations may already be handled by WebKit, websites, or your desktop environment.
97+Warning: some `Alt+<key>` combinations may conflict with default WebKit shortcuts, website handlers, or your desktop environment.
9598 If a shortcut does not trigger in Dumber, choose a different keybinding.
9699
100+For details, see [Floating Pane](./floating-pane.md).
101+
97102 ## Customization
98103
99104 All keybindings can be customized in `~/.config/dumber/config.toml`:
@@ -80,7 +80,7 @@ These work outside modal modes:
80 | Action | Keys |80 | Action | Keys |
81 |--------|------|81 |--------|------|
82 | Toggle floating pane | `Alt+F` |82 | Toggle floating pane | `Alt+F` |
83-| Close pane | `Ctrl+W` |83+| Close pane (or release floating pane) | `Ctrl+W` |
84 | Next tab | `Ctrl+Tab` |84 | Next tab | `Ctrl+Tab` |
85 | Previous tab | `Ctrl+Shift+Tab` |85 | Previous tab | `Ctrl+Shift+Tab` |
86 | Consume/expel left | `Alt+[` |86 | Consume/expel left | `Alt+[` |
@@ -88,12 +88,17 @@ These work outside modal modes:
88 | Consume/expel up | `Alt+{` |88 | Consume/expel up | `Alt+{` |
89 | Consume/expel down | `Alt+}` |89 | Consume/expel down | `Alt+}` |
90 90
91-`Alt+F` is the only floating-pane shortcut enabled by default.91+- `Alt+F` is the only floating-pane shortcut enabled by default.
92-Any URL-opening shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`.92+- `Alt+F` toggles floating visibility and keeps floating pane state intact.
93+- `Ctrl+W` closes the active pane; when the floating pane is active, it fully releases that floating session.
94+- Any URL shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`.
95+- Floating profile shortcuts support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`).
93 96
94-Warning: some `Alt+<key>` combinations may already be handled by WebKit, websites, or your desktop environment.97+Warning: some `Alt+<key>` combinations may conflict with default WebKit shortcuts, website handlers, or your desktop environment.
95 If a shortcut does not trigger in Dumber, choose a different keybinding.98 If a shortcut does not trigger in Dumber, choose a different keybinding.
96 99
100+For details, see [Floating Pane](./floating-pane.md).
101+
97 ## Customization102 ## Customization
98 103
99 All keybindings can be customized in `~/.config/dumber/config.toml`:104 All keybindings can be customized in `~/.config/dumber/config.toml`:
M internal/ui/input/floating_shortcuts_test.go +30 -0
@@ -162,3 +162,33 @@ func TestShortcutSet_FloatingProfilesWithSameURLGetDistinctSessionIDs(t *testing
162162 assert.Equal(t, "https://mail.google.com", personalTarget.URL)
163163 assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID)
164164 }
165+
166+func TestShortcutSet_FloatingProfiles_SupportModifierCombos(t *testing.T) {
167+ cfg := config.DefaultConfig()
168+ cfg.Workspace.FloatingPane.Profiles = map[string]config.FloatingPaneProfile{
169+ "mail": {
170+ Keys: []string{"ctrl+alt+m"},
171+ URL: "https://mail.example.com",
172+ },
173+ "search": {
174+ Keys: []string{"ctrl+shift+y"},
175+ URL: "https://search.example.com",
176+ },
177+ }
178+
179+ set := NewShortcutSet(context.Background(), cfg)
180+
181+ mailAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_m), Modifiers: ModCtrl | ModAlt}, ModeNormal)
182+ require.True(t, ok)
183+ mailTarget, ok := ParseFloatingProfileTarget(mailAction)
184+ require.True(t, ok)
185+ assert.Equal(t, "mail", mailTarget.SessionID)
186+ assert.Equal(t, "https://mail.example.com", mailTarget.URL)
187+
188+ searchAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_y), Modifiers: ModCtrl | ModShift}, ModeNormal)
189+ require.True(t, ok)
190+ searchTarget, ok := ParseFloatingProfileTarget(searchAction)
191+ require.True(t, ok)
192+ assert.Equal(t, "search", searchTarget.SessionID)
193+ assert.Equal(t, "https://search.example.com", searchTarget.URL)
194+}
@@ -162,3 +162,33 @@ func TestShortcutSet_FloatingProfilesWithSameURLGetDistinctSessionIDs(t *testing
162 assert.Equal(t, "https://mail.google.com", personalTarget.URL)162 assert.Equal(t, "https://mail.google.com", personalTarget.URL)
163 assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID)163 assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID)
164 }164 }
165+
166+func TestShortcutSet_FloatingProfiles_SupportModifierCombos(t *testing.T) {
167+ cfg := config.DefaultConfig()
168+ cfg.Workspace.FloatingPane.Profiles = map[string]config.FloatingPaneProfile{
169+ "mail": {
170+ Keys: []string{"ctrl+alt+m"},
171+ URL: "https://mail.example.com",
172+ },
173+ "search": {
174+ Keys: []string{"ctrl+shift+y"},
175+ URL: "https://search.example.com",
176+ },
177+ }
178+
179+ set := NewShortcutSet(context.Background(), cfg)
180+
181+ mailAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_m), Modifiers: ModCtrl | ModAlt}, ModeNormal)
182+ require.True(t, ok)
183+ mailTarget, ok := ParseFloatingProfileTarget(mailAction)
184+ require.True(t, ok)
185+ assert.Equal(t, "mail", mailTarget.SessionID)
186+ assert.Equal(t, "https://mail.example.com", mailTarget.URL)
187+
188+ searchAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_y), Modifiers: ModCtrl | ModShift}, ModeNormal)
189+ require.True(t, ok)
190+ searchTarget, ok := ParseFloatingProfileTarget(searchAction)
191+ require.True(t, ok)
192+ assert.Equal(t, "search", searchTarget.SessionID)
193+ assert.Equal(t, "https://search.example.com", searchTarget.URL)
194+}

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