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