Skip to main content

vtcode_core/terminal_setup/terminals/
ghostty.rs

1//! Ghostty terminal configuration generator.
2//!
3//! Generates configuration for Ghostty terminal emulator.
4
5use crate::terminal_setup::config_writer::{ConfigFormat, ConfigWriter};
6use crate::terminal_setup::detector::TerminalType;
7use crate::terminal_setup::features::multiline;
8use crate::terminal_setup::features::shell_integration;
9use anyhow::Result;
10
11/// Generate complete Ghostty configuration with all features
12pub fn generate_config(
13    features: &[crate::terminal_setup::detector::TerminalFeature],
14) -> Result<String> {
15    let mut config_lines = Vec::new();
16
17    // Add header comment
18    config_lines.push("# VT Code Terminal Configuration for Ghostty".to_string());
19    config_lines.push(String::new());
20
21    // Generate feature-specific configurations
22    for feature in features {
23        match feature {
24            crate::terminal_setup::detector::TerminalFeature::Multiline => {
25                config_lines.push("# Multiline input: Shift+Enter".to_string());
26                let multiline_config = multiline::generate_config(TerminalType::Ghostty)?;
27                config_lines.push(multiline_config);
28            }
29            crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
30                config_lines.push("# Enhanced copy/paste".to_string());
31                config_lines.push("copy-on-select = true".to_string());
32                config_lines.push(String::new());
33            }
34            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
35                let shell_config = shell_integration::generate_config(TerminalType::Ghostty)?;
36                config_lines.push(shell_config);
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(
41                    TerminalType::Ghostty,
42                )?;
43                config_lines.push(theme_config);
44            }
45            crate::terminal_setup::detector::TerminalFeature::Notifications => {
46                config_lines.push("# System notifications".to_string());
47                config_lines.push("bell = true".to_string());
48                config_lines.push(String::new());
49            }
50        }
51    }
52
53    Ok(config_lines.join("\n"))
54}
55
56/// Merge Ghostty configuration with existing config file
57pub 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("keybind"));
72    }
73
74    #[test]
75    fn test_generate_all_features() {
76        let features = vec![
77            TerminalFeature::Multiline,
78            TerminalFeature::CopyPaste,
79            TerminalFeature::ShellIntegration,
80            TerminalFeature::ThemeSync,
81        ];
82        let config = generate_config(&features).unwrap();
83        assert!(config.contains("shift+enter"));
84        assert!(config.contains("copy-on-select"));
85        assert!(config.contains("shell-integration"));
86        assert!(config.contains("palette = 255="));
87    }
88
89    #[test]
90    fn test_merge_with_existing() {
91        let existing = "# User config\nfont-family = Monospace\n";
92        let new_config = "keybind = shift+enter=text:\\n";
93
94        let merged = merge_with_existing(existing, new_config).unwrap();
95
96        assert!(merged.contains("font-family"));
97        assert!(merged.contains("BEGIN VTCODE CONFIGURATION"));
98        assert!(merged.contains("keybind"));
99    }
100}