vtcode_core/terminal_setup/terminals/
alacritty.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(features: &[crate::terminal_setup::detector::TerminalFeature]) -> Result<String> {
12 let mut config_sections = Vec::new();
13
14 config_sections.push("# VT Code Terminal Configuration for Alacritty".to_string());
16 config_sections.push(String::new());
17
18 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
63pub 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}