Skip to main content

vtcode_core/terminal_setup/terminals/
alacritty.rs

1//! Alacritty terminal configuration generator.
2//!
3//! Generates TOML configuration for Alacritty 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 Alacritty configuration with all features
11pub fn generate_config(features: &[crate::terminal_setup::detector::TerminalFeature]) -> Result<String> {
12    let mut config_sections = Vec::new();
13
14    // Add header comment
15    config_sections.push("# VT Code Terminal Configuration for Alacritty".to_string());
16    config_sections.push(String::new());
17
18    // Generate feature-specific configurations
19    for feature in features {
20        match feature {
21            crate::terminal_setup::detector::TerminalFeature::Multiline => {
22                config_sections.push("# Multiline input: Shift+Enter".to_string());
23                let multiline_config = multiline::generate_config(TerminalType::Alacritty)?;
24                config_sections.push(multiline_config);
25            }
26            crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
27                config_sections.push("# Enhanced copy/paste".to_string());
28                config_sections.push("[selection]".to_string());
29                config_sections.push("save_to_clipboard = true".to_string());
30                config_sections.push(String::new());
31                config_sections.push("[[mouse.bindings]]".to_string());
32                config_sections.push("mouse = \"Middle\"".to_string());
33                config_sections.push("action = \"PasteSelection\"".to_string());
34                config_sections.push(String::new());
35            }
36            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
37                config_sections.push("# Shell integration".to_string());
38                config_sections.push("[shell]".to_string());
39                config_sections.push("program = \"/bin/bash\"".to_string());
40                config_sections.push("args = [\"--login\"]".to_string());
41                config_sections.push(String::new());
42            }
43            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
44                config_sections.push("# Theme synchronization".to_string());
45                let theme_config =
46                    crate::terminal_setup::features::theme_sync::generate_config(TerminalType::Alacritty)?;
47                config_sections.push(theme_config);
48            }
49            crate::terminal_setup::detector::TerminalFeature::Notifications => {
50                config_sections.push("# System notifications".to_string());
51                config_sections.push("[bell]".to_string());
52                config_sections.push("animation = \"EaseOutExpo\"".to_string());
53                config_sections.push("duration = 0".to_string());
54                config_sections.push("command = [\"notify-send\", \"Alacritty\", \"Bell\"]".to_string());
55                config_sections.push(String::new());
56            }
57        }
58    }
59
60    Ok(config_sections.join("\n"))
61}
62
63/// Merge Alacritty configuration with existing TOML 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::Toml)
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("keyboard.bindings"));
78        assert!(config.contains("Return"));
79        assert!(config.contains("Shift"));
80    }
81
82    #[test]
83    fn test_generate_copy_paste_config() {
84        let features = vec![TerminalFeature::CopyPaste];
85        let config = generate_config(&features).unwrap();
86        assert!(config.contains("[selection]"));
87        assert!(config.contains("save_to_clipboard"));
88    }
89
90    #[test]
91    fn test_generate_all_features() {
92        let features = vec![
93            TerminalFeature::Multiline,
94            TerminalFeature::CopyPaste,
95            TerminalFeature::ShellIntegration,
96            TerminalFeature::ThemeSync,
97        ];
98        let config = generate_config(&features).unwrap();
99        assert!(config.contains("keyboard.bindings"));
100        assert!(config.contains("save_to_clipboard"));
101        assert!(config.contains("[shell]"));
102        assert!(config.contains("index = 255"));
103    }
104
105    #[test]
106    fn test_merge_with_existing() {
107        let existing = "# User config\n[font]\nsize = 12\n";
108        let new_config = "[[keyboard.bindings]]\nkey = \"Return\"\nmods = \"Shift\"\nchars = \"\\n\"";
109
110        let merged = merge_with_existing(existing, new_config).unwrap();
111
112        assert!(merged.contains("size = 12"));
113        assert!(merged.contains("BEGIN VTCODE CONFIGURATION"));
114        assert!(merged.contains("keyboard.bindings"));
115    }
116}