Rofi 键位绑定完全指南:Keyboard 与 Mouse Bindings 的自定义与实现原理
【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址: https://gitcode.com/gh_mirrors/ro/rofi
rofi-keys(5) 实战解读:本文以 Rofi 官方手册 rofi-keys.5(1.7.6 版)为骨架,系统讲解 Rofi 中所有可覆盖的键盘与鼠标绑定:从命令行与配置文件两种设置方式、键名/keycode 写法、多键与按键释放触发,到 70+ 项键盘绑定与鼠标绑定的完整默认值对照表,并结合 source/keyb.c、include/keyb.h 等源码剖析其底层解析与分发机制。读完你将能够完全掌控 Rofi 的输入行为,按自己的习惯定制任何动作的触发键。
绑定机制概述
Rofi 几乎允许覆盖它任何键盘和鼠标绑定。每个可触发的动作都有一个对应的kb-(键盘)或ml-/me-(鼠标)前缀选项,例如接受条目kb-accept-entry、取消退出kb-cancel、切换匹配模式kb-mode-next等。
从源码结构看,这些选项在 source/keyb.c 中被集中定义为一个ActionBindingEntry rofi_bindings[]数组:每个条目包含内部动作 ID(id)、作用域(scope)、配置名(name)、默认绑定串(binding)与说明注释(comment)。本文列出的所有默认值即来源于该数组,手册与源码保持一致,是排查“为什么某个按键不生效”的第一现场。
如何设置绑定
绑定有两种设置途径,效果完全等价。
命令行方式
通过-{bindingname}参数直接传值:
rofi -show run -kb-accept-entry 'Control+Shift+space'-show run启动运行模式,同时把“接受条目”重新绑定为Control+Shift+space。
配置文件方式
写入 Rofi 的 rasi 配置(默认为~/.config/rofi/config.rasi):
configuration { kb-accept-entry: "Control+Shift+space"; }键名与 keycode 两种写法
绑定键既可以用键名(见后文各绑定默认值中使用的键名,如Return、Escape),也可以用方括号包裹的数字 keycode:
configuration { kb-accept-entry: "Control+Shift+[65]"; }这里[65]表示 65 号 keycode。查找某个物理按键的 keycode,最方便的工具是xev(1)(在 X11 会话中启动 xev 后按下目标键即可看到其 keycode 数值)。
一个动作绑定多个键
同一个动作可以绑定多个按键,使用逗号分隔的列表:
configuration { kb-accept-entry: "Control+Shift+space,Return"; }解析时(对应 parse_keys_abe 中对每个绑定串按,切分的逻辑),每个键都会被注册为同一动作的触发键。
在“按键释放”时触发
默认情况下 Rofi 在按下时响应绑定。若希望改为在所有按键释放时触发,在绑定串前加!前缀:
configuration { kb-accept-entry: "!Control+Shift+space,Return"; }!只作用于它所在的那个键项。源码中默认的鼠标点击绑定正是利用了这一机制(见下文“鼠标绑定的底层实现”)。
取消(unset)一个绑定
将绑定值设为空字符串即可取消该绑定:
configuration { kb-clear-line: ""; }取消后该动作不再响应任何键。
查看当前绑定的完整列表
手册与源码都提供了直接查看所有绑定的手段。在 source/rofi.c 中,rofi -list-keybindings参数会调用abe_list_all_bindings()(实现在 source/keyb.c),打印当前注册的全部绑定及其默认值后退出:
rofi -list-keybindings当配置解析发现某个键被重复绑定到多个动作时,Rofi 的错误提示也会主动建议你运行rofi -list-keybindings查看当前绑定列表(见 source/keyb.c 的错误文案构造)。
键盘绑定完整参考(默认值对照表)
以下按功能分组列出全部键盘绑定、动作说明与默认键位。若某组与你无关可直接跳过,需要改哪个就查哪项。
剪贴板与粘贴
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-primary-paste | 粘贴主选择区(primary selection) | Control+V,Shift+Insert |
kb-secondary-paste | 粘贴剪贴板(clipboard) | Control+v,Insert |
kb-secondary-copy | 复制当前选中项到剪贴板 | Control+c |
注意kb-primary-paste默认中的Control+V(大写 V)与kb-secondary-paste的Control+v(小写 v)在写法上是区分开的,含义分别是主选择与剪贴板两种不同的粘贴源。
输入行编辑
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-clear-line | 清空输入行 | Control+w |
kb-move-front | 光标移到行首 | Control+a |
kb-move-end | 光标移到行尾 | Control+e |
kb-move-word-back | 光标后退一个单词 | Alt+b,Control+Left |
kb-move-word-forward | 光标前进一个单词 | Alt+f,Control+Right |
kb-move-char-back | 光标后退一个字符 | Left,Control+b |
kb-move-char-forward | 光标前进一个字符 | Right,Control+f |
kb-remove-word-back | 删除前一个单词 | Control+Alt+h,Control+BackSpace |
kb-remove-word-forward | 删除下一个单词 | Control+Alt+d |
kb-remove-char-forward | 删除下一个字符 | Delete,Control+d |
kb-remove-char-back | 删除前一个字符 | BackSpace,Shift+BackSpace,Control+h |
kb-remove-to-eol | 删除到行尾 | Control+k |
kb-remove-to-sol | 删除到行首 | Control+u |
接受与确认
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-accept-entry | 接受当前选中的条目 | Control+j,Control+m,Return,KP_Enter |
kb-accept-custom | 把输入的文本作为命令执行(ssh/run 模式) | Control+Return |
kb-accept-custom-alt | 同上,另一种自定义接受方式(ssh/run 模式) | Control+Shift+Return |
kb-accept-alt | 使用备用接受命令 | Shift+Return |
kb-delete-entry | 从历史记录中删除条目 | Shift+Delete |
kb-accept-alt对应“备用动作”——例如 run 模式中用它直接执行选中项而非插入到输入框,具体行为依赖当前模式(如 doc/rofi.1.markdown 中提到的-kb-accept-alt关联的 alt-action)。
模式切换与补全
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-mode-next | 切换到下一个模式 | Shift+Right,Control+Tab |
kb-mode-previous | 切换到上一个模式 | Shift+Left,Control+ISO_Left_Tab |
kb-mode-complete | 开始当前模式的补全 | Control+l |
列表导航
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-row-left | 移动到上一列 | Control+Page_Up |
kb-row-right | 移动到下一列 | Control+Page_Down |
kb-row-up | 选择上一个条目 | Up,Control+p |
kb-row-down | 选择下一个条目 | Down,Control+n |
kb-row-tab | 移到下一行;若已到最后一行则接受;若无更多行则切到下一模式 | (无默认) |
kb-element-next | 移到下一行 | Tab |
kb-element-prev | 移到上一行 | ISO_Left_Tab |
kb-page-prev | 上一页 | Page_Up |
kb-page-next | 下一页 | Page_Down |
kb-row-first | 跳到第一个条目 | Home,KP_Home |
kb-row-last | 跳到最后一个条目 | End,KP_End |
kb-row-select | 把选中的条目设为输入文本 | Control+space |
注意kb-row-tab在默认绑定表中没有默认键(绑定串为空),这是源码中唯一一个默认值为空的键盘绑定(见 source/keyb.c);想要启用它,需要手动为其指定键。
显示与视图控制
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-screenshot | 对 Rofi 窗口截图 | Alt+S |
kb-ellipsize | 在省略号显示模式间切换 | Alt+period |
kb-toggle-case-sensitivity | 切换大小写敏感匹配 | grave,dead_grave |
kb-toggle-sort | 切换过滤后菜单排序 | Alt+grave |
kb-cancel | 退出 Rofi | Escape,Control+g,Control+bracketleft |
kb-toggle-case-sensitivity与kb-toggle-sort是运行时切换开关:例如运行模式下输入过滤默认不区分大小写,按下`(grave)即可临时切换;排序行为默认开启,Alt+grave可切换(doc/rofi.1.markdown 对此有配套说明)。另外从 source/keyb.c 的数组定义看,kb-cancel的默认绑定串中还包含MouseSecondary,即右键单击同样触发退出。
自定义动作(kb-custom-1 … 19)
| 绑定名 | 默认值 | 绑定名 | 默认值 |
|---|---|---|---|
kb-custom-1 | Alt+1 | kb-custom-11 | Alt+exclam |
kb-custom-2 | Alt+2 | kb-custom-12 | Alt+at |
kb-custom-3 | Alt+3 | kb-custom-13 | Alt+numbersign |
kb-custom-4 | Alt+4 | kb-custom-14 | Alt+dollar |
kb-custom-5 | Alt+5 | kb-custom-15 | Alt+percent |
kb-custom-6 | Alt+6 | kb-custom-16 | Alt+dead_circumflex |
kb-custom-7 | Alt+7 | kb-custom-17 | Alt+ampersand |
kb-custom-8 | Alt+8 | kb-custom-18 | Alt+asterisk |
kb-custom-9 | Alt+9 | kb-custom-19 | Alt+parenleft |
kb-custom-10 | Alt+0 |
kb-custom-1到kb-custom-19对应 19 个可编程动作槽位,可在配置文件中配合custom-1到custom-19选项定义每个槽位执行的具体命令(dmenu 模式下则输出对应的-dmenu自定义返回编号)。从键名可以看到,Alt+Shift+1这类带符号组合使用的是 X11 键名(exclam、at、numbersign、dollar、percent、dead_circumflex、ampersand、asterisk、parenleft)。
行快速选择(kb-select-1 … 10)
| 绑定名 | 默认值 | 绑定名 | 默认值 |
|---|---|---|---|
kb-select-1 | Super+1 | kb-select-6 | Super+6 |
kb-select-2 | Super+2 | kb-select-7 | Super+7 |
kb-select-3 | Super+3 | kb-select-8 | Super+8 |
kb-select-4 | Super+4 | kb-select-9 | Super+9 |
kb-select-5 | Super+5 | kb-select-10 | Super+0 |
输入历史导航
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-entry-history-up | 在输入历史中向上 | Control+Up |
kb-entry-history-down | 在输入历史中向下 | Control+Down |
更高版本新增的键盘绑定
当前仓库根目录的 doc/rofi-keys.5.markdown(对应更新版本)在 1.7.6 基础上还登记了以下绑定,源码 source/keyb.c 与 source/keyb.c 中同样有定义,如果你使用的 Rofi 版本较新,可以一并使用:
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
kb-transpose-chars | 交换光标前两个字符 | Control+t |
kb-matcher-up | 选择上一个匹配器(matcher) | Super+equal |
kb-matcher-down | 选择下一个匹配器 | Super+minus |
鼠标绑定完整参考
Rofi 除了键盘绑定,还提供两组鼠标绑定:ml-前缀(列表视图滚动/导航)与me-前缀(列表条目上的点击动作)。
| 绑定名 | 动作说明 | 默认值 |
|---|---|---|
ml-row-left | 移动到上一列 | ScrollLeft |
ml-row-right | 移动到下一列 | ScrollRight |
ml-row-up | 选择上一个条目 | ScrollUp |
ml-row-down | 选择下一个条目 | ScrollDown |
me-select-entry | 选中鼠标悬停的行 | MousePrimary |
me-accept-entry | 接受鼠标悬停的行 | MouseDPrimary |
me-accept-custom | 以自定义动作接受鼠标悬停的行 | Control+MouseDPrimary |
其中ScrollUp/ScrollDown/ScrollLeft/ScrollRight是滚轮事件键名,MousePrimary/MouseDPrimary是鼠标按钮键名(见下节)。默认的单击选中、双击接受行为,正来自这些默认值。
鼠标按键的命名与标识构造规则
以下鼠标按钮可以绑定到上述ml-/me-动作:
| 键名 | 含义 |
|---|---|
Primary | 主按钮(左键)单击 |
Secondary | 次按钮(右键)单击 |
Middle | 中键单击 |
Forward | 前进键 |
Back | 后退键 |
ExtraN | 第 N 个附加鼠标键(取决于鼠标支持) |
鼠标绑定的标识符按如下模板构造:
Mouse<D><Button>D:可选的Double(双击)标记;Button:按钮名称。
例如MouseDPrimary即主按钮(左键)双击,MousePrimary为左键单击。手册中me-accept-entry默认值为MouseDPrimary(双击接受),而me-select-entry默认MousePrimary(单击选中),二者配合形成了“单击选、双击定”的典型交互。
底层实现:绑定如何注册与分发
理解了配置写法后,结合源码可以看清一条绑定的完整生命周期。
1. 默认值注册进配置系统
启动早期(source/rofi.c 调用的setup_abe(),实现在 source/keyb.c),Rofi 遍历rofi_bindings[]数组,把每个kb-*/ml-*/me-*选项以xrm_String类型注册进配置解析器(config_parser_add_option)。命令行参数与配置文件对同一选项的覆盖,都发生在这套配置系统之上——你改写的任何绑定最终都会替换数组中的默认字符串。
2. 绑定串解析与去重校验
随后 parse_keys_abe 把每个绑定串按,切分成单个键,交给底层nk_bindings_add_binding()(来自nkutils-bindings库)注册。该函数返回错误时:
- 若错误是
NK_BINDINGS_ERROR_ALREADY_REGISTERED(同一键被重复绑定),Rofi 会生成一条带提示的报错消息,建议执行rofi -list-keybindings查看冲突; - 其他解析错误(键名拼错、组合非法等)会显示底层错误消息。
所有错误会累积显示(rofi_add_error_message),不会静默失败——这也是配置绑定后“不生效”时最直接的排查入口。
3. 作用域(scope)与命中判定
每个动作都声明了自己的作用域,定义在 include/keyb.h:
SCOPE_GLOBAL:全局作用域,键盘动作默认在此;SCOPE_MOUSE_LISTVIEW/SCOPE_MOUSE_LISTVIEW_ELEMENT/SCOPE_MOUSE_EDITBOX/SCOPE_MOUSE_SCROLLBAR/SCOPE_MOUSE_MODE_SWITCHER:鼠标交互作用域,分别对应列表视图、列表条目、输入框、滚动条、模式切换器。
按键事件触发后,rofi_view_check_action 先检查动作是否适用于当前作用域(鼠标动作需要先通过widget_find_mouse_target按鼠标坐标命中目标控件,命中失败则动作不触发);命中后由 rofi_view_trigger_action 执行动作——全局动作直接进入rofi_view_trigger_global_action(),鼠标动作则下发给目标 widget 的widget_trigger_action()处理,并支持按下后拖拽(motion grab)的连续分发。这套“作用域 + 命中检测”机制解释了为什么鼠标绑定只在悬停于对应控件时才生效。
4. 默认鼠标点击绑定的!用法
除rofi_bindings[]外,source/keyb.c 还定义了一组固定默认的鼠标点击动作:
static const gchar *mouse_default_bindings[] = { [MOUSE_CLICK_DOWN] = "MousePrimary", [MOUSE_CLICK_UP] = "!MousePrimary", [MOUSE_DCLICK_DOWN] = "MouseDPrimary", [MOUSE_DCLICK_UP] = "!MouseDPrimary", };这里清晰地展示了!前缀的语义:MousePrimary在按下时触发、!MousePrimary在释放时触发,二者共同构成了完整的“按下-释放”点击事件对(双击同理)。这些默认绑定会应用到输入框、滚动条、模式切换器等所有固定鼠标作用域(见 parse_keys_abe 的循环注册逻辑)。
实用建议与常见问题
- 键名写法:组合键使用
+连接修饰键与主键,例如Control+Shift+space;特殊键使用 X11 键名(Return、Escape、KP_Enter、ISO_Left_Tab、grave、dead_grave、parenleft等),不确定时可用xev查键名与 keycode。 - 冲突排查:绑定不生效时,先确认是否与其他动作重复占用(Rofi 会报
Binding ... is already bound),再用rofi -list-keybindings复核最终绑定集。 !只影响其所在键项:"!Control+Shift+space,Return"中只有第一个键改为释放触发,Return仍是按下触发。- 空字符串即取消:想彻底禁用某动作(如
kb-clear-line),赋值""即可,无需指定替代键。 - 启用
kb-row-tab:该动作默认无键,按需自行绑定,例如kb-row-tab: "Shift+Tab";。 Super(Win 键)绑定注意:kb-select-1…10默认占用Super+1…0,若你的桌面环境/窗口管理器已捕获 Super 组合键,需在 WM 侧放行或改用其他组合。
延伸阅读
- doc/rofi.1.markdown:rofi(1) 主手册,包含
-list-keybindings、-kb-*命令行参数及 alt-action 的完整说明; - doc/rofi-theme.5.markdown:rofi-theme(5) 主题手册;
- doc/rofi-script.5.markdown:rofi-script(5) 脚本模式手册;
- doc/rofi-sensible-terminal.1.markdown:rofi-sensible-terminal(1) 终端选择工具手册;
- 不同历史版本的键位手册见 mkdocs/docs/ 目录下各版本(如 1.7.6 版 mkdocs/docs/1.7.6/rofi-keys.5.markdown)。
说明:本文全部默认值以 1.7.6 版 mkdocs/docs/1.7.6/rofi-keys.5.markdown 为准;更新版本新增的
kb-transpose-chars、kb-matcher-up/down已在“更高版本新增”一节补充,并可从仓库根目录 doc/rofi-keys.5.markdown 核实。
【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址: https://gitcode.com/gh_mirrors/ro/rofi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考