如何在 Lua 脚本中修改 Awesome Window Manager 全局变量的内容?

我一直在尝试配置我的 Awesome WM 配置文件 (rc.lua),以便在登录/重置时检测我的 IBM Model M13 是否连接到我的笔记本电脑上。这是为了更改 modkey,因为 M13 没有超级键。

以下代码在我看来很有意义,并在为 awful.spawn.easy_async 函数编写的功能内更改 modkey,但完成后 modkey 会更改回 Mod4。

modkey = "Mod4"

awful.spawn.easy_async(
   "xinput list",
   function(stdout, stderr, reason, code)
      local msg = "普通键盘 Modkey = Super"

      -- 调试通知,显示 modkey 正在使用其默认超级键 Mod4
      naughty.notify({
         text = modkey,
         timeout =7
      })

      if code ~= 0 then
         msg = "缺少 xinput 来查看设备\nModkey = Super"
      elseif stdout:match("CHESEN") == "CHESEN" then
         -- CHESEN 是我的 PS/2 至 USB 适配器
         msg = "IBM M13 已检测到\nModkey = Alt"
         modkey = "Mod1"  -- 将新 modkey 设置为 Alt
      end

      -- 通知消息
      naughty.notify({
         text = msg,
         timeout =7
      })
   end
)
-- 调试通知以验证键,但键返回 Mod4
naughty.notify({
   text = modkey,
   timeout =7
})

输出可以在此处查看。它不按顺序打印通知,但 Mod 4 的打印都是调试打印。

通知输出

我除了不时更改我的配置之外几乎不使用 Lua,所以我很难理解我的全局变量 modkey 如何可以在不重置的情况下更改。我尝试的其他方法包括将该函数定义为我调用的 setModKey 函数,以将其作为参数传递给 easy_async,并尝试使用 _G 设置 modkey 作为 _G.modkey,但最终结果相同。

我是否遗漏了 Lua 的基础知识,或者这受到 Awesome WM 如何使用 Lua 的影响?任何帮助都将非常感激。

点赞
用户436275
用户436275

使用 io.popen 替代 awful.spawn.easy_async。是的,通常使用 io.popen 是不被推荐的,但是这里会发生以下的情况:

  • Awesome 启动。
  • 您调用 easy_async 来捕获 xinput list 的输出。
  • 由于它是异步的,您的配置文件将继续被加载,所以例如所有您的按键绑定都被设置了。
  • easy_async 完成了它的工作,您将 modkey 设置为其他值。

这意味着从现在开始定义的任何按键绑定都使用新的 modkey,但所有已经存在的按键绑定都不会被修改。所以,基本上什么也不会发生。

至于您调试时调用 naughty.notify:函数被触发后,外部的通知先被触发,然后才是内部通知。所以它不会回退,而是您首先显示旧的值,仅在稍后显示新的值。

2018-01-27 09:41:59