Hazel

Keyboard Shortcuts

Every default editor shortcut, the command palette, and how to rebind keys to your liking.

Shortcuts are an editor-only feature. They live in the renzora_keybindings crate (KeybindingsPlugin), and the action/binding types are defined in renzora::core::keybindings (EditorAction, KeyBinding, KeyBindings) so other editor plugins can dispatch them. Because the whole editor ships as the removable renzora_editor bundle, none of these bindings exist in an exported game.

The fastest way to find any command is the command palette — press Ctrl+P and start typing. It lists every tool, action, panel, and layout with its current keybinding, so you rarely need to memorize the tables below.

Command palette

Press Ctrl+P to open the command palette (renzora_command_palette). It is a fuzzy-searchable modal that aggregates, with zero per-plugin wiring:

  • Registered tools from the toolbar (only those visible in the current context).
  • Plugin shortcuts registered via register_shortcut, each showing its current binding.
  • Every built-in editor action (the EditorAction enum), shown with its key and dispatched exactly as a real key press.
  • LayoutsSwitch to <Workspace>.
  • PanelsOpen <Panel> (focuses it if already docked).
  • Settings tabs, File menu commands, and Documentation links.

Scope tabs. A tab strip under the search box narrows what you're searching:

TabSearchesPicking a result
CommandsEverything above (the default)Runs it
EntitiesNamed entities in the open sceneSelects the entity
SettingsSettings tabsOpens Settings on that tab
Docsrenzora.com documentation (live search)Opens the page in your browser
ForumForum threadsOpens the thread in the Forum panel
UsersCommunity membersOpens their profile
FeedRecent community-feed postsOpens the post, comments expanded
CoursesLearning coursesOpens the Docs panel
MarketplaceStore assets (server-side search)Opens the marketplace overlay

The remote tabs (Docs → Marketplace) query renzora.com as you type, debounced; Docs/Forum/Users want at least two characters, while Feed/Courses/Marketplace list their latest content even with an empty query.

KeyAction
Ctrl+POpen / close the palette
TypeFilter by label or category
Up / DownMove selection
EnterRun the selected command
EscDismiss

Camera

Movement keys are active only while you hold the right mouse button to fly. The same W E Q letters switch gizmo tools when you are not flying (see below) — they never conflict because flying gates them.

KeyAction
W A S DFly forward / left / back / right (hold right-click)
E / QFly up / down (hold right-click)
Left ShiftFly faster (hold)
FFocus selected
HomeReset camera
AFrame all
EndMove camera to cursor
] / [Camera speed up / down
LToggle pivot lock

View angles

Blender-style numpad views; the Ctrl modifier gives the opposite view.

KeyAction
Numpad 1 / Ctrl+Numpad 1Front / Back
Numpad 3 / Ctrl+Numpad 3Right / Left
Numpad 7 / Ctrl+Numpad 7Top / Bottom
Numpad 5Toggle perspective / orthographic

Tools

These set the persistent gizmo handle (ActiveTool). They fire only when the right mouse button is not held and no modal transform is in progress.

KeyAction
QSelect
WTranslate (move)
ERotate
RScale

Modal transforms (Blender-style)

With at least one entity selected (and the viewport in Scene mode), these start a real-time modal transform driven by mouse movement.

KeyAction
GGrab (move)
RRotate
SScale

While a modal transform is active:

KeyAction
X / Y / ZConstrain to that axis
Shift+X / Shift+Y / Shift+ZConstrain to the opposite plane
Type digits / . / -Enter a precise value
Enter or left-clickConfirm
Esc or right-clickCancel

Selection

Mouse picking happens in the viewport; the keyboard handles the rest.

InputAction
Left-clickSelect (replace)
Ctrl+ClickToggle selection
Shift+ClickAdd to selection
Left-dragBox (marquee) select
EscDeselect all
Ctrl+ASelect all
XSelect under cursor
VMove selection to cursor
Ctrl+DDuplicate
Alt+DDuplicate and move (starts a modal grab)
DeleteDelete
F2Rename
H / Shift+HHide selected / isolate selected

Hierarchy

These act on the selected row, and only while the Hierarchy is the panel you last clicked in — so the same keys stay free for the 2D nudge in the viewport, frame-stepping in the Timeline, and arrow-key panel scrolling everywhere else.

KeyAction
/ Move the selection to the previous / next visible row
Expand the selected branch; step into its first child if it's already open
Collapse the selected branch; step out to the parent if it's already closed
F2Rename in place (double-click does the same)

/ walk what you can see: a collapsed branch is stepped past, not through, and the list scrolls to follow the selection when it reaches an edge. Shift+/ doesn't extend the selection — use Shift+click for a range.

Clicking a row also folds it open (and shut again when the click deselects it). Turn that off at Settings → Interface → Hierarchy → Toggle on Click to leave folding entirely to the caret and these two keys.

Edit

KeyAction
Ctrl+ZUndo
Ctrl+YRedo
Ctrl+C / Ctrl+VCopy / Paste
Ctrl+ACreate node

Undo/redo are command-based (renzora_undo). Redo defaults to Ctrl+Y — there is no Ctrl+Shift+Z binding out of the box. History is per-context (scene, material graph, blueprint, …), depth-capped at 500, and exposed in the History panel.

File

KeyAction
Ctrl+NNew scene
Ctrl+OOpen scene
Ctrl+SSave scene; also saves the open material graph when the Material Graph panel is a visible tab (material_graph.save, rebindable)
Ctrl+Shift+SSave scene as
Ctrl+,Open Settings

View

KeyAction
Alt+ZToggle wireframe
Alt+Shift+ZToggle lighting
Ctrl+GToggle grid
Ctrl+SpaceToggle bottom panel — slides open to 40% of the editor's height
TToggle snap
Shift+TToggle edge snap
Alt+TToggle scale-from-bottom
Ctrl+0Reset UI scale to 100%

Wireframe is Alt+Z (not bare Z) and lighting is Alt+Shift+Z. Plain Z was dropped because it clashed with Ctrl+Z and the gizmo tool keys.

Play

KeyAction
F5Play / Stop

Code editor

These apply when the Code panel has keyboard focus (category "Code Editor"). Several reuse chords that mean something else in the viewport (Ctrl+S, Ctrl+G, Ctrl+D, Ctrl+Space) — focus decides which action fires.

KeyAction
Ctrl+S / Ctrl+Shift+SSave file / save all
Ctrl+WClose tab
Ctrl+Tab / Ctrl+Shift+TabNext / previous tab
Ctrl+F / Ctrl+HFind / replace
Ctrl+GGo to line
Ctrl+/ / Ctrl+Shift+/Toggle line / block comment
Ctrl+SpaceTrigger autocomplete
Ctrl+DSelect next occurrence
Ctrl+Shift+DDuplicate line
Ctrl+Shift+KDelete line
Alt+Up / Alt+DownMove line up / down
Ctrl+Alt+Up / Ctrl+Alt+DownAdd cursor above / below
Shift+EscClear extra cursors
F12Go to definition
Ctrl+Shift+FFormat document
Ctrl+Alt+DShow diff vs saved
Ctrl+Shift+[Toggle fold
Ctrl+\Split editor right

Customizing shortcuts

Open Settings → Shortcuts (or Ctrl+, then the Shortcuts tab) to rebind any action. Each binding is a key plus the Ctrl / Shift / Alt modifiers, and modifier matching is exact — Ctrl+S will not fire if Shift is also held. Rebound keys are respected everywhere, including the command palette and programmatic dispatches.

Some defaults intentionally overlap: A is both Frame All and the fly-left key, and Ctrl+A is both Select All and Create Node. Context (whether you are flying, what panel is focused, what is selected) decides which one runs. If a chord feels ambiguous, rebind it here.

Plugin shortcuts

Plugins add their own commands through the editor SDK, and they appear in the command palette and the Shortcuts settings automatically. Register a ShortcutEntry with a default KeyBinding:

use bevy::prelude::*;
use renzora::core::keybindings::KeyBinding;
use renzora_editor_framework::{AppEditorExt, ShortcutEntry};

fn build(app: &mut App) {
    app.register_shortcut(ShortcutEntry::new(
        "my_plugin.do_thing",          // stable id
        "Do The Thing",                // display name
        "My Plugin",                   // category
        KeyBinding::new(KeyCode::KeyP).ctrl().shift(),
        |world: &mut World| {
            // handler runs with full &mut World access
        },
    ));
}

The id is stable so user-customized bindings survive plugin reloads. This is exactly how the command palette itself registers Ctrl+P (command_palette.toggle).