Skip to main content

vtcode_core/terminal_setup/terminals/
windows_terminal.rs

1//! Windows Terminal configuration generator.
2//!
3//! Generates JSON configuration for Windows Terminal.
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 Windows Terminal 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 Windows Terminal".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::WindowsTerminal)?;
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(
29                    r#"{
30  "copyOnSelect": true,
31  "copyFormatting": false
32}
33"#
34                    .to_string(),
35                );
36            }
37            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
38                config_sections.push("// Shell integration".to_string());
39                config_sections.push(
40                    r#"{
41  "experimental.rendering.forceFullRepaint": false,
42  "experimental.rendering.software": false
43}
44"#
45                    .to_string(),
46                );
47            }
48            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
49                config_sections.push("// Theme colors will be configured separately".to_string());
50                config_sections.push(String::new());
51            }
52            crate::terminal_setup::detector::TerminalFeature::Notifications => {
53                config_sections.push("// System notifications".to_string());
54                config_sections.push(
55                    r#"{
56  "bellStyle": "audible",
57  "bellDuration": 200,
58  "showTerminalBellAlert": true
59}
60"#
61                    .to_string(),
62                );
63            }
64        }
65    }
66
67    Ok(config_sections.join("\n"))
68}
69
70/// Merge Windows Terminal configuration with existing JSON config file
71pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
72    ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::Json)
73}
74
75/// Copy-paste guidance for a Windows Terminal profile icon.
76///
77/// Windows Terminal reads tab artwork from `settings.json` profiles only;
78/// no escape sequence can set it, so this stays a manual one-time step.
79pub fn profile_icon_instructions() -> Vec<String> {
80    vec![
81        "TAB ICON (profile image):".to_string(),
82        "1. Open Settings (Ctrl+,) → Open JSON file.".to_string(),
83        "2. Add a profile entry (replace the icon path with your copy of resources/icons/vtcode-profile-180.png):"
84            .to_string(),
85        "{".to_string(),
86        "  \"name\": \"VT Code\",".to_string(),
87        "  \"commandline\": \"vtcode\",".to_string(),
88        "  \"icon\": \"C:\\\\Tools\\\\vtcode-profile-180.png\"".to_string(),
89        "}".to_string(),
90    ]
91}
92
93#[cfg(test)]
94mod tests {
95    use super::*;
96    use crate::terminal_setup::detector::TerminalFeature;
97
98    #[test]
99    fn test_generate_multiline_config() {
100        let features = vec![TerminalFeature::Multiline];
101        let config = generate_config(&features).unwrap();
102        assert!(config.contains("sendInput") || config.contains("shift+enter"));
103    }
104
105    #[test]
106    fn test_generate_copy_paste_config() {
107        let features = vec![TerminalFeature::CopyPaste];
108        let config = generate_config(&features).unwrap();
109        assert!(config.contains("copyOnSelect"));
110    }
111
112    #[test]
113    fn profile_icon_instructions_show_settings_fragment() {
114        let lines = profile_icon_instructions();
115        let joined = lines.join("\n");
116        assert!(joined.contains("\"icon\""));
117        assert!(joined.contains(".png"));
118        assert!(joined.contains("VT Code"));
119    }
120}