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模式一样的按键切换流程。