vtcode_core/terminal_setup/terminals/
windows_terminal.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 Windows Terminal".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::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
70pub 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
75pub 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}