测试和调试`awesome/rc.lua`

如何在交互式解释器中从awesome/rc.lua运行lua命令?

我试图在~/.config/awesome/rc.lua中创建一些功能,以用于新的键绑定。有时我会遇到错误,我想通过在命令行中打印表格和变量来测试这些功能。我下载了lua5.2,并开始玩弄交互式解释器。我编写了一个小脚本,在交互模式开始时运行。

当我require("gears ")require("awful ")以及几乎在/usr/share/awesome/lib/中找到的每个其他库时,我遇到了问题。以下是一些示例:

  1. 尝试require("gears ")时,我遇到了错误: /usr/share/awesome/lib/gears/wallpaper.lua:17:尝试索引全局变量'screen'(空值)
  2. 删除require("gears ")行后,require("awful ")行会给我: /usr/share/awesome/lib/awful/tag.lua:603:尝试索引字段'client'(空值)

看来对于惊人的每个模块的每个组件,Lua解释器都不知道有些组件。 我应该如何告诉Lua解释器注意到这些组件?

我对Lua编码不是很有经验。我是在错误的地方挖东西吗?是否有不同且更好的方式来测试来自awesome/rc.lua的功能?

点赞
用户2505965
用户2505965

Mod4 + x 运行 Lua 解释器。

rc.lua 和其他 Lua lib 文件被加载到由宿主程序(用 C 写成)提供的环境中。这就是为什么您可以访问提供的 API 元素,如 screenclient。在这里可以看到部分相关文件 here

如果您只是想调试配置文件中的一些基本 Lua 函数,您可以考虑简单地将其写入文件或管道,而不是输出到 stdout,并监视它。

Mod4 + Control + r 重新启动 Awesome,并重新加载配置文件。

2016-08-20 17:52:36
用户52499
用户52499

你面对的问题是因为你在 awesome 提供的环境之外运行你的脚本所导致的。你可以通过添加 调试语句 来克服这个问题:

naughty = require('naughty')  -- 如果尚未加载
naughty.notify({text='some message'})
naughty.notify({text=some_string})
naughty.notify({text=tostring(some_number)})
naughty.notify({text=tostring(#some_array)})  -- 对于没有空洞的数组

然后重新启动 awesome ( Mod4 + Control + r)。

或者你可以要求 awesome 运行你提供的脚本:

$ awesome-client '
  naughty = require("naughty")
  naughty.notify({
    text="some message"})
'

这种方法的问题在于,只要你调试你的代码,就很可能没问题。但是如果你想弄清楚某个库发生了什么问题,比如 lain...,require 不会两次引用同一个文件。如果你想要引用一个自 awesome (重新)启动以来已更改的文件,那么你需要使用 dofile(带有绝对路径和扩展名,package.path 仅被 require 使用):

bat = dofile "/usr/share/lua/5.3/lain/widget/bat.lua"
bat({})

你还可以在 rc.lua定义一些函数

function f1()
    naughty.notify{text='some text'}
end

之后通过 Mod4 + x 来调用它。

你可以通过调用 awesome -k 来检查 rc.lua 的语法。

在一些简单的情况下,如果你不需要 awesome 的环境,你可以直接运行独立脚本( lua5.3 /tmp/a.lua,或 /tmp/a.lua 如果具有 shabang)。

2021-12-28 06:23:32