vtcode_core/terminal_setup/terminals/
kitty.rs1use crate::terminal_setup::config_writer::{ConfigFormat, ConfigWriter};
6use crate::terminal_setup::detector::TerminalType;
7use crate::terminal_setup::features::multiline;
8use anyhow::Result;
9
10pub fn generate_config(features: &[crate::terminal_setup::detector::TerminalFeature]) -> Result<String> {
12 let mut config_lines = Vec::new();
13
14 config_lines.push("# VT Code Terminal Configuration for Kitty".to_string());
16 config_lines.push(String::new());
17
18 for feature in features {
20 match feature {
21 crate::terminal_setup::detector::TerminalFeature::Multiline => {
22 config_lines.push("# Multiline input: Shift+Enter".to_string());
23 let multiline_config = multiline::generate_config(TerminalType::Kitty)?;
24 config_lines.push(multiline_config);
25 }
26 crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
27 config_lines.push("# Enhanced copy/paste".to_string());
28 config_lines.push("enable_bracketed_paste yes".to_string());
29 config_lines.push("copy_on_select clipboard".to_string());
30 config_lines.push("mouse_map shift+left click grabbed,ungrabbed mouse_selection normal".to_string());
31 config_lines.push(String::new());
32 }
33 crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
34 config_lines.push("# Shell integration".to_string());
35 config_lines.push("shell_integration enabled".to_string());
36 config_lines.push(String::new());
37 }
38 crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
39 config_lines.push("# Theme synchronization".to_string());
40 let theme_config = crate::terminal_setup::features::theme_sync::generate_config(TerminalType::Kitty)?;
41 config_lines.push(theme_config);
42 }
43 crate::terminal_setup::detector::TerminalFeature::Notifications => {
44 config_lines.push("# System notifications".to_string());
45 config_lines.push("bell_on_tab yes".to_string());
46 config_lines.push("visual_bell_duration 0.1".to_string());
47 config_lines.push("enable_audio_bell no".to_string());
48 config_lines.push(String::new());
49 }
50 }
51 }
52
53 Ok(config_lines.join("\n"))
54}
55
56pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
58 ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::PlainText)
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use crate::terminal_setup::detector::TerminalFeature;
65
66 #[test]
67 fn test_generate_multiline_config() {
68 let features = vec![TerminalFeature::Multiline];
69 let config = generate_config(&features).unwrap();
70 assert!(config.contains("shift+enter"));
71 assert!(config.contains("map"));
72 }
73
74 #[test]
75 fn test_generate_copy_paste_config() {
76 let features = vec![TerminalFeature::CopyPaste];
77 let config = generate_config(&features).unwrap();
78 assert!(config.contains("bracketed_paste"));
79 assert!(config.contains("copy_on_select"));
80 }
81
82 #[test]
83 fn test_generate_all_features() {
84 let features = vec![
85 TerminalFeature::Multiline,
86 TerminalFeature::CopyPaste,
87 TerminalFeature::ShellIntegration,
88 TerminalFeature::ThemeSync,
89 ];
90 let config = generate_config(&features).unwrap();
91 assert!(config.contains("shift+enter"));
92 assert!(config.contains("copy_on_select"));
93 assert!(config.contains("shell_integration"));
94 assert!(config.contains("color255 "));
95 }
96
97 #[test]
98 fn test_merge_with_existing() {
99 let existing = "# User config\nfont_family Monospace\n";
100 let new_config = "map shift+enter send_text all \\n";
101
102 let merged = merge_with_existing(existing, new_config).unwrap();
103
104 assert!(merged.contains("font_family"));
105 assert!(merged.contains("BEGIN VTCODE CONFIGURATION"));
106 assert!(merged.contains("shift+enter"));
107 }
108}