ショートカット
Studio のキーボードショートカットは、パネルに散らばったハードコードされ
たキーチェックではなく、中央のコマンドレジストリ(editor.shortcuts)
によって支えられています。すべてのショートカットはリバインド可能で、競合
は自動的に検出され、メニュー項目には現在のバインディングが表示されます。
デフォルトのショートカット
| コマンド | デフォルト | コンテキスト |
|---|---|---|
| 元に戻す | Ctrl+Z |
グローバル |
| やり直し | Ctrl+Shift+Z, Ctrl+Y |
グローバル |
| コピー | Ctrl+C |
グローバル |
| 切り取り | Ctrl+X |
グローバル |
| 貼り付け | Ctrl+V |
グローバル |
| Play / Stop | Ctrl+P |
グローバル |
| 保存 | Ctrl+S |
グローバル |
| すべて保存 | Ctrl+Shift+S |
グローバル |
| タブを閉じる | Ctrl+W |
グローバル |
| 次/前のタブ | Ctrl+Tab / Ctrl+Shift+Tab |
グローバル |
| 移動 / 回転 / スケールツール | W / E / R |
Scene View(ホバー) |
| 選択にフォーカス | F |
Scene View(ホバー) |
| 名前変更 | F2 |
Hierarchy / Asset Browser(フォーカス時) |
| 削除 | Delete, Backspace |
Hierarchy / Asset Browser(フォーカス時) |
「グローバル」コマンドは、どのパネルにフォーカスがあっても発火します。パ
ネルスコープのコマンド(Scene View のツールキー、Hierarchy/Asset Browser
の名前変更やナビゲーション)は、その特定のパネルが実際に操作しているもの
である間だけ発火します——ビューポートにホバーしている、または行/タイルを
クリックした状態——単にそのパネルが画面のどこかで開いているというだけでは
発火しません。これにより、例えば、Scene View の R キーが、別の場所の名
前変更フィールドに R を入力している最中にギズモをスケールに切り替えてし
まうことを防いでいます。
任意のテキストフィールドに入力している間は、Ctrl または Cmd を押 しながらのもの以外、すべてのショートカットが抑制されます——単純な文字キー や Shift+文字キーは常に編集中のフィールドに届きます。
リバインド
Turian ▸ Settings を開き、サイドバーで Shortcuts カテゴリーを選択 します。各行にはコマンド、それがどのパネルにスコープされているか、そして 現在のバインディングが表示されます:
- バインディングボタンをクリックし、新しいキーの組み合わせを押します。 Esc でキャンセルします。Backspace はバインディングを完全にクリ アします(コマンドは単に「デフォルトに戻す」のではなく、バインドされて いない状態になります)。
- スコープが重なる別のコマンド(2つのグローバルコマンド、またはグローバ ルとパネルスコープのコマンド)と衝突するバインディングの横に、警告アイ コンが表示されます——ホバーすると、どのコマンドと競合しているかが分かり ます。多くのエディターと同様、競合するバインディングは引き続き許可され ます。これは警告であり、厳格なブロックではありません。
- 上書きされた行の横にある元に戻すアイコンは、そのコマンド1つをデフォル トに戻します。Reset All はすべてのコマンドに対して同じことを行いま す。
- リバインドは行った時点で即座に有効になります。Save は設定ファイル に書き込みます。Reload は未保存のリバインドをすべて破棄します。
メニューラベル
登録されたコマンドを持つメニュー項目は、現在のショートカットを右寄せの薄 い文字で表示します。これはレジストリからライブで取得されます——Shortcuts 設定パネルでのリバインドは、同期を保つための別のテキストなしに、次のフレ ームでメニューに反映されます。
プラグイン/モジュール作者向け
コマンドは1つの中央ファイルで宣言されるのではなく、実行時に登録されます
——各機能モジュールが自分自身のコマンドを所有します。これは
studio/main-window/Panels.zig が各パネルに自身を登録させるのと同じ考え
方です:
const Shortcuts = @import("studio/services/Shortcuts.zig");
const my_commands = [_]Shortcuts.CommandDesc{
.{
.id = "myPlugin.doThing",
.title = "Do The Thing",
.context = .global, // または .scene_viewport / .hierarchy / .asset_browser / .ui_editor / .text_input
.requires_focus = false, // これがあなたのパネルが実際に操作されている間にのみ意味を持つ場合は true
.defaults = &.{Shortcuts.Binding.single(.{ .key = .t, .ctrl = true })},
},
};
const my_handlers = [_]?Shortcuts.Handler{myHandler};
// 一度だけ、例えば最初の draw で:
Shortcuts.register(&my_commands, &my_handlers);
自分のパネルにスコープされたコマンド(context が .global 以外)の場合
は、ハンドラーを渡さずに、ハードコードされたキーチェックの代わりに、パネ
ル自身のイベントループ内で直接チェックします:
for (gui.events()) |*e| {
if (Shortcuts.eventMatches(e, "myPlugin.panelAction", panel_is_engaged)) {
e.handle(@src(), my_widget_data);
doPanelAction();
}
}
panel_is_engaged は、あなたにとって「ユーザーが自分のパネルを見ている」
ことが何を意味するかによります——ウィジェットベースのパネルなら実際の dvui
キーボードフォーカス、3D ビューポートのようなフォーカス不可能なサーフェス
ならマウスホバーです。
コマンド ID はネームスペース化された文字列(area.action)で、設定キーの
サフィックス(shortcut.<command_id>)としても機能します——リネームすると
ユーザーの保存済みリバインドが孤立してしまうため、安定させ続けられるもの
を選んでください。