菜单键作为 Awesome WM 的粘性 modkey

Menu key as a sticky modkey for Awesome WM

我正在考虑切换到 Awesome WM(出于多种原因,可破解性可能是最重要的 - 我是 Emacs 的重度用户;-))。

几年前我曾经使用过一段时间的平铺WM(StumpWM),它有一个很好的功能,即只绑定一个键作为"prefix"。我将它设置为(否则对我没用)"menu" 键,所以基本上所有 WM 绑定都是 "press menu, release it, press something else".

从 docs/tutorials 我可以看出 Awesome 将其功能绑定到 "modkey+something" 的方法略有不同。

是否可以像我习惯的那样将"menu"用作"sticky modkey"?或者更确切地说,我该怎么做?

您可以为菜单键创建一个 "normal" 键绑定,在其中启动一个 keygrabber 并使用它来获取后面的 "something"。这意味着您必须自己重新发明一些轮子,因为 AwesomeWM 中的代码不会为您管理键绑定,但它应该是可行的。

对入门没有多大帮助的简单示例:

diff --git a/awesomerc.lua b/awesomerc.lua
index 5d2bd2c10..7973b210a 100644
--- a/awesomerc.lua
+++ b/awesomerc.lua
@@ -242,6 +243,12 @@ root.buttons(gears.table.join(
 -- {{{ Key bindings
 -- @DOC_GLOBAL_KEYBINDINGS@
 globalkeys = gears.table.join(
+    awful.key({}, "Menu", nil, function()
+        keygrabber.run(function(mods, key, action)
+            print("You did:", gears.debug.dump_return(mods), key, action)
+            keygrabber.stop()
+        end)
+    end),
     awful.key({ modkey,           }, "s",      hotkeys_popup.show_help,
               {description="show help", group="awesome"}),
     awful.key({ modkey,           }, "Left",   awful.tag.viewprev,

这样做是在释放菜单键后打印第一个 "keyboard event"。这可以例如是 "a key was released that was pressed before the Menu key was released",但您可能只关心“'s' 被按下”之类的事情...