mpv构建按键绑定模式
mpv的可配置性是非常高的,通过lua进行扩展,然后按键绑定,可以的把整个播放器作为一个调用lua的控制台来玩。但有时候插件太多,导致自己的按键设置和插件的冲突还是很麻烦的情况。
对于这种快捷键冲突的情况,我学着vim那种mode的方式,把某一批功能集的快捷键,统一设置到某个模式里去,这样就避免了和插件的绑定的冲突。
举个模式的例子,下面的代码你可以通过按 Shift + c 切换到show模式,原本按下hjkl显示的HJKL,但是切换到show模式之后显示的就是小写的hjkl。
local show_mode = false local original_bindings = nil local function show_key(key) mp.osd_message(key, 1) end local function toggle_mode() show_mode = not show_mode if show_mode then -- 保存原始绑定 original_bindings = mp.get_property("input-bindings") mp.osd_message("show模式已启用", 2) -- 绑定特殊模式的键 mp.add_forced_key_binding("h", "show-h", function() show_key("h") end) mp.add_forced_key_binding("j", "show-j", function() show_key("j") end) mp.add_forced_key_binding("k", "show-k", function() show_key("k") end) mp.add_forced_key_binding("l", "show-l", function() show_key("l") end) else mp.osd_message("show模式已禁用", 2) -- 移除特殊模式的键 mp.remove_key_binding("show-h") mp.remove_key_binding("show-j") mp.remove_key_binding("show-k") mp.remove_key_binding("show-l") -- 恢复原始绑定 if original_bindings then mp.set_property("input-bindings", original_bindings) end end end local function init() mp.add_forced_key_binding("h", "default-h", function() show_key("H") end) mp.add_forced_key_binding("j", "default-j", function() show_key("J") end) mp.add_forced_key_binding("k", "default-k", function() show_key("K") end) mp.add_forced_key_binding("l", "default-l", function() show_key("L") end) -- 绑定模式切换键 mp.add_forced_key_binding("Shift+c", "toggle-mode", toggle_mode) mp.msg.info("按键显示脚本已加载") end init()
流程就是通过设置show_mode这个布尔变量,来判断是否处于模式中,然后通过toggle_mode函数来触发show_mode,再通过这个mode,来绑定和解绑定这些快捷键。并且还有一个original_bindings变量在绑定之前,就将原始的快捷键们保存起来,后续解绑的时候再还原回去。这样就达到了一个类似vim模式一样的按键切换流程。