mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-24 11:01:54 +00:00
Document KeymapFile
and KeymapSection
for display in hovers (#23375)
Release Notes: - N/A
This commit is contained in:
parent
fed4b48c57
commit
4b4876d48a
1 changed files with 33 additions and 3 deletions
|
@ -17,20 +17,50 @@ use serde_json::Value;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
use util::{asset_str, markdown::MarkdownString};
|
use util::{asset_str, markdown::MarkdownString};
|
||||||
|
|
||||||
|
// Note that the doc comments on these are shown by json-language-server when editing the keymap, so
|
||||||
|
// they should be considered user-facing documentation. Documentation is not handled well with
|
||||||
|
// schemars-0.8 - when there are newlines, it is rendered as plaintext (see
|
||||||
|
// https://github.com/GREsau/schemars/issues/38#issuecomment-2282883519). So for now these docs
|
||||||
|
// avoid newlines.
|
||||||
|
//
|
||||||
|
// TODO: Update to schemars-1.0 once it's released, and add more docs as newlines would be
|
||||||
|
// supported. Tracking issue is https://github.com/GREsau/schemars/issues/112.
|
||||||
|
|
||||||
|
/// Keymap configuration consisting of sections. Each section may have a context predicate which
|
||||||
|
/// determines whether its bindings are used.
|
||||||
#[derive(Debug, Deserialize, Default, Clone, JsonSchema)]
|
#[derive(Debug, Deserialize, Default, Clone, JsonSchema)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct KeymapFile(Vec<KeymapSection>);
|
pub struct KeymapFile(Vec<KeymapSection>);
|
||||||
|
|
||||||
|
/// Keymap section which binds keystrokes to actions.
|
||||||
#[derive(Debug, Deserialize, Default, Clone, JsonSchema)]
|
#[derive(Debug, Deserialize, Default, Clone, JsonSchema)]
|
||||||
pub struct KeymapSection {
|
pub struct KeymapSection {
|
||||||
|
/// Determines when these bindings are active. When just a name is provided, like `Editor` or
|
||||||
|
/// `Workspace`, the bindings will be active in that context. Boolean expressions like `X && Y`,
|
||||||
|
/// `X || Y`, `!X` are also supported. Some more complex logic including checking OS and the
|
||||||
|
/// current file extension are also supported - see [the
|
||||||
|
/// documentation](https://zed.dev/docs/key-bindings#contexts) for more details.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
context: String,
|
context: String,
|
||||||
|
/// This option enables specifying keys based on their position on a QWERTY keyboard, by using
|
||||||
|
/// position-equivalent mappings for some non-QWERTY keyboards. This is currently only supported
|
||||||
|
/// on macOS. See the documentation for more details.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
use_key_equivalents: bool,
|
use_key_equivalents: bool,
|
||||||
|
/// This keymap section's bindings, as a JSON object mapping keystrokes to actions. The
|
||||||
|
/// keystrokes key is a string representing a sequence of keystrokes to type, where the
|
||||||
|
/// keystrokes are separated by whitespace. Each keystroke is a sequence of modifiers (`ctrl`,
|
||||||
|
/// `alt`, `shift`, `fn`, `cmd`, `super`, or `win`) followed by a key, separated by `-`.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
bindings: Option<BTreeMap<String, KeymapAction>>,
|
bindings: Option<BTreeMap<String, KeymapAction>>,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
unrecognized_fields: IndexMap<String, Value>,
|
unrecognized_fields: IndexMap<String, Value>,
|
||||||
|
// This struct intentionally uses permissive types for its fields, rather than validating during
|
||||||
|
// deserialization. The purpose of this is to allow loading the portion of the keymap that doesn't
|
||||||
|
// have errors. The downside of this is that the errors are not reported with line+column info.
|
||||||
|
// Unfortunately the implementations of the `Spanned` types for preserving this information are
|
||||||
|
// highly inconvenient (`serde_spanned`) and in some cases don't work at all here
|
||||||
|
// (`json_spanned_>value`). Serde should really have builtin support for this.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl KeymapSection {
|
impl KeymapSection {
|
||||||
|
@ -42,9 +72,9 @@ impl KeymapSection {
|
||||||
/// Keymap action as a JSON value, since it can either be null for no action, or the name of the
|
/// Keymap action as a JSON value, since it can either be null for no action, or the name of the
|
||||||
/// action, or an array of the name of the action and the action input.
|
/// action, or an array of the name of the action and the action input.
|
||||||
///
|
///
|
||||||
/// Unlike the other deserializable types here, this doc-comment will not be included in the
|
/// Unlike the other json types involved in keymaps (including actions), this doc-comment will not
|
||||||
/// generated JSON schema, as it manually defines its `JsonSchema` impl. The actual schema used for
|
/// be included in the generated JSON schema, as it manually defines its `JsonSchema` impl. The
|
||||||
/// it is automatically generated in `KeymapFile::generate_json_schema`.
|
/// actual schema used for it is automatically generated in `KeymapFile::generate_json_schema`.
|
||||||
#[derive(Debug, Deserialize, Default, Clone)]
|
#[derive(Debug, Deserialize, Default, Clone)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct KeymapAction(Value);
|
pub struct KeymapAction(Value);
|
||||||
|
|
Loading…
Reference in a new issue