- 游戏开发
- 桌面应用
- 开发工具
- 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.
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. 打开与使用快捷键设置对话框
- 打开偏好设置对话框:PackFile → Settings(或直接按
Ctrl+,)。 - 点击对话框底部的Shortcuts按钮,弹出独立的快捷键设置窗口。
- 按集合浏览动作(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 Pack | Ctrl+N |
| Open Packs | Ctrl+O |
| Open & Merge Packs | Ctrl+Shift+O |
| Save All Packs | Ctrl+S |
| Save Current Pack | Ctrl+Shift+S |
| Install Pack | Ctrl+Shift+I |
| Uninstall Pack | Ctrl+Shift+U |
| Load All CA Packs | Ctrl+G |
| Settings | Ctrl+, |
| 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 Tab | Ctrl+W |
| Previous Tab | Ctrl+Shift+Tab |
| Next Tab | Ctrl+Tab |
| Toggle Quick Notes | (无绑定) |
| Import From Dependencies | (无绑定) |
标签页右键菜单还提供了"关闭左侧全部标签""关闭右侧全部标签""关闭其他全部标签""关闭全部标签"等动作,它们默认无快捷键,可在对话框中自行绑定。
4.3 视图菜单(view_menu集合)
| 动作 | 默认快捷键 |
|---|---|
| Toggle Global Search | Ctrl+Shift+F |
| Toggle Pack Contents | (无绑定) |
| Toggle Diagnostics | (无绑定) |
| Toggle Dependencies | (无绑定) |
| Toggle References | (无绑定) |
五个面板开关中只有"全局搜索"预置了Ctrl+Shift+F,其余默认无绑定,建议按使用频率在对话框中为常用面板(如 Diagnostics、Dependencies)补上快捷键。
4.4 命令面板(command_palette集合)
| 动作 | 默认快捷键 |
|---|---|
| Open file palette | Ctrl+P |
| Open command palette | Ctrl+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 File | Ctrl+A |
| Add Folder | Ctrl+Shift+A |
| Add From Pack | Ctrl+Alt+A |
| New Folder | Ctrl+F |
| New DB | Ctrl+D |
| New Loc | Ctrl+L |
| New Text | Ctrl+T |
| New Quick File | Ctrl+Q |
| New AnimPack / Portrait Settings | (无绑定) |
| Merge Files | Ctrl+M |
| Delete | Del |
| Extract | Ctrl+E |
| Rename / Move | Ctrl+R或F2 |
| Copy | Ctrl+C |
| Cut | Ctrl+X |
| Paste | Ctrl+V |
| Duplicate | Ctrl+Shift+D |
| Open with Decoder | Ctrl+J |
| Open with External Program | Ctrl+K |
| Open Pack Notes | Ctrl+Y |
| Expand All | Ctrl++ |
| Collapse All | Ctrl+- |
注意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 Row | Ctrl+Shift+A |
| Insert Row | Ctrl+I |
| Delete Row | Ctrl+Del |
| Delete Filtered-Out Rows | Ctrl+Shift+Del |
| Clone & Insert Row | Ctrl+D |
| Clone & Append Row | Ctrl+Shift+D |
| Copy | Ctrl+C |
| Copy as LUA Table | Ctrl+Shift+C |
| Paste | Ctrl+V |
| Paste as New Row | Ctrl+Shift+V |
| Rewrite Selection | Ctrl+Y |
| Invert Selection | Ctrl+- |
| Search | Ctrl+F |
| Undo / Redo | Ctrl+Z/Ctrl+Shift+Z |
| Smart Delete | Del |
| 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 Up | Ctrl+Up |
| Move Field Down | Ctrl+Down |
| Move Field Left | Ctrl+Left |
| Move Field Right | Ctrl+Right |
| Delete Field | Ctrl+Del |
| Delete Definition | Ctrl+Del |
| Load Definition | Ctrl+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 MyMod | Ctrl+Alt+I |
| Export MyMod | Ctrl+Alt+E |
| Import All Open MyMods | Ctrl+Alt+Shift+I |
| Export All Open MyMods | Ctrl+Alt+Shift+E |
About 菜单(about_menu)
| 动作 | 默认快捷键 |
|---|---|
| Open Manual | Ctrl+H |
| Check Updates | Ctrl+U |
| Check Schema Updates | Ctrl+Shift+U |
Portrait Settings(portrait_settings集合)
| 动作 | 默认快捷键 |
|---|---|
| Add | Ctrl+A |
| Clone | Ctrl+D |
| Delete | Ctrl+Del |
| Delete Filtered Out Rows | Ctrl+Shift+Del |
Unit Variant(unit_variant集合)
| 动作 | 默认快捷键 |
|---|---|
| Add | Ctrl+A |
| Clone | Ctrl+D |
| Delete | Ctrl+Del |
Translator(translator集合,工具类)
| 动作 | 默认快捷键 |
|---|---|
| Move Up | Ctrl+Up |
| Move Down | Ctrl+Down |
| Import from translated Pack | Ctrl+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,核心逻辑是:
- 递归收集主菜单栏、Pack 树右键菜单、文件标签页右键菜单、以及当前活动文件视图(Table / Decoder / Unit Variant / Portrait Settings 等)右键菜单中所有已启用的动作;
- 为每个动作生成一行条目,显示文本 + 详情行(优先用动作的
statusTip作为描述;无描述时显示"类别 [快捷键]"); - 输入关键字实时过滤,回车触发选中动作(
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 上则落在 Qt
QSettings对应的注册表项或 plist 中。
因此"重置快捷键"的正确做法是:
- 打开PackFile → Settings → Shortcuts;
- 使用对话框自带的Defaults动作将所有绑定恢复为源码默认值;
- 确认后对话框会把新值写回。
与快捷键不同,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.
相关推荐
CopyQ 键盘快捷键完全指南:默认键位、搜索与自定义方案
CopyQ 键盘快捷键完全指南:默认键位、搜索与自定义方案 本文以 CopyQ 官方文档 docs/keyboard.rst https://link.gitc
桌面应用SumatraPDF 键盘快捷键完全指南:默认按键表、查找与自定义绑定原理
SumatraPDF 键盘快捷键完全指南:默认按键表、查找与自定义绑定原理 本篇技术指南以 Keyboard shortcuts.md https://link
桌面应用文档nteract Desktop 键盘快捷键完全指南:默认键位总表与 nteract.json 自定义机制
nteract Desktop 键盘快捷键完全指南:默认键位总表与 nteract.json 自定义机制 nteract 桌面应用(基于 Electron 的笔
开发工具数据科学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考