Skip to main content

vtcode_core/terminal_setup/terminals/
kitty.rs

1//! Kitty terminal configuration generator.
2//!
3//! Generates configuration for Kitty terminal emulator.
4
5use crate::terminal_setup::config_writer::{ConfigFormat, ConfigWriter};
6use crate::terminal_setup::detector::TerminalType;
7use crate::terminal_setup::features::multiline;
8use anyhow::Result;
9
10/// Generate complete Kitty configuration with all features
11pub fn generate_config(
12    features: &[crate::terminal_setup::detector::TerminalFeature],
13) -> Result<String> {
14    let mut config_lines = Vec::new();
15
16    // Add header comment
17    config_lines.push("# VT Code Terminal Configuration for Kitty".to_string());
18    config_lines.push(String::new());
19
20    // Generate feature-specific configurations
21    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
63/// Merge Kitty configuration with existing config file
64pub 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}