This Pull Request tackles the issue outline in #14287 by changing the way `KeyBinding`s for vim mode are displayed in the command palette. It's worth pointing out that this whole thing was pretty much implemented by Conrad Irwin during a pairing session, I just tried to clean up some other changes introduced for a different issue, while improving some comments. Here's a quick list of the changes introduced: - Update `KeyBinding` with a new `vim_mode` field to determine whether the keybinding should be displayed in vim mode. - Update the way `KeyBinding` is rendered, so as to detect if the keybinding is for vim mode, if it is, only display keys in uppercase if they require the shift key. - Introduce a new global state – `VimStyle(bool)` - use to determine whether `vim_mode` should be enabled or disabled when creating a new `KeyBinding` struct. This global state is automatically set by the `vim` crate whenever vim mode is enabled or disabled. - Since the app's context is now required when building a `KeyBinding` , update a lot of callers to correctly pass this context. And before and after screenshots, for comparison: | before | after | |--------|-------| | <img width="1050" alt="SCR-20250205-tyeq" src="https://github.com/user-attachments/assets/e577206d-2a3d-4e06-a96f-a98899cc15c0" /> | <img width="1050" alt="SCR-20250205-tylh" src="https://github.com/user-attachments/assets/ebbf70a9-e838-4d32-aee5-0ffde94d65fb" /> | Closes #14287 Release Notes: - Fix rendering of vim commands to preserve case sensitivity --------- Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
83 lines
3.5 KiB
Rust
83 lines
3.5 KiB
Rust
use gpui::NoAction;
|
|
use gpui::Render;
|
|
use itertools::Itertools;
|
|
use story::Story;
|
|
|
|
use crate::{prelude::*, KeyBinding};
|
|
|
|
pub struct KeybindingStory;
|
|
|
|
pub fn binding(key: &str) -> gpui::KeyBinding {
|
|
gpui::KeyBinding::new(key, NoAction {}, None)
|
|
}
|
|
|
|
impl Render for KeybindingStory {
|
|
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
|
let all_modifier_permutations = ["ctrl", "alt", "cmd", "shift"].into_iter().permutations(2);
|
|
|
|
Story::container()
|
|
.child(Story::title_for::<KeyBinding>())
|
|
.child(Story::label("Single Key"))
|
|
.child(KeyBinding::new(binding("Z"), cx))
|
|
.child(Story::label("Single Key with Modifier"))
|
|
.child(
|
|
div()
|
|
.flex()
|
|
.gap_3()
|
|
.child(KeyBinding::new(binding("ctrl-c"), cx))
|
|
.child(KeyBinding::new(binding("alt-c"), cx))
|
|
.child(KeyBinding::new(binding("cmd-c"), cx))
|
|
.child(KeyBinding::new(binding("shift-c"), cx)),
|
|
)
|
|
.child(Story::label("Single Key with Modifier (Permuted)"))
|
|
.child(
|
|
div().flex().flex_col().children(
|
|
all_modifier_permutations
|
|
.chunks(4)
|
|
.into_iter()
|
|
.map(|chunk| {
|
|
div()
|
|
.flex()
|
|
.gap_4()
|
|
.py_3()
|
|
.children(chunk.map(|permutation| {
|
|
KeyBinding::new(binding(&(permutation.join("-") + "-x")), cx)
|
|
}))
|
|
}),
|
|
),
|
|
)
|
|
.child(Story::label("Single Key with All Modifiers"))
|
|
.child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z"), cx))
|
|
.child(Story::label("Chord"))
|
|
.child(KeyBinding::new(binding("a z"), cx))
|
|
.child(Story::label("Chord with Modifier"))
|
|
.child(KeyBinding::new(binding("ctrl-a shift-z"), cx))
|
|
.child(KeyBinding::new(binding("fn-s"), cx))
|
|
.child(Story::label("Single Key with All Modifiers (Linux)"))
|
|
.child(
|
|
KeyBinding::new(binding("ctrl-alt-cmd-shift-z"), cx)
|
|
.platform_style(PlatformStyle::Linux),
|
|
)
|
|
.child(Story::label("Chord (Linux)"))
|
|
.child(KeyBinding::new(binding("a z"), cx).platform_style(PlatformStyle::Linux))
|
|
.child(Story::label("Chord with Modifier (Linux)"))
|
|
.child(
|
|
KeyBinding::new(binding("ctrl-a shift-z"), cx).platform_style(PlatformStyle::Linux),
|
|
)
|
|
.child(KeyBinding::new(binding("fn-s"), cx).platform_style(PlatformStyle::Linux))
|
|
.child(Story::label("Single Key with All Modifiers (Windows)"))
|
|
.child(
|
|
KeyBinding::new(binding("ctrl-alt-cmd-shift-z"), cx)
|
|
.platform_style(PlatformStyle::Windows),
|
|
)
|
|
.child(Story::label("Chord (Windows)"))
|
|
.child(KeyBinding::new(binding("a z"), cx).platform_style(PlatformStyle::Windows))
|
|
.child(Story::label("Chord with Modifier (Windows)"))
|
|
.child(
|
|
KeyBinding::new(binding("ctrl-a shift-z"), cx)
|
|
.platform_style(PlatformStyle::Windows),
|
|
)
|
|
.child(KeyBinding::new(binding("fn-s"), cx).platform_style(PlatformStyle::Windows))
|
|
}
|
|
}
|