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

Testing and Debugging `awesome/rc.lua`

如何在交互式 iterpreter 中从 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: attempt to index global 'screen' (a nil value)
  2. 当删除带有 require("gears") 的行时,require("awful") 行给我: /usr/share/awesome/lib/awful/tag.lua:603: attempt to index field 'client' (a nil value)

似乎对于 awesome 库中的每个模块,都有一些不为 lua 解释器所知的组件。 如何让 lua 解释器知道这些组件?

我对 lua 编码不是很有经验。我挖错地方了吗?是否有不同的也许更好的方法来测试 awesome/rc.lua 中的函数?

Mod4 + x 运行 Lua 解释器。

rc.lua 和各种 Lua lib 文件被加载到主机程序(用 C 编写)提供的环境中。这就是为什么您可以访问提供的 API elements like screen and client. See the (partially) responsible file here.

如果您只是想在配置文件中调试一些基本的 Lua 功能,您可以考虑简单地写入文件或管道,而不是 stdout,然后监视它。

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

您面临的问题是由于您 运行 在 awesome 提供的环境之外运行脚本。您可以做的一件事是添加 debug statements:

naughty = require('naughty')  -- if not yet loaded
naughty.notify({text='some message'})
naughty.notify({text=some_string})
naughty.notify({text=tostring(some_number)})
naughty.notify({text=tostring(#some_array)})  -- for array w/o holes

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

或者您可以询问 awesomerun a script 您提供:

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

这个方法的问题是,只要你调试你的代码,它可能就没问题。但是如果你想弄清楚某个库中发生了什么,比如 lain... require doesn't require files twice. If you want to require a file that has changed since the time awesome was (re)started, you've got to dofile (with an absolute path and extension, package.path is used only by require):

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

您也可以 define some functionrc.lua:

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

然后通过Mod4 + x调用它。

您可以通过调用 awesome -k.

检查 rc.lua 的语法

在一些不需要 awesome 环境的简单情况下,您可以只 运行 独立脚本(lua5.3 /tmp/a.lua,或者 /tmp/a.lua 如果它有沙邦)。