Rofi 键位绑定完全指南:Keyboard 与 Mouse Bindings 的自定义与实现原理
2026/9/21 18:17:22 网站建设 项目流程

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 两种写法

绑定键既可以用键名(见后文各绑定默认值中使用的键名,如ReturnEscape),也可以用方括号包裹的数字 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-pasteControl+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退出 RofiEscape,Control+g,Control+bracketleft

kb-toggle-case-sensitivitykb-toggle-sort是运行时切换开关:例如运行模式下输入过滤默认不区分大小写,按下`(grave)即可临时切换;排序行为默认开启,Alt+grave可切换(doc/rofi.1.markdown 对此有配套说明)。另外从 source/keyb.c 的数组定义看,kb-cancel的默认绑定串中还包含MouseSecondary,即右键单击同样触发退出。

自定义动作(kb-custom-1 … 19)

绑定名默认值绑定名默认值
kb-custom-1Alt+1kb-custom-11Alt+exclam
kb-custom-2Alt+2kb-custom-12Alt+at
kb-custom-3Alt+3kb-custom-13Alt+numbersign
kb-custom-4Alt+4kb-custom-14Alt+dollar
kb-custom-5Alt+5kb-custom-15Alt+percent
kb-custom-6Alt+6kb-custom-16Alt+dead_circumflex
kb-custom-7Alt+7kb-custom-17Alt+ampersand
kb-custom-8Alt+8kb-custom-18Alt+asterisk
kb-custom-9Alt+9kb-custom-19Alt+parenleft
kb-custom-10Alt+0

kb-custom-1kb-custom-19对应 19 个可编程动作槽位,可在配置文件中配合custom-1custom-19选项定义每个槽位执行的具体命令(dmenu 模式下则输出对应的-dmenu自定义返回编号)。从键名可以看到,Alt+Shift+1这类带符号组合使用的是 X11 键名(exclamatnumbersigndollarpercentdead_circumflexampersandasteriskparenleft)。

行快速选择(kb-select-1 … 10)

绑定名默认值绑定名默认值
kb-select-1Super+1kb-select-6Super+6
kb-select-2Super+2kb-select-7Super+7
kb-select-3Super+3kb-select-8Super+8
kb-select-4Super+4kb-select-9Super+9
kb-select-5Super+5kb-select-10Super+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 键名(ReturnEscapeKP_EnterISO_Left_Tabgravedead_graveparenleft等),不确定时可用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-charskb-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),仅供参考

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

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

立即咨询