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