☰
RPFM 键盘快捷键完全指南:默认按键、作用域机制与自定义方案
2026/10/14 2:13:13 网站建设 项目流程
  • 游戏开发
  • 桌面应用
  • 开发工具
  • MCP 服务

【免费下载链接】rpfm

Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games.

项目地址:https://gitcode.com/gh_mirrors/rp/rpfm
点击查看免费下载

RPFM(Rusted PackFile Manager)为几乎所有高频操作预置了键盘快捷键,并允许用户在PackFile → Settings → Shortcuts中一键重绑定全部按键。本文以 docs/reference/shortcuts.md 为骨架,逐表给出全部默认按键,并结合仓库源码(3rdparty/src/qt_rpfm_extensions/下的 C++ 实现与rpfm_ui/下的 Rust 接线)讲解作用域(Scope)机制、命令面板兜底、绑定持久化与重置等底层原理,帮助你掌握"记住默认值 → 按需重绑 → 排查冲突"的完整工作流。

提示:与快捷键配套的设置项(语言、路径、表编辑器行为等)见 docs/reference/settings.md,遥测开关见 docs/reference/telemetry.md。

1. 快捷键体系总览

RPFM 的快捷键体系由三个要素构成:

  • Action(动作):一个可执行的操作,如"新建 Pack""添加行""删除字段"。
  • Collection(集合):KDE 概念,一组动作的归属分组,如pack_menu(Pack 菜单)、table_editor(表格编辑器)、decoder(解码器)。每个集合都有独立的componentDisplayName(显示名)。
  • Scope(作用域):按键在什么焦点条件下生效,分ApplicationShortcut(应用级,任何地方都触发)与WidgetShortcut(控件级,仅当对应控件获得焦点时触发)。

这套机制决定了:大多数快捷键是按作用域可配置的,同一个按键可能在某一个控件(如表编辑器)中合法触发,而在另一个控件中完全无绑定。例如Ctrl+D在 Pack 树中默认是"新建 DB",在表格编辑器中则是"克隆并插入行"——两者属于不同的集合与控件,互不冲突。

打开快捷键设置对话框的路径为:

PackFile → Settings → Shortcuts(偏好设置对话框底部有一个Shortcuts按钮)

对话框中显示的是 KDE 标准KShortcutsDialog,按集合(collection)分组列出所有动作,并对同一作用域内的按键冲突给出标记。中文界面下该按钮文案来自 locale/Chinese_cn.ftl 的shortcut_title = 快捷键。

2. 打开与使用快捷键设置对话框

  1. 打开偏好设置对话框:PackFile → Settings(或直接按Ctrl+,)。
  2. 点击对话框底部的Shortcuts按钮,弹出独立的快捷键设置窗口。
  3. 按集合浏览动作(Pack Menu、View Menu、Pack Tree Context Menu、Table Editor、Decoder 等),点击某个绑定即可编辑;同一作用域内的冲突会被标记。

Rust 侧的触发代码位于 rpfm_ui/src/settings_ui/slots.rs:

// What happens when we hit the "Shortcuts" button. let shortcuts = SlotNoArgs::new(&ui.dialog, clone!( ... rpfm_telemetry::track_action("Settings: Open Shortcuts Dialog"); crate::ffi::kshortcut_dialog_init_safe(&ui.dialog.static_upcast::<QWidget>().as_ptr(), app_ui.shortcuts().as_ptr()); ... ));

按钮的构建在 rpfm_ui/src/settings_ui/mod.rs(文案取qtr("shortcut_title")),信号连接在 rpfm_ui/src/settings_ui/connections.rs。每次打开都会记录一条遥测事件Settings: Open Shortcuts Dialog。

C++ 侧的实现位于 3rdparty/src/qt_rpfm_extensions/src/kshortcuts_dialog.cpp:

extern "C" void kshortcut_dialog_init(QWidget* widget, QList<QObject*>* shortcuts) { KShortcutsDialog* dialog = new KShortcutsDialog(widget); for (i = shortcuts->begin(); i != shortcuts->end(); ++i) { KActionCollection* actions = dynamic_cast<KActionCollection*>(*i); dialog->addCollection(actions); } dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->configure(true); // 显示配置界面;接受时写回设置 }

configure(true)表示以"配置模式"打开对话框,用户在对话框中修改并确认后,所有绑定会通过 KDE 标准的KActionCollection::writeSettings写回磁盘。

3. 作用域机制:为什么同一个键在不同界面行为不同

每个动作在注册时就固定了快捷键上下文(Qt::ShortcutContext),见new_action辅助函数(kshortcuts_dialog.cpp):

void new_action(KActionCollection* actions, QString const action_name, QString const display_name, Qt::ShortcutContext context, QList<QKeySequence> shortcut, QString const icon_name = "") { QAction* action = actions->addAction(action_name); action->setText(display_name); action->setIcon(QIcon::fromTheme(icon_name)); action->setShortcutContext(context); actions->setDefaultShortcuts(action, shortcut); }

从源码可以总结出以下规律:

上下文含义典型集合
ApplicationShortcut应用级快捷键,任何界面焦点下都触发pack_menu、view_menu、file_tab、command_palette、about_menu、mymod_menu等
WidgetShortcut控件级快捷键,仅当目标控件(或其子控件)获得焦点时触发pack_tree_context_menu、table_editor、decoder、portrait_settings、unit_variant等

控件级绑定是"复用按键而不冲突"的关键:Ctrl+D在 Pack 树获得焦点时是"新建 DB",在表格获得焦点时是"克隆并插入行",同一时间只有一个控件持有焦点,因此互不干扰。KShortcutsDialog只在同一作用域内检测并标记冲突。

同样值得注意的是解码器中的双义绑定:Ctrl+Del同时分配给delete_field(删除字段)和delete_definition(删除定义)——两者都在decoder集合中,但一个作用于字段主表、一个作用于定义列表,属于设计上的复用。

4. 默认快捷键速查表

以下全部为源码中定义的默认值(可逐条在 kshortcuts_dialog.cpp 中核对),任何绑定都可按个人习惯重绑。

4.1 Pack 菜单(pack_menu集合)

动作默认快捷键
New PackCtrl+N
Open PacksCtrl+O
Open & Merge PacksCtrl+Shift+O
Save All PacksCtrl+S
Save Current PackCtrl+Shift+S
Install PackCtrl+Shift+I
Uninstall PackCtrl+Shift+U
Load All CA PacksCtrl+G
SettingsCtrl+,
Quit(无绑定)

两个保存动作的分工需要特别说明:Save All Packs(Ctrl+S)保存所有已打开的 Pack;Save Current Pack(Ctrl+Shift+S)只保存当前焦点文件/标签所属的那个 Pack。在源码中,save_all作为一个可见菜单动作加入 Pack 菜单(rpfm_ui/src/app_ui/mod.rs),而save_current是隐藏动作——只挂到主窗口上保留其Ctrl+Shift+S快捷键,不显示在菜单里(app_ui/mod.rs):

// Hidden action for the Ctrl+Shift+S shortcut. let packfile_save_current = add_action_to_widget(shortcuts.as_ref(), "pack_menu", "save_current", Some(main_window.static_upcast::<qt_widgets::QWidget>()));

"另存为"(Save Pack As)没有全局快捷键,而是通过 Pack 根节点的右键菜单和文件标签页的右键菜单暴露。

4.2 文件标签页(file_tab集合)

动作默认快捷键
Close TabCtrl+W
Previous TabCtrl+Shift+Tab
Next TabCtrl+Tab
Toggle Quick Notes(无绑定)
Import From Dependencies(无绑定)

标签页右键菜单还提供了"关闭左侧全部标签""关闭右侧全部标签""关闭其他全部标签""关闭全部标签"等动作,它们默认无快捷键,可在对话框中自行绑定。

4.3 视图菜单(view_menu集合)

动作默认快捷键
Toggle Global SearchCtrl+Shift+F
Toggle Pack Contents(无绑定)
Toggle Diagnostics(无绑定)
Toggle Dependencies(无绑定)
Toggle References(无绑定)

五个面板开关中只有"全局搜索"预置了Ctrl+Shift+F,其余默认无绑定,建议按使用频率在对话框中为常用面板(如 Diagnostics、Dependencies)补上快捷键。

4.4 命令面板(command_palette集合)

动作默认快捷键
Open file paletteCtrl+P
Open command paletteCtrl+Shift+P

这两个动作注册时加入了 Pack 菜单以继承其快捷键,随后立即从菜单中移除(app_ui/mod.rs),只作为隐藏快捷键存在:

// Command Palette actions (not in any menu, just shortcuts). let command_palette_open_files = add_action_to_menu(&menu_bar_packfile, shortcuts.as_ref(), "command_palette", "open_file_palette", "command_palette_open_files", ...); let command_palette_open_commands = add_action_to_menu(&menu_bar_packfile, shortcuts.as_ref(), "command_palette", "open_command_palette", "command_palette_open_commands", ...); // Remove these from the menu — they're only needed for their shortcuts. menu_bar_packfile.remove_action(&command_palette_open_files); menu_bar_packfile.remove_action(&command_palette_open_commands);

4.5 Pack 树(pack_tree_context_menu集合,上下文作用域)

动作默认快捷键
Add FileCtrl+A
Add FolderCtrl+Shift+A
Add From PackCtrl+Alt+A
New FolderCtrl+F
New DBCtrl+D
New LocCtrl+L
New TextCtrl+T
New Quick FileCtrl+Q
New AnimPack / Portrait Settings(无绑定)
Merge FilesCtrl+M
DeleteDel
ExtractCtrl+E
Rename / MoveCtrl+R或F2
CopyCtrl+C
CutCtrl+X
PasteCtrl+V
DuplicateCtrl+Shift+D
Open with DecoderCtrl+J
Open with External ProgramCtrl+K
Open Pack NotesCtrl+Y
Expand AllCtrl++
Collapse AllCtrl+-

注意Rename / Move在源码中同时绑定了两个按键序列(kshortcuts_dialog.cpp):

new_action(pack_tree_actions, "rename", "Rename", Qt::ShortcutContext::WidgetShortcut, {QKeySequence("Ctrl+R"), QKeySequence("F2")}, "edit-move");

Ctrl++/Ctrl+-的展开/折叠快捷键也被 Dependencies 树、AnimPack 树等共享(各自独立集合),由于这些树不同时聚焦,复用不会冲突。

4.6 表格编辑器(DB / Loc,table_editor集合)

动作默认快捷键
Add RowCtrl+Shift+A
Insert RowCtrl+I
Delete RowCtrl+Del
Delete Filtered-Out RowsCtrl+Shift+Del
Clone & Insert RowCtrl+D
Clone & Append RowCtrl+Shift+D
CopyCtrl+C
Copy as LUA TableCtrl+Shift+C
PasteCtrl+V
Paste as New RowCtrl+Shift+V
Rewrite SelectionCtrl+Y
Invert SelectionCtrl+-
SearchCtrl+F
Undo / RedoCtrl+Z/Ctrl+Shift+Z
Smart DeleteDel
Find References / Go To Definition / Go To File / Patch Columns / Generate IDs / Import TSV / Export TSV / 等(无绑定)

表格编辑器是 RPFM 中快捷键密度最高的区域,常用工作流建议掌握:Ctrl+I插入行、Ctrl+D克隆插入、Ctrl+Shift+D克隆追加、Ctrl+Shift+V粘贴为新行、Ctrl+Shift+Del批量删除被过滤掉的行。无绑定的高级动作(如Copy as LUA Table之外的重命名引用、打补丁列等)都可通过命令面板执行。

4.7 解码器(decoder集合)

动作默认快捷键
Move Field UpCtrl+Up
Move Field DownCtrl+Down
Move Field LeftCtrl+Left
Move Field RightCtrl+Right
Delete FieldCtrl+Del
Delete DefinitionCtrl+Del
Load DefinitionCtrl+L

解码器用于查看/编辑无法直接用表格或文本呈现的二进制 PackedFile。四个方向键用于在字段树中移动当前字段;Ctrl+Del同时承担"删除字段"与"删除定义"两个动作,分别作用于解码字段表和定义表。

4.8 文本编辑器(KTextEditor)

文本编辑器是一个KTextEditor控件,快捷键遵循你的 KDE 键盘配置。RPFM 做了两处针对性改造(text_editor.cpp):

// Remove the save and saveAs actions, as we don't support saving to disk and interfere with RPFM. KActionCollection* actions = view->actionCollection(); actions->removeAction(actions->action("file_save")); actions->removeAction(actions->action("file_save_as"));
  • 移除 KTextEditor 自带的"保存到磁盘 / 另存为"动作(文本编辑器的数据必须保存回 Pack,而不是磁盘文件)。
  • 保存回 Pack 复用全局Ctrl+S(即 4.1 的 Save All Packs)。
  • 查找/替换仍用 KTextEditor 标准Ctrl+F/Ctrl+R,其余编辑快捷键(剪切、复制、粘贴、撤销、多光标等)均为 KTextEditor 标准行为。

文本视图的"修改状态"通过 C++ 侧的哑元控件(DummyQLineEdit)把textChanged信号转发给 Rust 侧(text_editor.cpp),由 rpfm_ui/src/packedfile_views/text/slots.rs 标记文件为已修改——这也是Ctrl+S能正确触发保存的前提之一。

5. 源码中定义、但文档未单列的其他默认快捷键

除了上文速查表,shortcut_collection_init(kshortcuts_dialog.cpp)还注册了以下集合的默认绑定,它们在快捷键对话框中同样可查、可改:

MyMod 菜单(mymod_menu)

动作默认快捷键
Import MyModCtrl+Alt+I
Export MyModCtrl+Alt+E
Import All Open MyModsCtrl+Alt+Shift+I
Export All Open MyModsCtrl+Alt+Shift+E

About 菜单(about_menu)

动作默认快捷键
Open ManualCtrl+H
Check UpdatesCtrl+U
Check Schema UpdatesCtrl+Shift+U

Portrait Settings(portrait_settings集合)

动作默认快捷键
AddCtrl+A
CloneCtrl+D
DeleteCtrl+Del
Delete Filtered Out RowsCtrl+Shift+Del

Unit Variant(unit_variant集合)

动作默认快捷键
AddCtrl+A
CloneCtrl+D
DeleteCtrl+Del

Translator(translator集合,工具类)

动作默认快捷键
Move UpCtrl+Up
Move DownCtrl+Down
Import from translated PackCtrl+I

此外还有dependencies_context_menu(Dependencies 树:展开/折叠、从依赖导入/提取)、diagnostics_context_menu(诊断表:各种"忽略"操作)、anim_pack_tree_context_menu与secondary_pack_tree_context_menu(AnimPack 树的展开/折叠)等集合,均无默认绑定或复用Ctrl++/Ctrl+-,可在对话框中按需配置。

6. 命令面板:快捷键的万能兜底

即使记不住任何快捷键,命令面板也能覆盖所有动作:

  • Ctrl+P:打开文件面板(Go to File),快速跳转文件。
  • Ctrl+Shift+P:打开命令面板,输入动作名称即可启动。

命令面板的实现位于 rpfm_ui/src/command_palette_ui/mod.rs,核心逻辑是:

  1. 递归收集主菜单栏、Pack 树右键菜单、文件标签页右键菜单、以及当前活动文件视图(Table / Decoder / Unit Variant / Portrait Settings 等)右键菜单中所有已启用的动作;
  2. 为每个动作生成一行条目,显示文本 + 详情行(优先用动作的statusTip作为描述;无描述时显示"类别 [快捷键]");
  3. 输入关键字实时过滤,回车触发选中动作(action.trigger())。

因此命令面板可以做到完全替代记忆快捷键:只要动作存在,就能通过名称启动。这也是文档强调"命令面板是万能兜底"(the universal fallback)的源码依据。

7. 底层实现:从 KDE 动作集合到 Rust 的接线

理解整个快捷键系统的运转,只需看懂三条链路:

7.1 动作的注册(C++ 侧)

shortcut_collection_init(kshortcuts_dialog.cpp)创建了 19 个KActionCollection,按组件名(componentName)区分:pack_menu、mymod_menu、view_menu、command_palette、game_selected_menu、about_menu、file_tab、pack_tree_context_menu、dependencies_context_menu、diagnostics_context_menu、anim_pack_tree_context_menu、secondary_pack_tree_context_menu、table_editor、decoder、portrait_settings、unit_variant、translator、text_editor。每个集合在定义完默认绑定后立即调用readSettings(),把用户此前的自定义覆盖读回来。

7.2 Rust 侧的查找与拷贝(FFI 边界)

Rust 侧持有这些集合的QListOfQObject指针(app_ui/mod.rs):

let shortcuts = QListOfQObject::new_0a(); shortcut_collection_init_safe(&main_window.static_upcast::<qt_widgets::QWidget>().as_ptr(), shortcuts.as_ptr());

菜单与上下文菜单中的动作通过 rpfm_ui/src/utils/mod.rs 的两个辅助函数挂接:

pub unsafe fn add_action_to_menu(menu: &QPtr<QMenu>, shortcuts: Ref<QListOfQObject>, action_group: &str, action_name: &str, action_translation_key: &str, associated_widget: Option<QPtr<QWidget>>) -> QPtr<QAction> { let action = shortcut_action_safe(shortcuts.as_ptr(), QString::from_std_str(action_group).into_ptr(), QString::from_std_str(action_name).into_ptr()); action.set_text(&qtr(action_translation_key)); menu.add_action_q_action(action.as_ptr()); if let Some(associated_widget) = associated_widget { associated_widget.add_action_q_action(action.as_ptr()); } action } pub unsafe fn add_action_to_widget(shortcuts: Ref<QListOfQObject>, action_group: &str, action_name: &str, associated_widget: Option<QPtr<QWidget>>) -> QPtr<QAction> { // 只挂到控件上(隐藏快捷键),不加入任何菜单 ... }

C++ 侧shortcut_action(kshortcuts_dialog.cpp)按(action_group, action_name)在集合中查找,并新建一个 QAction 拷贝返回(复制文本、图标、快捷键与上下文),而不是返回原动作——源码注释明确说明这是为了避免重复触发问题。这也是 Rust 侧能够"加入菜单、加入控件、甚至从菜单移除"而互不干扰的原因。

7.3 文本编辑器快捷键的取舍

文本编辑器集合直接取用 KTextEditor 视图自带的actionCollection()(kshortcuts_dialog.cpp),因此 KTextEditor 的全部标准快捷键天然可用,无需 RPFM 重复注册。

8. 绑定持久化与重置

快捷键绑定不存放在 RPFM 自己的设置文件(settings.json)中,而是通过 KDE 标准的KActionCollection::writeSettings/readSettings持久化(对话框接受时写、启动注册集合时读)。

  • 应用标识在 rpfm_ui/src/main.rs 中设置:组织名FrodoWazEre、应用名rpfm。
  • 在 Linux 上,绑定通常落入~/.config/下的 KConfig rc 文件(文档描述为~/.config/<orgname>rc形式,具体文件名取决于 Qt/KDE 对 org/app 名的组合方式)。
  • Windows / macOS 上则落在 QtQSettings对应的注册表项或 plist 中。

因此"重置快捷键"的正确做法是:

  1. 打开PackFile → Settings → Shortcuts;
  2. 使用对话框自带的Defaults动作将所有绑定恢复为源码默认值;
  3. 确认后对话框会把新值写回。

与快捷键不同,RPFM 的常规设置由服务端权威保存于<config>/settings.json(Linux 如~/.config/rpfm/,Windows 如%AppData%\rpfm\),详见 docs/reference/settings.md。两者的存储与恢复机制相互独立。

9. 实用建议

  • 优先掌握应用级快捷键:Ctrl+N/Ctrl+O/Ctrl+S/Ctrl+Shift+S/Ctrl+,(设置)与Ctrl+W(关标签)、Ctrl+Tab(切标签)是最高频操作。
  • 表编辑三连:Ctrl+I(插入行)、Ctrl+D(克隆插入)、Ctrl+Shift+V(粘贴为新行)能显著提升改表效率。
  • 同名复用不慌:Ctrl+D、Ctrl+L、Ctrl+Del在不同控件中有不同含义,属作用域设计;若在同一作用域内出现冲突,KShortcutsDialog会明确标记,改掉其中一个即可。
  • 忘记就找命令面板:Ctrl+Shift+P输入动作名即可,命令面板会展示每个动作的类别与当前快捷键(command_palette_ui/mod.rs)。
  • 恢复默认:Shortcuts 对话框内的Defaults按钮一键还原;改动只影响快捷键,不会波及settings.json中的其他设置。
  • 游戏开发
  • 桌面应用
  • 开发工具
  • MCP 服务

【免费下载链接】rpfm

Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games.

项目地址:https://gitcode.com/gh_mirrors/rp/rpfm
点击查看免费下载
上一篇:SpaceX-API后端中间件性能:开销分析与优化
下一篇:Mermaid 网页集成与运行时 API 详解:从 `<pre class="mermaid">` 到 `mermaid.run` / `render` / `parse` 的完整实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询