Add command aliases (#14826)

Co-Authored-By: <tobbe@tlundberg.com>

Release Notes:

- Added `"command_aliases"` setting to let you abbreviate commands
This commit is contained in:
Conrad Irwin 2024-07-19 12:48:48 -06:00 committed by GitHub
parent b22718e643
commit 1dc4d4200f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 47 additions and 3 deletions

View File

@ -936,5 +936,13 @@
// Examples: // Examples:
// - "proxy": "socks5://localhost:10808" // - "proxy": "socks5://localhost:10808"
// - "proxy": "http://127.0.0.1:10809" // - "proxy": "http://127.0.0.1:10809"
"proxy": null "proxy": null,
// Set to configure aliases for the command palette.
// When typing a query which is a key of this object, the value will be used instead.
//
// Examples:
// {
// "W": "workspace::Save"
// }
"command_aliases": {}
} }

View File

@ -17,9 +17,10 @@ use gpui::{
use picker::{Picker, PickerDelegate}; use picker::{Picker, PickerDelegate};
use postage::{sink::Sink, stream::Stream}; use postage::{sink::Sink, stream::Stream};
use settings::Settings;
use ui::{h_flex, prelude::*, v_flex, HighlightedLabel, KeyBinding, ListItem, ListItemSpacing}; use ui::{h_flex, prelude::*, v_flex, HighlightedLabel, KeyBinding, ListItem, ListItemSpacing};
use util::ResultExt; use util::ResultExt;
use workspace::{ModalView, Workspace}; use workspace::{ModalView, Workspace, WorkspaceSettings};
use zed_actions::OpenZedUrl; use zed_actions::OpenZedUrl;
actions!(command_palette, [Toggle]); actions!(command_palette, [Toggle]);
@ -248,9 +249,13 @@ impl PickerDelegate for CommandPaletteDelegate {
fn update_matches( fn update_matches(
&mut self, &mut self,
query: String, mut query: String,
cx: &mut ViewContext<Picker<Self>>, cx: &mut ViewContext<Picker<Self>>,
) -> gpui::Task<()> { ) -> gpui::Task<()> {
let settings = WorkspaceSettings::get_global(cx);
if let Some(alias) = settings.command_aliases.get(&query) {
query = alias.to_string();
}
let (mut tx, mut rx) = postage::dispatch::channel(1); let (mut tx, mut rx) = postage::dispatch::channel(1);
let task = cx.background_executor().spawn({ let task = cx.background_executor().spawn({
let mut commands = self.all_commands.clone(); let mut commands = self.all_commands.clone();

View File

@ -4,15 +4,18 @@ mod vim_test_context;
use std::time::Duration; use std::time::Duration;
use collections::HashMap;
use command_palette::CommandPalette; use command_palette::CommandPalette;
use editor::{display_map::DisplayRow, DisplayPoint}; use editor::{display_map::DisplayRow, DisplayPoint};
use futures::StreamExt; use futures::StreamExt;
use gpui::{KeyBinding, Modifiers, MouseButton, TestAppContext}; use gpui::{KeyBinding, Modifiers, MouseButton, TestAppContext};
pub use neovim_backed_test_context::*; pub use neovim_backed_test_context::*;
use settings::SettingsStore;
pub use vim_test_context::*; pub use vim_test_context::*;
use indoc::indoc; use indoc::indoc;
use search::BufferSearchBar; use search::BufferSearchBar;
use workspace::WorkspaceSettings;
use crate::{insert::NormalBefore, motion, state::Mode, ModeIndicator}; use crate::{insert::NormalBefore, motion, state::Mode, ModeIndicator};
@ -1298,3 +1301,19 @@ async fn test_plus_minus(cx: &mut gpui::TestAppContext) {
cx.simulate_shared_keystrokes("+").await; cx.simulate_shared_keystrokes("+").await;
cx.shared_state().await.assert_matches(); cx.shared_state().await.assert_matches();
} }
#[gpui::test]
async fn test_command_alias(cx: &mut gpui::TestAppContext) {
let mut cx = VimTestContext::new(cx, true).await;
cx.update_global(|store: &mut SettingsStore, cx| {
store.update_user_settings::<WorkspaceSettings>(cx, |s| {
let mut aliases = HashMap::default();
aliases.insert("Q".to_string(), "upper".to_string());
s.command_aliases = Some(aliases)
});
});
cx.set_state("ˇhello world", Mode::Normal);
cx.simulate_keystrokes(": Q");
cx.set_state("ˇHello world", Mode::Normal);
}

View File

@ -1,4 +1,5 @@
use anyhow::Result; use anyhow::Result;
use collections::HashMap;
use gpui::AppContext; use gpui::AppContext;
use schemars::JsonSchema; use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -15,6 +16,7 @@ pub struct WorkspaceSettings {
pub drop_target_size: f32, pub drop_target_size: f32,
pub when_closing_with_no_tabs: CloseWindowWhenNoItems, pub when_closing_with_no_tabs: CloseWindowWhenNoItems,
pub use_system_path_prompts: bool, pub use_system_path_prompts: bool,
pub command_aliases: HashMap<String, String>,
} }
#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] #[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)]
@ -89,6 +91,11 @@ pub struct WorkspaceSettingsContent {
/// ///
/// Default: true /// Default: true
pub use_system_path_prompts: Option<bool>, pub use_system_path_prompts: Option<bool>,
/// Aliases for the command palette. When you type a key in this map,
/// it will be assumed to equal the value.
///
/// Default: true
pub command_aliases: Option<HashMap<String, String>>,
} }
#[derive(Deserialize)] #[derive(Deserialize)]

View File

@ -261,6 +261,11 @@ There are also a few Zed settings that you may also enjoy if you use vim mode:
"gutter": { "gutter": {
// disable line numbers completely: // disable line numbers completely:
"line_numbers": false "line_numbers": false
},
"command_aliases": {
"W": "w",
"Wq": "wq",
"Q": "q"
} }
} }
``` ```