This PR fixes an issue where slash commands were not able to run when Zed did not have any worktrees opened. This requirement was only necessary for slash commands originating from extensions, and we can enforce the presence of a worktree just for those: <img width="378" alt="Screenshot 2024-08-01 at 5 01 58 PM" src="https://github.com/user-attachments/assets/38bea947-e33b-4c64-853c-c1f36c63d779"> Release Notes: - N/A
80 lines
2.2 KiB
Rust
80 lines
2.2 KiB
Rust
use super::{SlashCommand, SlashCommandOutput};
|
|
use crate::prompt_library::PromptStore;
|
|
use anyhow::{anyhow, Result};
|
|
use assistant_slash_command::{ArgumentCompletion, SlashCommandOutputSection};
|
|
use gpui::{AppContext, Task, WeakView};
|
|
use language::LspAdapterDelegate;
|
|
use std::{
|
|
fmt::Write,
|
|
sync::{atomic::AtomicBool, Arc},
|
|
};
|
|
use ui::prelude::*;
|
|
use workspace::Workspace;
|
|
|
|
pub(crate) struct DefaultSlashCommand;
|
|
|
|
impl SlashCommand for DefaultSlashCommand {
|
|
fn name(&self) -> String {
|
|
"default".into()
|
|
}
|
|
|
|
fn description(&self) -> String {
|
|
"insert default prompt".into()
|
|
}
|
|
|
|
fn menu_text(&self) -> String {
|
|
"Insert Default Prompt".into()
|
|
}
|
|
|
|
fn requires_argument(&self) -> bool {
|
|
false
|
|
}
|
|
|
|
fn complete_argument(
|
|
self: Arc<Self>,
|
|
_query: String,
|
|
_cancellation_flag: Arc<AtomicBool>,
|
|
_workspace: Option<WeakView<Workspace>>,
|
|
_cx: &mut AppContext,
|
|
) -> Task<Result<Vec<ArgumentCompletion>>> {
|
|
Task::ready(Err(anyhow!("this command does not require argument")))
|
|
}
|
|
|
|
fn run(
|
|
self: Arc<Self>,
|
|
_argument: Option<&str>,
|
|
_workspace: WeakView<Workspace>,
|
|
_delegate: Option<Arc<dyn LspAdapterDelegate>>,
|
|
cx: &mut WindowContext,
|
|
) -> Task<Result<SlashCommandOutput>> {
|
|
let store = PromptStore::global(cx);
|
|
cx.background_executor().spawn(async move {
|
|
let store = store.await?;
|
|
let prompts = store.default_prompt_metadata();
|
|
|
|
let mut text = String::new();
|
|
text.push('\n');
|
|
for prompt in prompts {
|
|
if let Some(title) = prompt.title {
|
|
writeln!(text, "/prompt {}", title).unwrap();
|
|
}
|
|
}
|
|
text.pop();
|
|
|
|
if text.is_empty() {
|
|
text.push('\n');
|
|
}
|
|
|
|
Ok(SlashCommandOutput {
|
|
sections: vec![SlashCommandOutputSection {
|
|
range: 0..text.len(),
|
|
icon: IconName::Library,
|
|
label: "Default".into(),
|
|
}],
|
|
text,
|
|
run_commands_in_text: true,
|
|
})
|
|
})
|
|
}
|
|
}
|