aboutsummaryrefslogtreecommitdiff
path: root/src/config.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-01 15:48:22 +0300
committerGitHub <noreply@github.com>2026-09-01 15:48:22 +0300
commit207be3c771d281baae6e5fa0fb74be9a056e97a2 (patch)
treed7b037ecdf629224a048c841d11659efdc23507d /src/config.rs
parent8a6d697308162874a236c84aac0b0f8c7ac01f83 (diff)
refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell * feat: add client-owned shell mouse controls * feat: complete client-owned shell chrome * feat: add client-owned shell settings and notifications * feat: run client shell custom commands * feat: render popup terminals in client shell * feat: add client-owned scrollback and copy mode * fix: preserve client worktree trust defaults * feat: render startup diagnostics in client shell * feat: render onboarding in client shell * feat: render product announcements in client shell * feat: render release notes in client shell * feat: render mobile switcher in client shell * feat: render kitty graphics in client shell * fix: preserve client shell lifecycle coherence * refactor: route client shell commands through endpoint connections * refactor: make the client-rendered shell the default * refactor: remove monolithic launch mode * refactor: complete client-rendered shell cutover * perf: retain client pane surface updates * perf: scale retained pane surface updates * perf: remove remote pane input latency * test: make client shell checks platform-independent * fix: prevent client timer starvation * test: fix client shell platform gates * test: accept retained surfaces in cross-area checks * test: make client mode assertions platform-neutral * fix: badge only outdated integrations
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs61
1 files changed, 52 insertions, 9 deletions
diff --git a/src/config.rs b/src/config.rs
index 02ad2fbc..117374ee 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -8,6 +8,7 @@ mod sound;
mod tab_bar;
mod theme;
mod window_title;
+mod write;
pub use self::{
io::{
@@ -38,6 +39,7 @@ pub use self::{
};
pub(crate) use self::keybinds::parse_key_combo;
+pub(crate) use self::write::{update_file_at, write_edit, ConfigEdit};
pub(crate) use self::{
io::upsert_top_level_bool,
tab_bar::{
@@ -49,7 +51,28 @@ pub(crate) use self::{
window_title::{sanitize_window_title_text, window_title_diagnostics},
};
+pub(crate) use self::{keybinds::CommandKeybindType, model::KeysConfig};
+
pub const CONFIG_PATH_ENV_VAR: &str = "HERDR_CONFIG_PATH";
+
+pub(crate) fn is_keybinding_config_diagnostic(diagnostic: &str) -> bool {
+ if diagnostic.starts_with("config parse error:") || diagnostic.starts_with("config read error:")
+ {
+ return false;
+ }
+ diagnostic.contains("keybinding") || diagnostic.contains("keys.")
+}
+
+pub(crate) fn config_diagnostic_summary_without_keybindings(
+ diagnostics: &[String],
+) -> Option<String> {
+ let diagnostics = diagnostics
+ .iter()
+ .filter(|diagnostic| !is_keybinding_config_diagnostic(diagnostic))
+ .cloned()
+ .collect::<Vec<_>>();
+ config_diagnostic_summary(&diagnostics)
+}
pub const DEFAULT_SCROLLBACK_LIMIT_BYTES: usize = 10_000_000;
pub const DEFAULT_MOUSE_SCROLL_LINES: usize = 3;
pub const DEFAULT_MOBILE_WIDTH_THRESHOLD: u16 = 64;
@@ -134,12 +157,6 @@ impl Config {
})
}
- #[cfg(test)]
- pub fn live_keybinds(&self) -> Result<LiveKeybindConfig, Vec<String>> {
- self.live_keybinds_with_diagnostics()
- .map(|(live, _diagnostics)| live)
- }
-
pub(crate) fn live_keybinds_with_diagnostics(
&self,
) -> Result<(LiveKeybindConfig, Vec<String>), Vec<String>> {
@@ -157,12 +174,21 @@ impl Config {
keys: model::KeysConfigOverlay,
}
- toml::to_string_pretty(&KeysProfile {
- keys: self.keys.local_profile(&self.keybinds()),
- })
+ let mut keys = self.keys.local_profile(&self.keybinds());
+ keys.set_prefix(format_key_combo(self.prefix_key()));
+ toml::to_string_pretty(&KeysProfile { keys })
}
}
+pub(crate) fn keybindings_from_profile_toml(profile: &str) -> Result<LiveKeybindConfig, String> {
+ let config = toml::from_str::<Config>(profile)
+ .map_err(|err| format!("invalid keybinding profile: {err}"))?;
+ config
+ .live_keybinds_with_diagnostics()
+ .map(|(keybinds, _diagnostics)| keybinds)
+ .map_err(|diagnostics| diagnostics.join("; "))
+}
+
#[cfg(test)]
mod tests {
use super::*;
@@ -193,6 +219,23 @@ command = "lazygit"
}
#[test]
+ fn local_keybindings_profile_publishes_the_effective_prefix_fallback() {
+ let config: Config = toml::from_str(
+ r#"
+[keys]
+prefix = "ctrl+"
+"#,
+ )
+ .unwrap();
+
+ let profile = config.local_keybindings_profile_toml().unwrap();
+ let keybinds = keybindings_from_profile_toml(&profile).unwrap();
+
+ assert!(profile.contains("prefix = \"ctrl+b\""));
+ assert_eq!(keybinds.prefix, config.prefix_key());
+ }
+
+ #[test]
fn local_keybindings_profile_preserves_user_default_provenance() {
let config: Config = toml::from_str(
r#"