v0.20.0 c741a39

schema.go RawHistoryFolder

1package config
2
3// Config represents the complete configuration for dumber.
4type Config struct {
5	Database        DatabaseConfig            `mapstructure:"database" yaml:"database" toml:"database"`
6	History         HistoryConfig             `mapstructure:"history" yaml:"history" toml:"history"`
7	SearchShortcuts map[string]SearchShortcut `mapstructure:"search_shortcuts" yaml:"search_shortcuts" toml:"search_shortcuts"`
8	// DefaultSearchEngine is the URL template for the default search engine (must contain %s placeholder)
9	DefaultSearchEngine string           `mapstructure:"default_search_engine" yaml:"default_search_engine" toml:"default_search_engine"`
10	Dmenu               DmenuConfig      `mapstructure:"dmenu" yaml:"dmenu" toml:"dmenu"`
11	Logging             LoggingConfig    `mapstructure:"logging" yaml:"logging" toml:"logging"`
12	Appearance          AppearanceConfig `mapstructure:"appearance" yaml:"appearance" toml:"appearance"`
13	Debug               DebugConfig      `mapstructure:"debug" yaml:"debug" toml:"debug"`
14	// DefaultWebpageZoom sets the default zoom level for pages without saved zoom settings (1.0 = 100%, 1.2 = 120%)
15	DefaultWebpageZoom float64 `mapstructure:"default_webpage_zoom" yaml:"default_webpage_zoom" toml:"default_webpage_zoom"`
16	// DefaultUIScale sets the default UI scale for GTK widgets (1.0 = 100%, 2.0 = 200%)
17	DefaultUIScale float64 `mapstructure:"default_ui_scale" yaml:"default_ui_scale" toml:"default_ui_scale"`
18	// Workspace defines workspace, pane, and tab handling behavior.
19	Workspace WorkspaceConfig `mapstructure:"workspace" yaml:"workspace" toml:"workspace"`
20	// ContentFiltering controls ad blocking and content filtering
21	ContentFiltering ContentFilteringConfig `mapstructure:"content_filtering" yaml:"content_filtering" toml:"content_filtering"`
22	// Omnibox controls the omnibox behavior (initial history display)
23	Omnibox OmniboxConfig `mapstructure:"omnibox" yaml:"omnibox" toml:"omnibox"`
24	// Rendering controls WebKit, GTK and compositor behavior.
25	Rendering RenderingConfig `mapstructure:"rendering" yaml:"rendering" toml:"rendering"`
26	// Media controls video playback and hardware acceleration
27	Media MediaConfig `mapstructure:"media" yaml:"media" toml:"media"`
28	// Runtime configures optional runtime overrides (e.g., /opt prefix for WebKitGTK/GTK).
29	Runtime RuntimeConfig `mapstructure:"runtime" yaml:"runtime" toml:"runtime"`
30}
31
32// RenderingMode selects GPU vs CPU rendering.
33type RenderingMode string
34
35const (
36	RenderingModeAuto RenderingMode = "auto"
37	RenderingModeGPU  RenderingMode = "gpu"
38	RenderingModeCPU  RenderingMode = "cpu"
39)
40
41// GSKRendererMode controls the GTK Scene Kit renderer selection.
42type GSKRendererMode string
43
44const (
45	GSKRendererAuto   GSKRendererMode = "auto"
46	GSKRendererOpenGL GSKRendererMode = "opengl"
47	GSKRendererVulkan GSKRendererMode = "vulkan"
48	GSKRendererCairo  GSKRendererMode = "cairo"
49)
50
51// RenderingConfig controls WebKit and GTK/GSK rendering behavior.
52type RenderingConfig struct {
53	// Mode controls GPU/CPU rendering selection for WebKit (auto, gpu, cpu).
54	Mode RenderingMode `mapstructure:"mode" yaml:"mode" toml:"mode"`
55
56	// DisableDMABufRenderer disables DMA-BUF accelerated renderer.
57	// Env: WEBKIT_DISABLE_DMABUF_RENDERER
58	DisableDMABufRenderer bool `mapstructure:"disable_dmabuf_renderer" yaml:"disable_dmabuf_renderer" toml:"disable_dmabuf_renderer"`
59
60	// ForceCompositingMode forces accelerated compositing.
61	// Env: WEBKIT_FORCE_COMPOSITING_MODE
62	ForceCompositingMode bool `mapstructure:"force_compositing_mode" yaml:"force_compositing_mode" toml:"force_compositing_mode"`
63
64	// DisableCompositingMode disables accelerated compositing.
65	// Env: WEBKIT_DISABLE_COMPOSITING_MODE
66	DisableCompositingMode bool `mapstructure:"disable_compositing_mode" yaml:"disable_compositing_mode" toml:"disable_compositing_mode"`
67
68	// GSKRenderer overrides GTK Scene Kit renderer selection.
69	// Env: GSK_RENDERER
70	GSKRenderer GSKRendererMode `mapstructure:"gsk_renderer" yaml:"gsk_renderer" toml:"gsk_renderer"`
71
72	// DisableMipmaps disables mipmap generation.
73	// Env: GSK_GPU_DISABLE=mipmap
74	DisableMipmaps bool `mapstructure:"disable_mipmaps" yaml:"disable_mipmaps" toml:"disable_mipmaps"`
75
76	// PreferGL forces OpenGL over GLES.
77	// Env: GDK_DEBUG=gl-prefer-gl
78	PreferGL bool `mapstructure:"prefer_gl" yaml:"prefer_gl" toml:"prefer_gl"`
79
80	// DrawCompositingIndicators shows compositing layer borders and repaint counters.
81	DrawCompositingIndicators bool `mapstructure:"draw_compositing_indicators" yaml:"draw_compositing_indicators" toml:"draw_compositing_indicators"` //nolint:lll // struct tags exceed lll limit
82
83	// ShowFPS displays WebKit FPS counter.
84	// Env: WEBKIT_SHOW_FPS
85	ShowFPS bool `mapstructure:"show_fps" yaml:"show_fps" toml:"show_fps"`
86
87	// SampleMemory enables memory sampling.
88	// Env: WEBKIT_SAMPLE_MEMORY
89	SampleMemory bool `mapstructure:"sample_memory" yaml:"sample_memory" toml:"sample_memory"`
90
91	// DebugFrames enables frame timing debug output.
92	// Env: GDK_DEBUG=frames
93	DebugFrames bool `mapstructure:"debug_frames" yaml:"debug_frames" toml:"debug_frames"`
94}
95
96// HardwareDecodingMode controls video hardware acceleration.
97type HardwareDecodingMode string
98
99const (
100	// HardwareDecodingAuto lets GStreamer choose (hw preferred, sw fallback)
101	HardwareDecodingAuto HardwareDecodingMode = "auto"
102	// HardwareDecodingForce requires hardware decoding (fails if unavailable)
103	HardwareDecodingForce HardwareDecodingMode = "force"
104	// HardwareDecodingDisable uses software decoding only
105	HardwareDecodingDisable HardwareDecodingMode = "disable"
106)
107
108// GLRenderingMode controls OpenGL API selection for video rendering.
109type GLRenderingMode string
110
111const (
112	// GLRenderingModeAuto lets GStreamer choose the best GL API
113	GLRenderingModeAuto GLRenderingMode = "auto"
114	// GLRenderingModeGLES2 forces GLES2 (better for some mobile/embedded GPUs)
115	GLRenderingModeGLES2 GLRenderingMode = "gles2"
116	// GLRenderingModeGL3 forces OpenGL 3.x desktop
117	GLRenderingModeGL3 GLRenderingMode = "gl3"
118	// GLRenderingModeNone disables GL-based rendering
119	GLRenderingModeNone GLRenderingMode = "none"
120)
121
122// ThemeDefault is the default theme setting (follows system).
123const ThemeDefault = "default"
124
125const (
126	// ThemePreferDark explicitly selects dark theme.
127	ThemePreferDark = "prefer-dark"
128	// ThemePreferLight explicitly selects light theme.
129	ThemePreferLight = "prefer-light"
130)
131
132// MediaConfig holds video playback and hardware acceleration preferences.
133type MediaConfig struct {
134	// HardwareDecodingMode controls hardware vs software video decoding
135	// Values: "auto" (default), "force", "disable"
136	HardwareDecodingMode HardwareDecodingMode `mapstructure:"hardware_decoding" yaml:"hardware_decoding" toml:"hardware_decoding"`
137	// PreferAV1 prioritizes AV1 codec (most efficient) when available
138	PreferAV1 bool `mapstructure:"prefer_av1" yaml:"prefer_av1" toml:"prefer_av1"`
139	// ShowDiagnosticsOnStartup shows media capability warnings at startup
140	ShowDiagnosticsOnStartup bool `mapstructure:"show_diagnostics" yaml:"show_diagnostics" toml:"show_diagnostics"`
141	// ForceVSync forces vertical sync for video playback (may help with tearing)
142	ForceVSync bool `mapstructure:"force_vsync" yaml:"force_vsync" toml:"force_vsync"`
143	// GLRenderingMode controls OpenGL API selection for video rendering
144	// Values: "auto" (default), "gles2", "gl3", "none"
145	GLRenderingMode GLRenderingMode `mapstructure:"gl_rendering_mode" yaml:"gl_rendering_mode" toml:"gl_rendering_mode"`
146	// GStreamerDebugLevel sets GStreamer debug verbosity (0=off, 1-5=increasing verbosity)
147	GStreamerDebugLevel int `mapstructure:"gstreamer_debug_level" yaml:"gstreamer_debug_level" toml:"gstreamer_debug_level"`
148	// VideoBufferSizeMB sets the video buffer size in megabytes for smoother streaming
149	// Higher values reduce rebuffering but use more memory. Default: 64 MB
150	VideoBufferSizeMB int `mapstructure:"video_buffer_size_mb" yaml:"video_buffer_size_mb" toml:"video_buffer_size_mb"`
151	// QueueBufferTimeSec sets the queue buffer time in seconds
152	// Higher values allow more prebuffering for bursty streams. Default: 20 seconds
153	QueueBufferTimeSec int `mapstructure:"queue_buffer_time_sec" yaml:"queue_buffer_time_sec" toml:"queue_buffer_time_sec"`
154}
155
156// RuntimeConfig holds optional runtime overrides.
157type RuntimeConfig struct {
158	// Prefix points to a custom runtime prefix (e.g., /opt/webkitgtk).
159	// This is used to influence pkg-config lookup and dynamic library loading.
160	Prefix string `mapstructure:"prefix" yaml:"prefix" toml:"prefix"`
161}
162
163// DatabaseConfig holds database-related configuration.
164type DatabaseConfig struct {
165	Path string `mapstructure:"path" yaml:"path" toml:"path"`
166}
167
168// HistoryConfig holds history-related configuration.
169type HistoryConfig struct {
170	MaxEntries          int `mapstructure:"max_entries" yaml:"max_entries" toml:"max_entries"`
171	RetentionPeriodDays int `mapstructure:"retention_period_days" yaml:"retention_period_days" toml:"retention_period_days"`
172	CleanupIntervalDays int `mapstructure:"cleanup_interval_days" yaml:"cleanup_interval_days" toml:"cleanup_interval_days"`
173}
174
175// SearchShortcut represents a search shortcut configuration.
176type SearchShortcut struct {
177	URL         string `mapstructure:"url" toml:"url" yaml:"url" json:"url"`
178	Description string `mapstructure:"description" toml:"description" yaml:"description" json:"description"`
179}
180
181// ShortcutURLs returns a simple map of shortcut keys to URL templates.
182// This is useful for passing to url.BuildSearchURL.
183func (c *Config) ShortcutURLs() map[string]string {
184	result := make(map[string]string, len(c.SearchShortcuts))
185	for key, shortcut := range c.SearchShortcuts {
186		result[key] = shortcut.URL
187	}
188	return result
189}
190
191// DmenuConfig holds dmenu/rofi integration configuration.
192type DmenuConfig struct {
193	MaxHistoryItems  int    `mapstructure:"max_history_items" yaml:"max_history_items" toml:"max_history_items"`
194	ShowVisitCount   bool   `mapstructure:"show_visit_count" yaml:"show_visit_count" toml:"show_visit_count"`
195	ShowLastVisited  bool   `mapstructure:"show_last_visited" yaml:"show_last_visited" toml:"show_last_visited"`
196	HistoryPrefix    string `mapstructure:"history_prefix" yaml:"history_prefix" toml:"history_prefix"`
197	ShortcutPrefix   string `mapstructure:"shortcut_prefix" yaml:"shortcut_prefix" toml:"shortcut_prefix"`
198	URLPrefix        string `mapstructure:"url_prefix" yaml:"url_prefix" toml:"url_prefix"`
199	DateFormat       string `mapstructure:"date_format" yaml:"date_format" toml:"date_format"`
200	SortByVisitCount bool   `mapstructure:"sort_by_visit_count" yaml:"sort_by_visit_count" toml:"sort_by_visit_count"`
201}
202
203// LoggingConfig holds logging configuration.
204type LoggingConfig struct {
205	Level  string `mapstructure:"level" yaml:"level" toml:"level"`
206	Format string `mapstructure:"format" yaml:"format" toml:"format"`
207	MaxAge int    `mapstructure:"max_age" yaml:"max_age" toml:"max_age"`
208
209	// File output configuration
210	LogDir        string `mapstructure:"log_dir" yaml:"log_dir" toml:"log_dir"`
211	EnableFileLog bool   `mapstructure:"enable_file_log" yaml:"enable_file_log" toml:"enable_file_log"`
212
213	// Capture browser console to logs
214	CaptureConsole bool `mapstructure:"capture_console" yaml:"capture_console" toml:"capture_console" json:"capture_console"`
215}
216
217// AppearanceConfig holds UI/rendering preferences.
218type AppearanceConfig struct {
219	// Default fonts for pages that do not specify fonts.
220	SansFont      string `mapstructure:"sans_font" yaml:"sans_font" toml:"sans_font"`
221	SerifFont     string `mapstructure:"serif_font" yaml:"serif_font" toml:"serif_font"`
222	MonospaceFont string `mapstructure:"monospace_font" yaml:"monospace_font" toml:"monospace_font"`
223	// Default font size in CSS pixels (approx).
224	DefaultFontSize int          `mapstructure:"default_font_size" yaml:"default_font_size" toml:"default_font_size"`
225	LightPalette    ColorPalette `mapstructure:"light_palette" yaml:"light_palette" toml:"light_palette"`
226	DarkPalette     ColorPalette `mapstructure:"dark_palette" yaml:"dark_palette" toml:"dark_palette"`
227	// ColorScheme controls the initial theme preference: "prefer-dark", "prefer-light", or "default" (follows system)
228	ColorScheme string `mapstructure:"color_scheme" yaml:"color_scheme" toml:"color_scheme"`
229}
230
231// ColorPalette contains semantic color tokens for light/dark themes.
232type ColorPalette struct {
233	Background     string `mapstructure:"background" yaml:"background" toml:"background" json:"background"`
234	Surface        string `mapstructure:"surface" yaml:"surface" toml:"surface" json:"surface"`
235	SurfaceVariant string `mapstructure:"surface_variant" yaml:"surface_variant" toml:"surface_variant" json:"surface_variant"`
236	Text           string `mapstructure:"text" yaml:"text" toml:"text" json:"text"`
237	Muted          string `mapstructure:"muted" yaml:"muted" toml:"muted" json:"muted"`
238	Accent         string `mapstructure:"accent" yaml:"accent" toml:"accent" json:"accent"`
239	Border         string `mapstructure:"border" yaml:"border" toml:"border" json:"border"`
240}
241
242// ContentFilteringConfig holds content filtering and ad blocking preferences
243type ContentFilteringConfig struct {
244	// Enabled controls whether ad blocking is active (default: true)
245	Enabled bool `mapstructure:"enabled" yaml:"enabled" toml:"enabled"`
246	// AutoUpdate controls whether filters are automatically updated (default: true)
247	AutoUpdate bool `mapstructure:"auto_update" yaml:"auto_update" toml:"auto_update"`
248	// Note: Filters are downloaded from bnema/ublock-webkit-filters GitHub releases
249	// Note: Whitelist is managed via database (content_whitelist table)
250}
251
252// OmniboxConfig holds omnibox behavior preferences
253type OmniboxConfig struct {
254	// InitialBehavior controls what to show when omnibox opens with empty input
255	// Values: "recent" (recent visits), "most_visited" (most visited sites), "none" (nothing)
256	InitialBehavior string `mapstructure:"initial_behavior" yaml:"initial_behavior" toml:"initial_behavior"`
257}
258
259// DebugConfig holds debug and troubleshooting options
260type DebugConfig struct {
261	// Enable browser developer tools (F12, Inspect Element in context menu)
262	EnableDevTools bool `mapstructure:"enable_devtools" yaml:"enable_devtools" toml:"enable_devtools"`
263}
264
265// WorkspaceConfig captures layout, pane, and tab behavior preferences.
266type WorkspaceConfig struct {
267	// PaneMode defines modal pane behavior and bindings.
268	PaneMode PaneModeConfig `mapstructure:"pane_mode" yaml:"pane_mode" toml:"pane_mode" json:"pane_mode"`
269	// TabMode defines modal tab behavior and bindings (Alt+T).
270	TabMode TabModeConfig `mapstructure:"tab_mode" yaml:"tab_mode" toml:"tab_mode" json:"tab_mode"`
271	// Shortcuts holds global (non-modal) keyboard shortcuts.
272	Shortcuts GlobalShortcutsConfig `mapstructure:"shortcuts" yaml:"shortcuts" toml:"shortcuts" json:"shortcuts"`
273	// TabBarPosition determines tab bar placement: "top" or "bottom".
274	TabBarPosition string `mapstructure:"tab_bar_position" yaml:"tab_bar_position" toml:"tab_bar_position" json:"tab_bar_position"`
275	// HideTabBarWhenSingleTab hides the tab bar when only one tab exists.
276	HideTabBarWhenSingleTab bool `mapstructure:"hide_tab_bar_when_single_tab" yaml:"hide_tab_bar_when_single_tab" toml:"hide_tab_bar_when_single_tab" json:"hide_tab_bar_when_single_tab"` //nolint:lll // struct tags must stay on one line
277	// Popups configures default popup placement rules.
278	Popups PopupBehaviorConfig `mapstructure:"popups" yaml:"popups" toml:"popups" json:"popups"`
279	// Styling configures workspace visual appearance.
280	Styling WorkspaceStylingConfig `mapstructure:"styling" yaml:"styling" toml:"styling" json:"styling"`
281}
282
283// PaneModeConfig defines modal behavior for pane management.
284type PaneModeConfig struct {
285	ActivationShortcut  string              `mapstructure:"activation_shortcut" yaml:"activation_shortcut" toml:"activation_shortcut" json:"activation_shortcut"` //nolint:lll // struct tags must stay on one line
286	TimeoutMilliseconds int                 `mapstructure:"timeout_ms" yaml:"timeout_ms" toml:"timeout_ms" json:"timeout_ms"`
287	Actions             map[string][]string `mapstructure:"actions" yaml:"actions" toml:"actions" json:"actions"`
288}
289
290// GetKeyBindings returns an inverted map for O(1) key→action lookup.
291// This is built from the action→keys structure in the config.
292func (p *PaneModeConfig) GetKeyBindings() map[string]string {
293	keyToAction := make(map[string]string)
294	for action, keys := range p.Actions {
295		for _, key := range keys {
296			keyToAction[key] = action
297		}
298	}
299	return keyToAction
300}
301
302// TabModeConfig defines modal behavior for tab management (Zellij-style).
303type TabModeConfig struct {
304	ActivationShortcut  string              `mapstructure:"activation_shortcut" yaml:"activation_shortcut" toml:"activation_shortcut" json:"activation_shortcut"` //nolint:lll // struct tags must stay on one line
305	TimeoutMilliseconds int                 `mapstructure:"timeout_ms" yaml:"timeout_ms" toml:"timeout_ms" json:"timeout_ms"`
306	Actions             map[string][]string `mapstructure:"actions" yaml:"actions" toml:"actions" json:"actions"`
307}
308
309// GetKeyBindings returns an inverted map for O(1) key→action lookup.
310// This is built from the action→keys structure in the config.
311func (t *TabModeConfig) GetKeyBindings() map[string]string {
312	keyToAction := make(map[string]string)
313	for action, keys := range t.Actions {
314		for _, key := range keys {
315			keyToAction[key] = action
316		}
317	}
318	return keyToAction
319}
320
321// GlobalShortcutsConfig defines global shortcuts (always active, not modal).
322type GlobalShortcutsConfig struct {
323	ClosePane   string `mapstructure:"close_pane" yaml:"close_pane" toml:"close_pane" json:"close_pane"`
324	NextTab     string `mapstructure:"next_tab" yaml:"next_tab" toml:"next_tab" json:"next_tab"`
325	PreviousTab string `mapstructure:"previous_tab" yaml:"previous_tab" toml:"previous_tab" json:"previous_tab"`
326}
327
328// PopupBehavior defines how popup windows should be opened
329type PopupBehavior string
330
331const (
332	// PopupBehaviorSplit opens popups in a split pane (default)
333	PopupBehaviorSplit PopupBehavior = "split"
334	// PopupBehaviorStacked opens popups in a stacked pane
335	PopupBehaviorStacked PopupBehavior = "stacked"
336	// PopupBehaviorTabbed opens popups as a new tab
337	PopupBehaviorTabbed PopupBehavior = "tabbed"
338	// PopupBehaviorWindowed opens popups in a new workspace window
339	PopupBehaviorWindowed PopupBehavior = "windowed"
340)
341
342// PopupBehaviorConfig defines handling for popup windows.
343type PopupBehaviorConfig struct {
344	// Behavior determines how popups are opened (split/stacked/tabbed/windowed)
345	Behavior PopupBehavior `mapstructure:"behavior" yaml:"behavior" toml:"behavior" json:"behavior"`
346
347	// Placement specifies direction for split behavior ("right", "left", "top", "bottom")
348	// Only used when Behavior is "split"
349	Placement string `mapstructure:"placement" yaml:"placement" toml:"placement" json:"placement"`
350
351	// OpenInNewPane controls whether popups are opened in workspace or blocked
352	OpenInNewPane bool `mapstructure:"open_in_new_pane" yaml:"open_in_new_pane" toml:"open_in_new_pane" json:"open_in_new_pane"`
353
354	// FollowPaneContext determines if popup placement follows parent pane context
355	FollowPaneContext bool `mapstructure:"follow_pane_context" yaml:"follow_pane_context" toml:"follow_pane_context" json:"follow_pane_context"` //nolint:lll // struct tags must stay on one line
356
357	// BlankTargetBehavior determines how target="_blank" links are opened
358	// Accepted values: "split", "stacked" (default), "tabbed"
359	// This is separate from Behavior which controls JavaScript popups
360	BlankTargetBehavior string `mapstructure:"blank_target_behavior" yaml:"blank_target_behavior" toml:"blank_target_behavior" json:"blank_target_behavior"` //nolint:lll // struct tags must stay on one line
361
362	// EnableSmartDetection uses WebKitWindowProperties to detect popup vs tab intents
363	EnableSmartDetection bool `mapstructure:"enable_smart_detection" yaml:"enable_smart_detection" toml:"enable_smart_detection" json:"enable_smart_detection"` //nolint:lll // struct tags must stay on one line
364
365	// OAuthAutoClose enables auto-closing OAuth popups after successful auth redirects
366	OAuthAutoClose bool `mapstructure:"oauth_auto_close" yaml:"oauth_auto_close" toml:"oauth_auto_close" json:"oauth_auto_close"`
367}
368
369// WorkspaceStylingConfig defines visual styling for workspace panes.
370type WorkspaceStylingConfig struct {
371	// BorderWidth in pixels for active pane borders (overlay)
372	BorderWidth int `mapstructure:"border_width" yaml:"border_width" toml:"border_width" json:"border_width"`
373	// BorderColor for focused panes (CSS color value or theme variable)
374	BorderColor string `mapstructure:"border_color" yaml:"border_color" toml:"border_color" json:"border_color"`
375
376	// PaneModeBorderWidth in pixels for pane mode indicator border (Ctrl+P N overlay)
377	PaneModeBorderWidth int `mapstructure:"pane_mode_border_width" yaml:"pane_mode_border_width" toml:"pane_mode_border_width" json:"pane_mode_border_width"` //nolint:lll // struct tags must stay on one line
378	// PaneModeBorderColor for the pane mode indicator border (CSS color value or theme variable)
379	// Defaults to "#4A90E2" (blue) if not set
380	PaneModeBorderColor string `mapstructure:"pane_mode_border_color" yaml:"pane_mode_border_color" toml:"pane_mode_border_color" json:"pane_mode_border_color"` //nolint:lll // struct tags must stay on one line
381
382	// TabModeBorderWidth in pixels for tab mode indicator border (Ctrl+P T overlay)
383	TabModeBorderWidth int `mapstructure:"tab_mode_border_width" yaml:"tab_mode_border_width" toml:"tab_mode_border_width" json:"tab_mode_border_width"` //nolint:lll // struct tags must stay on one line
384	// TabModeBorderColor for the tab mode indicator border (CSS color value or theme variable)
385	// Defaults to "#FFA500" (orange) if not set - MUST be different from PaneModeBorderColor
386	TabModeBorderColor string `mapstructure:"tab_mode_border_color" yaml:"tab_mode_border_color" toml:"tab_mode_border_color" json:"tab_mode_border_color"` //nolint:lll // struct tags must stay on one line
387
388	// TransitionDuration in milliseconds for border animations
389	TransitionDuration int `mapstructure:"transition_duration" yaml:"transition_duration" toml:"transition_duration" json:"transition_duration"` //nolint:lll // struct tags must stay on one line
390}

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