A custom in-window menu bar in the hat (no native menu, D-7), built from the command registry so it stays in sync and satisfies D-6 parity. - Menu model + hybrid resolver (menu_model.dart): a curated File/View/Help tree where a MenuAutoFill node sweeps in unplaced view.* commands; titles + keybindings come from the registry/keymap; unregistered or enabledWhen-false items render disabled (greyed), never hidden. - Widgets: MenuBar row in the hat (chrome tokens), anchored MenuDropdown overlay (dropdown tokens), two-column MenuItemRow with inline keybinding. - Full keyboard: Alt+mnemonic opens (hook in _RootShell._onKey), arrows navigate, Enter activates, Esc closes, Left/Right switch menus. - Commands: file.openFolder / file.newWindow / file.closeWorkspace / help.about, registered by MenuBarExtension(services:). File logic lifted out of the project switcher into FileActions (one source of truth; the switcher now dispatches the commands). Ctrl+O / Ctrl+Shift+N are now real keybindings in default.yaml. - Help → About: version/commit/date/repo from build-info + the bundled dependency licenses parsed from assets/licenses.yaml. Edit/Selection menus are deferred to T-271/T-272 (need focused-surface command routing). Tests: resolver + controller + licenses parse (pure); menu-bar widget (open/close/execute/disabled/Esc/arrow/Enter/Left-Right); FileActions + Open dialog; app-level Alt+F, non-repo dialog, and closeWorkspace. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
98 lines
3.2 KiB
YAML
98 lines
3.2 KiB
YAML
# clide default keymap.
|
|
#
|
|
# This is the baseline preset. Vim / VSCode / JetBrains presets are
|
|
# their own files (T-64/T-65/T-66) and replace bindings via the same
|
|
# YAML shape.
|
|
#
|
|
# Each binding:
|
|
# intent: <stable intent id> # see kernel/src/keymap/intents.dart
|
|
# keys: <chord> | [<chord>, ...] # `ctrl+shift+p`, `cmd+enter`, ...
|
|
# when: <when-clause> # optional; VS-Code-style boolean expr
|
|
#
|
|
# Identifiers in `when:` are scope flags published by producing
|
|
# services (e.g. `palette.open` when ClidePalette is mounted +
|
|
# visible). Missing flags evaluate to false.
|
|
|
|
name: default
|
|
|
|
bindings:
|
|
# -- Activation / focus -----------------------------------------------
|
|
# ActivateIntent has no when-clause: it dispatches via Actions.maybeInvoke
|
|
# against the focused context, so only widgets that opt in (ClideTappable's
|
|
# Actions wrapper) actually catch it. Text-input widgets handle Enter
|
|
# themselves first.
|
|
- intent: activate
|
|
keys: [enter, space]
|
|
- intent: dismiss
|
|
keys: escape
|
|
- intent: focus.next
|
|
keys: tab
|
|
- intent: focus.previous
|
|
keys: shift+tab
|
|
|
|
# Panel-to-panel cycling (sidebar → workspace → context).
|
|
# VS Code convention.
|
|
- intent: focus.nextPanel
|
|
keys: f6
|
|
- intent: focus.previousPanel
|
|
keys: shift+f6
|
|
|
|
# -- Command palette --------------------------------------------------
|
|
- intent: palette.open
|
|
keys: [ctrl+shift+p, meta+shift+p]
|
|
- intent: palette.selectNext
|
|
keys: [down, ctrl+n]
|
|
when: palette.open
|
|
- intent: palette.selectPrevious
|
|
keys: [up, ctrl+p]
|
|
when: palette.open
|
|
- intent: palette.accept
|
|
keys: enter
|
|
when: palette.open
|
|
- intent: dismiss
|
|
keys: escape
|
|
when: palette.open
|
|
|
|
# -- Quick open (fuzzy file finder) -----------------------------------
|
|
# ctrl+p / meta+p are free while the palette is closed; the palette
|
|
# only claims ctrl+p for selectPrevious `when: palette.open`, so this
|
|
# is conflict-free. Arrow/enter/escape inside the overlay are handled
|
|
# locally by the widget.
|
|
- intent: quickOpen.open
|
|
keys: [ctrl+p, meta+p]
|
|
when: "!palette.open"
|
|
# Nav stays on arrows/ctrl+n (not ctrl+p — that's the open chord and
|
|
# would collide while the overlay is up).
|
|
- intent: quickOpen.selectNext
|
|
keys: [down, ctrl+n]
|
|
when: quickOpen.open
|
|
- intent: quickOpen.selectPrevious
|
|
keys: up
|
|
when: quickOpen.open
|
|
- intent: quickOpen.accept
|
|
keys: enter
|
|
when: quickOpen.open
|
|
- intent: dismiss
|
|
keys: escape
|
|
when: quickOpen.open
|
|
|
|
# -- Find in files ----------------------------------------------------
|
|
- intent: findInFiles.open
|
|
keys: [ctrl+shift+f, meta+shift+f]
|
|
|
|
# -- Text scale -------------------------------------------------------
|
|
# On most layouts `+` is `shift+equal`; we bind both so users who
|
|
# think of it as Ctrl+Plus and users who hit Ctrl+= both work.
|
|
- intent: text.scaleIncrease
|
|
keys: [ctrl+equal, ctrl+shift+equal, meta+equal, meta+shift+equal]
|
|
- intent: text.scaleDecrease
|
|
keys: [ctrl+minus, meta+minus]
|
|
- intent: text.scaleReset
|
|
keys: [ctrl+0, meta+0]
|
|
|
|
# -- File (application menu, T-48) -------------------------------------
|
|
- intent: command:file.openFolder
|
|
keys: [ctrl+o, meta+o]
|
|
- intent: command:file.newWindow
|
|
keys: [ctrl+shift+n, meta+shift+n]
|