detached 0e75391

feat: add missing keys to config schema provider

commit
0e75391be0605ae35ecd7b4f6138e51cc8531a14
author
brice · · 2026-01-06 13:05 UTC
parent
f1d0f96
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +139 -0
M internal/infrastructure/config/schema_provider.go +139 -0
@@ -14,6 +14,7 @@ const (
1414 SectionWorkspace = "Workspace"
1515 SectionSession = "Session"
1616 SectionOmnibox = "Omnibox"
17+ SectionClipboard = "Clipboard"
1718 SectionContentFiltering = "Content Filtering"
1819 SectionRendering = "Rendering"
1920 SectionMedia = "Media"
@@ -64,6 +65,9 @@ func (p *SchemaProvider) GetSchema() []entity.ConfigKeyInfo {
6465 // Omnibox section
6566 keys = append(keys, p.getOmniboxKeys(defaults)...)
6667
68+ // Clipboard section
69+ keys = append(keys, p.getClipboardKeys(defaults)...)
70+
6771 // Content Filtering section
6872 keys = append(keys, p.getContentFilteringKeys(defaults)...)
6973
@@ -459,6 +463,34 @@ func (*SchemaProvider) getWorkspaceKeys(defaults *Config) []entity.ConfigKeyInfo
459463 Description: "Global shortcut to switch to previous tab",
460464 Section: SectionWorkspace,
461465 },
466+ {
467+ Key: "workspace.shortcuts.consume_or_expel_left",
468+ Type: "string",
469+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelLeft,
470+ Description: "Consume into left sibling stack or expel left (alpha)",
471+ Section: SectionWorkspace,
472+ },
473+ {
474+ Key: "workspace.shortcuts.consume_or_expel_right",
475+ Type: "string",
476+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelRight,
477+ Description: "Consume into right sibling stack or expel right (alpha)",
478+ Section: SectionWorkspace,
479+ },
480+ {
481+ Key: "workspace.shortcuts.consume_or_expel_up",
482+ Type: "string",
483+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelUp,
484+ Description: "Consume into upper sibling stack or expel up (alpha)",
485+ Section: SectionWorkspace,
486+ },
487+ {
488+ Key: "workspace.shortcuts.consume_or_expel_down",
489+ Type: "string",
490+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelDown,
491+ Description: "Consume into lower sibling stack or expel down (alpha)",
492+ Section: SectionWorkspace,
493+ },
462494 // Popups
463495 {
464496 Key: "workspace.popups.behavior",
@@ -679,6 +711,18 @@ func (*SchemaProvider) getContentFilteringKeys(defaults *Config) []entity.Config
679711 }
680712 }
681713
714+func (*SchemaProvider) getClipboardKeys(defaults *Config) []entity.ConfigKeyInfo {
715+ return []entity.ConfigKeyInfo{
716+ {
717+ Key: "clipboard.auto_copy_on_selection",
718+ Type: "bool",
719+ Default: fmt.Sprintf("%t", defaults.Clipboard.AutoCopyOnSelection),
720+ Description: "Auto-copy selected text to clipboard (zellij-style)",
721+ Section: SectionClipboard,
722+ },
723+ }
724+}
725+
682726 func (*SchemaProvider) getRenderingKeys(defaults *Config) []entity.ConfigKeyInfo {
683727 return []entity.ConfigKeyInfo{
684728 {
@@ -853,6 +897,14 @@ func (*SchemaProvider) getDebugKeys(defaults *Config) []entity.ConfigKeyInfo {
853897
854898 func (*SchemaProvider) getPerformanceKeys(defaults *Config) []entity.ConfigKeyInfo {
855899 return []entity.ConfigKeyInfo{
900+ {
901+ Key: "performance.profile",
902+ Type: "string",
903+ Default: string(defaults.Performance.Profile),
904+ Description: "Performance profile preset (custom enables manual tuning)",
905+ Values: []string{"default", "lite", "max", "custom"},
906+ Section: SectionPerformance,
907+ },
856908 {
857909 Key: "performance.zoom_cache_size",
858910 Type: "int",
@@ -869,6 +921,93 @@ func (*SchemaProvider) getPerformanceKeys(defaults *Config) []entity.ConfigKeyIn
869921 Range: ">=0",
870922 Section: SectionPerformance,
871923 },
924+ {
925+ Key: "performance.skia_cpu_painting_threads",
926+ Type: "int",
927+ Default: fmt.Sprintf("%d", defaults.Performance.SkiaCPUPaintingThreads),
928+ Description: "Skia CPU rendering threads (0=unset, custom profile only)",
929+ Range: ">=0",
930+ Section: SectionPerformance,
931+ },
932+ {
933+ Key: "performance.skia_gpu_painting_threads",
934+ Type: "int",
935+ Default: fmt.Sprintf("%d", defaults.Performance.SkiaGPUPaintingThreads),
936+ Description: "Skia GPU rendering threads (-1=unset, 0=disable, custom profile only)",
937+ Range: ">=-1",
938+ Section: SectionPerformance,
939+ },
940+ {
941+ Key: "performance.skia_enable_cpu_rendering",
942+ Type: "bool",
943+ Default: fmt.Sprintf("%t", defaults.Performance.SkiaEnableCPURendering),
944+ Description: "Force CPU rendering (custom profile only)",
945+ Section: SectionPerformance,
946+ },
947+ {
948+ Key: "performance.web_process_memory_limit_mb",
949+ Type: "int",
950+ Default: fmt.Sprintf("%d", defaults.Performance.WebProcessMemoryLimitMB),
951+ Description: "Web process memory limit in MB (0=unset, custom profile only)",
952+ Range: ">=0",
953+ Section: SectionPerformance,
954+ },
955+ {
956+ Key: "performance.web_process_memory_poll_interval_sec",
957+ Type: "float64",
958+ Default: fmt.Sprintf("%.1f", defaults.Performance.WebProcessMemoryPollIntervalSec),
959+ Description: "Memory check interval in seconds (0=default 30s, custom profile only)",
960+ Range: ">=0",
961+ Section: SectionPerformance,
962+ },
963+ {
964+ Key: "performance.web_process_memory_conservative_threshold",
965+ Type: "float64",
966+ Default: fmt.Sprintf("%.2f", defaults.Performance.WebProcessMemoryConservativeThreshold),
967+ Description: "Conservative memory cleanup threshold (0-1, custom profile only)",
968+ Range: "0-1",
969+ Section: SectionPerformance,
970+ },
971+ {
972+ Key: "performance.web_process_memory_strict_threshold",
973+ Type: "float64",
974+ Default: fmt.Sprintf("%.2f", defaults.Performance.WebProcessMemoryStrictThreshold),
975+ Description: "Strict memory cleanup threshold (0-1, custom profile only)",
976+ Range: "0-1",
977+ Section: SectionPerformance,
978+ },
979+ {
980+ Key: "performance.network_process_memory_limit_mb",
981+ Type: "int",
982+ Default: fmt.Sprintf("%d", defaults.Performance.NetworkProcessMemoryLimitMB),
983+ Description: "Network process memory limit in MB (0=unset, custom profile only)",
984+ Range: ">=0",
985+ Section: SectionPerformance,
986+ },
987+ {
988+ Key: "performance.network_process_memory_poll_interval_sec",
989+ Type: "float64",
990+ Default: fmt.Sprintf("%.1f", defaults.Performance.NetworkProcessMemoryPollIntervalSec),
991+ Description: "Network memory check interval in seconds (custom profile only)",
992+ Range: ">=0",
993+ Section: SectionPerformance,
994+ },
995+ {
996+ Key: "performance.network_process_memory_conservative_threshold",
997+ Type: "float64",
998+ Default: fmt.Sprintf("%.2f", defaults.Performance.NetworkProcessMemoryConservativeThreshold),
999+ Description: "Network conservative memory threshold (0-1, custom profile only)",
1000+ Range: "0-1",
1001+ Section: SectionPerformance,
1002+ },
1003+ {
1004+ Key: "performance.network_process_memory_strict_threshold",
1005+ Type: "float64",
1006+ Default: fmt.Sprintf("%.2f", defaults.Performance.NetworkProcessMemoryStrictThreshold),
1007+ Description: "Network strict memory threshold (0-1, custom profile only)",
1008+ Range: "0-1",
1009+ Section: SectionPerformance,
1010+ },
8721011 }
8731012 }
8741013
@@ -14,6 +14,7 @@ const (
14 SectionWorkspace = "Workspace"14 SectionWorkspace = "Workspace"
15 SectionSession = "Session"15 SectionSession = "Session"
16 SectionOmnibox = "Omnibox"16 SectionOmnibox = "Omnibox"
17+ SectionClipboard = "Clipboard"
17 SectionContentFiltering = "Content Filtering"18 SectionContentFiltering = "Content Filtering"
18 SectionRendering = "Rendering"19 SectionRendering = "Rendering"
19 SectionMedia = "Media"20 SectionMedia = "Media"
@@ -64,6 +65,9 @@ func (p *SchemaProvider) GetSchema() []entity.ConfigKeyInfo {
64 // Omnibox section65 // Omnibox section
65 keys = append(keys, p.getOmniboxKeys(defaults)...)66 keys = append(keys, p.getOmniboxKeys(defaults)...)
66 67
68+ // Clipboard section
69+ keys = append(keys, p.getClipboardKeys(defaults)...)
70+
67 // Content Filtering section71 // Content Filtering section
68 keys = append(keys, p.getContentFilteringKeys(defaults)...)72 keys = append(keys, p.getContentFilteringKeys(defaults)...)
69 73
@@ -459,6 +463,34 @@ func (*SchemaProvider) getWorkspaceKeys(defaults *Config) []entity.ConfigKeyInfo
459 Description: "Global shortcut to switch to previous tab",463 Description: "Global shortcut to switch to previous tab",
460 Section: SectionWorkspace,464 Section: SectionWorkspace,
461 },465 },
466+ {
467+ Key: "workspace.shortcuts.consume_or_expel_left",
468+ Type: "string",
469+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelLeft,
470+ Description: "Consume into left sibling stack or expel left (alpha)",
471+ Section: SectionWorkspace,
472+ },
473+ {
474+ Key: "workspace.shortcuts.consume_or_expel_right",
475+ Type: "string",
476+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelRight,
477+ Description: "Consume into right sibling stack or expel right (alpha)",
478+ Section: SectionWorkspace,
479+ },
480+ {
481+ Key: "workspace.shortcuts.consume_or_expel_up",
482+ Type: "string",
483+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelUp,
484+ Description: "Consume into upper sibling stack or expel up (alpha)",
485+ Section: SectionWorkspace,
486+ },
487+ {
488+ Key: "workspace.shortcuts.consume_or_expel_down",
489+ Type: "string",
490+ Default: defaults.Workspace.Shortcuts.ConsumeOrExpelDown,
491+ Description: "Consume into lower sibling stack or expel down (alpha)",
492+ Section: SectionWorkspace,
493+ },
462 // Popups494 // Popups
463 {495 {
464 Key: "workspace.popups.behavior",496 Key: "workspace.popups.behavior",
@@ -679,6 +711,18 @@ func (*SchemaProvider) getContentFilteringKeys(defaults *Config) []entity.Config
679 }711 }
680 }712 }
681 713
714+func (*SchemaProvider) getClipboardKeys(defaults *Config) []entity.ConfigKeyInfo {
715+ return []entity.ConfigKeyInfo{
716+ {
717+ Key: "clipboard.auto_copy_on_selection",
718+ Type: "bool",
719+ Default: fmt.Sprintf("%t", defaults.Clipboard.AutoCopyOnSelection),
720+ Description: "Auto-copy selected text to clipboard (zellij-style)",
721+ Section: SectionClipboard,
722+ },
723+ }
724+}
725+
682 func (*SchemaProvider) getRenderingKeys(defaults *Config) []entity.ConfigKeyInfo {726 func (*SchemaProvider) getRenderingKeys(defaults *Config) []entity.ConfigKeyInfo {
683 return []entity.ConfigKeyInfo{727 return []entity.ConfigKeyInfo{
684 {728 {
@@ -853,6 +897,14 @@ func (*SchemaProvider) getDebugKeys(defaults *Config) []entity.ConfigKeyInfo {
853 897
854 func (*SchemaProvider) getPerformanceKeys(defaults *Config) []entity.ConfigKeyInfo {898 func (*SchemaProvider) getPerformanceKeys(defaults *Config) []entity.ConfigKeyInfo {
855 return []entity.ConfigKeyInfo{899 return []entity.ConfigKeyInfo{
900+ {
901+ Key: "performance.profile",
902+ Type: "string",
903+ Default: string(defaults.Performance.Profile),
904+ Description: "Performance profile preset (custom enables manual tuning)",
905+ Values: []string{"default", "lite", "max", "custom"},
906+ Section: SectionPerformance,
907+ },
856 {908 {
857 Key: "performance.zoom_cache_size",909 Key: "performance.zoom_cache_size",
858 Type: "int",910 Type: "int",
@@ -869,6 +921,93 @@ func (*SchemaProvider) getPerformanceKeys(defaults *Config) []entity.ConfigKeyIn
869 Range: ">=0",921 Range: ">=0",
870 Section: SectionPerformance,922 Section: SectionPerformance,
871 },923 },
924+ {
925+ Key: "performance.skia_cpu_painting_threads",
926+ Type: "int",
927+ Default: fmt.Sprintf("%d", defaults.Performance.SkiaCPUPaintingThreads),
928+ Description: "Skia CPU rendering threads (0=unset, custom profile only)",
929+ Range: ">=0",
930+ Section: SectionPerformance,
931+ },
932+ {
933+ Key: "performance.skia_gpu_painting_threads",
934+ Type: "int",
935+ Default: fmt.Sprintf("%d", defaults.Performance.SkiaGPUPaintingThreads),
936+ Description: "Skia GPU rendering threads (-1=unset, 0=disable, custom profile only)",
937+ Range: ">=-1",
938+ Section: SectionPerformance,
939+ },
940+ {
941+ Key: "performance.skia_enable_cpu_rendering",
942+ Type: "bool",
943+ Default: fmt.Sprintf("%t", defaults.Performance.SkiaEnableCPURendering),
944+ Description: "Force CPU rendering (custom profile only)",
945+ Section: SectionPerformance,
946+ },
947+ {
948+ Key: "performance.web_process_memory_limit_mb",
949+ Type: "int",
950+ Default: fmt.Sprintf("%d", defaults.Performance.WebProcessMemoryLimitMB),
951+ Description: "Web process memory limit in MB (0=unset, custom profile only)",
952+ Range: ">=0",
953+ Section: SectionPerformance,
954+ },
955+ {
956+ Key: "performance.web_process_memory_poll_interval_sec",
957+ Type: "float64",
958+ Default: fmt.Sprintf("%.1f", defaults.Performance.WebProcessMemoryPollIntervalSec),
959+ Description: "Memory check interval in seconds (0=default 30s, custom profile only)",
960+ Range: ">=0",
961+ Section: SectionPerformance,
962+ },
963+ {
964+ Key: "performance.web_process_memory_conservative_threshold",
965+ Type: "float64",
966+ Default: fmt.Sprintf("%.2f", defaults.Performance.WebProcessMemoryConservativeThreshold),
967+ Description: "Conservative memory cleanup threshold (0-1, custom profile only)",
968+ Range: "0-1",
969+ Section: SectionPerformance,
970+ },
971+ {
972+ Key: "performance.web_process_memory_strict_threshold",
973+ Type: "float64",
974+ Default: fmt.Sprintf("%.2f", defaults.Performance.WebProcessMemoryStrictThreshold),
975+ Description: "Strict memory cleanup threshold (0-1, custom profile only)",
976+ Range: "0-1",
977+ Section: SectionPerformance,
978+ },
979+ {
980+ Key: "performance.network_process_memory_limit_mb",
981+ Type: "int",
982+ Default: fmt.Sprintf("%d", defaults.Performance.NetworkProcessMemoryLimitMB),
983+ Description: "Network process memory limit in MB (0=unset, custom profile only)",
984+ Range: ">=0",
985+ Section: SectionPerformance,
986+ },
987+ {
988+ Key: "performance.network_process_memory_poll_interval_sec",
989+ Type: "float64",
990+ Default: fmt.Sprintf("%.1f", defaults.Performance.NetworkProcessMemoryPollIntervalSec),
991+ Description: "Network memory check interval in seconds (custom profile only)",
992+ Range: ">=0",
993+ Section: SectionPerformance,
994+ },
995+ {
996+ Key: "performance.network_process_memory_conservative_threshold",
997+ Type: "float64",
998+ Default: fmt.Sprintf("%.2f", defaults.Performance.NetworkProcessMemoryConservativeThreshold),
999+ Description: "Network conservative memory threshold (0-1, custom profile only)",
1000+ Range: "0-1",
1001+ Section: SectionPerformance,
1002+ },
1003+ {
1004+ Key: "performance.network_process_memory_strict_threshold",
1005+ Type: "float64",
1006+ Default: fmt.Sprintf("%.2f", defaults.Performance.NetworkProcessMemoryStrictThreshold),
1007+ Description: "Network strict memory threshold (0-1, custom profile only)",
1008+ Range: "0-1",
1009+ Section: SectionPerformance,
1010+ },
872 }1011 }
873 }1012 }
874 1013

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