Skip to main content

Keymap

Struct Keymap 

Source
pub struct Keymap { /* private fields */ }
Expand description

The set of key bindings for the application, and the rules for choosing among them.

Usually you don’t build a Keymap yourself. App holds one, and App::bind_keys adds to it. It is also the place where the precedence rules are implemented, so this is the reference for how a keystroke resolves.

§Examples

use gpui::{Action, KeyBinding, KeyContext, Keymap, Keystroke, actions};

actions!(keymap_docs, [Save, Format]);

let keymap = Keymap::new(vec![
    KeyBinding::new("cmd-s", Format, Some("Workspace")),
    KeyBinding::new("cmd-s", Save, Some("Editor")),
]);

// In an editor inside a workspace, the deeper `Editor` binding wins.
let typed = [Keystroke::parse("cmd-s").unwrap()];
let context = [
    KeyContext::parse("Workspace").unwrap(),
    KeyContext::parse("Editor").unwrap(),
];
let (bindings, pending) = keymap.bindings_for_input(&typed, &context);
assert_eq!(bindings[0].action().name(), "keymap_docs::Save");
assert!(!pending);

See keyboard input for the full precedence rules as they apply during dispatch.

Implementations§

Source§

impl Keymap

Source

pub fn new(bindings: Vec<KeyBinding>) -> Self

Creates a keymap that contains bindings, in the order given.

Source

pub fn version(&self) -> KeymapVersion

Returns the current version. See KeymapVersion.

Source

pub fn add_bindings<T: IntoIterator<Item = KeyBinding>>(&mut self, bindings: T)

Adds bindings after the existing ones and changes the version.

A binding added later wins over an earlier one at the same depth. Add the user’s bindings after the defaults so that they take precedence.

Source

pub fn clear(&mut self)

Removes every binding and changes the version.

Source

pub fn bindings( &self, ) -> impl DoubleEndedIterator<Item = &KeyBinding> + ExactSizeIterator

Iterates over all bindings, in the order they were added.

The iterator includes NoAction and Unbind entries.

Source

pub fn bindings_for_action<'a>( &'a self, action: &'a dyn Action, ) -> impl 'a + DoubleEndedIterator<Item = &'a KeyBinding>

Iterates over the bindings that run action, in the order they were added.

Bindings disabled by a later NoAction or Unbind are left out. This ignores key contexts, so a binding is included even when it can’t fire in the current focus. To find the bindings that apply now, use Window::bindings_for_action. For a shortcut label, use the last binding, which was added most recently.

Source

pub fn all_bindings_for_input(&self, input: &[Keystroke]) -> Vec<KeyBinding>

Returns every binding that matches all of input, ignoring key contexts.

The bindings are in precedence order: the most recently added comes first. Bindings that need more keystrokes than input are left out. NoAction and Unbind entries that match are included, but their effect on other bindings is not applied.

Source

pub fn bindings_for_input( &self, input: &[impl AsKeystroke], context_stack: &[KeyContext], ) -> (SmallVec<[KeyBinding; 1]>, bool)

Returns the bindings that match input in context_stack, and whether a longer input could still match a binding.

The first value holds the matching bindings, highest precedence first. The second value is true when some binding needs more keystrokes than input, so the caller should wait for the next keystroke.

Precedence works as follows:

  • Depth. A binding’s depth is the deepest point in context_stack where its predicate matches. A binding in a deeper context wins over one in a shallower context. A binding without a context is as deep as the stack, so it is at least as deep as any context-specific binding. At equal depth, the order rule below decides.
  • Order. At the same depth, the binding added later wins.
  • NoAction. A winning NoAction removes the lower-precedence bindings for the same keystrokes, unless they come from a stronger source. See KeyBindingMetaIndex.
  • Unbind. A winning Unbind removes the lower-precedence binding for the same keystrokes that runs the action it names, whatever that binding’s context.

Several bindings can be returned, because a match that isn’t suppressed stays in the list.

§Examples
use gpui::{Action, KeyBinding, KeyContext, Keymap, Keystroke, actions};

actions!(input_docs, [Save, Format]);

let keymap = Keymap::new(vec![
    KeyBinding::new("cmd-s", Format, Some("Workspace")),
    KeyBinding::new("cmd-s", Save, Some("Editor")),
]);

// The `Editor` binding is at depth 2 and the `Workspace` binding at depth 1.
let (bindings, _) = keymap.bindings_for_input(
    &[Keystroke::parse("cmd-s").unwrap()],
    &[
        KeyContext::parse("Workspace").unwrap(),
        KeyContext::parse("Editor").unwrap(),
    ],
);
assert_eq!(bindings[0].action().name(), "input_docs::Save");
Source

pub fn possible_next_bindings_for_input( &self, input: &[Keystroke], context_stack: &[KeyContext], ) -> Vec<KeyBinding>

Returns the bindings that input could still complete with more keystrokes, highest precedence first, for the given context_stack.

Use it to list the shortcuts available after a prefix, such as after ctrl-k. Bindings that match input exactly, and NoAction and Unbind entries, are not included.

Trait Implementations§

Source§

impl Default for Keymap

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl !RefUnwindSafe for Keymap

§

impl !Send for Keymap

§

impl !Sync for Keymap

§

impl !UnwindSafe for Keymap

§

impl Freeze for Keymap

§

impl Unpin for Keymap

§

impl UnsafeUnpin for Keymap

Blanket Implementations§

Source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, D: AdaptFrom<S, Swp, Dwp, T>,

Source§

fn adapt_into_using<M>(self, method: M) -> D
where M: TransformMatrix<T>,

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the specified method.
Source§

fn adapt_into(self) -> D

👎Deprecated since 0.7.7:

replaced by palette::chromatic_adaptation::AdaptIntoUnclamped

Convert the source color to the destination color using the bradford method by default.
Source§

impl<T, C> AdaptIntoUnclamped<T> for C
where T: AdaptFromUnclamped<C>,

Source§

type Scalar = <T as AdaptFromUnclamped<C>>::Scalar

The number type that’s used as the color’s components.
Source§

fn adapt_into_unclamped_with<M>(self) -> T

Adapt a color of type Self into a color of type T, using the custom matrix M. Read more
Source§

fn adapt_into_unclamped(self) -> T
where Bradford: LmsToXyz<Self::Scalar> + XyzToLms<Self::Scalar>,

Adapt a color of type Self into a color of type T, using the Bradford matrix. Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, C> ArraysFrom<C> for T
where C: IntoArrays<T>,

Source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
Source§

impl<T, C> ArraysInto<C> for T
where C: FromArrays<T>,

Source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where T: FromCam16Unclamped<WpParam, U>,

Source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

Source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
Source§

impl<T, C> ComponentsInto<C> for T

Source§

fn components_into(self) -> C

Cast this collection of color components into a collection of colors. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromAngle<T> for T

Source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
Source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

Source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> IntoAngle<U> for T
where U: FromAngle<T>,

Source§

fn into_angle(self) -> U

Performs a conversion into T.
Source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where T: Cam16FromUnclamped<WpParam, U>,

Source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

Source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
Source§

impl<T, U> IntoColorUnclamped<U> for T
where U: FromColorUnclamped<T>,

Source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoStimulus<T> for T

Source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

Source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
Source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

Source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
Source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

Source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
Source§

impl<C, U> UintsInto<C> for U
where C: FromUints<U>,

Source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more