Skip to main content

vtcode_core/terminal_setup/terminals/
zed.rs

1//! Zed terminal configuration generator.
2//!
3//! Generates manual instructions for Zed editor's terminal keymap.
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 manual Zed setup instructions for the requested features
11pub fn generate_config(features: &[crate::terminal_setup::detector::TerminalFeature]) -> Result<String> {
12    let mut config_sections = vec![
13        "Zed Terminal Manual Setup:".to_string(),
14        "Open the command palette and run zed: open keymap.".to_string(),
15        "Add the object below to the existing keymap array, separating entries with a comma.".to_string(),
16        "Keep your existing bindings. VT Code does not write or back up Zed files.".to_string(),
17        String::new(),
18    ];
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::Zed)?;
26                config_sections.push(multiline_config);
27            }
28            crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
29                // Zed doesn't support custom copy/paste config for terminal
30                config_sections.push("// Copy/paste: Built-in to Zed, no custom config needed".to_string());
31                config_sections.push(String::new());
32            }
33            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
34                // Zed doesn't support custom shell integration
35                config_sections.push("// Shell integration: Not supported".to_string());
36                config_sections.push(String::new());
37            }
38            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
39                config_sections.push("// Theme: configure separately in Zed settings".to_string());
40                config_sections.push(String::new());
41            }
42            crate::terminal_setup::detector::TerminalFeature::Notifications => {
43                config_sections.push("// System notifications: Not supported in Zed terminal".to_string());
44                config_sections.push("// Use Zed's notification system instead".to_string());
45                config_sections.push(String::new());
46            }
47        }
48    }
49
50    Ok(config_sections.join("\n"))
51}
52
53/// Merge Zed configuration with existing JSON config file
54pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
55    ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::Json)
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use crate::terminal_setup::detector::TerminalFeature;
62
63    #[test]
64    fn test_generate_multiline_config() {
65        let features = vec![TerminalFeature::Multiline];
66        let config = generate_config(&features).unwrap();
67        assert!(config.contains("shift-enter") || config.contains("Multiline"));
68    }
69
70    #[test]
71    fn test_generate_theme_config() {
72        let features = vec![TerminalFeature::ThemeSync];
73        let config = generate_config(&features).unwrap();
74        assert!(config.contains("Theme"));
75    }
76}