新增竖屏显示器后AwesomeWM启动出现‘__newindex’错误的技术求助
别担心,刚接触AwesomeWM碰到这种屏幕配置问题太正常了——你遇到的报错和显示异常,核心原因是Xorg层面的屏幕布局没有被正确识别,导致AwesomeWM无法获取有效的屏幕对象,所以Xrandr确实是解决问题的关键环节,接下来一步步帮你搞定:
第一步:用Xrandr手动配置屏幕布局,先让硬件显示正常
AwesomeWM依赖Xorg提供的屏幕信息,如果X本身没正确识别你的超宽主屏和竖屏副屏,Awesome肯定会出问题。先执行以下操作:
先查看当前显示器的识别状态:
打开终端(可以用Mod+Enter默认打开终端,如果主屏黑屏,试试在副屏操作),运行:xrandr你会看到类似
DP-0 connected 3440x1440+0+0、HDMI-1 connected 1920x1080+3440+0这样的输出,记下两个显示器的设备名(比如DP-0、HDMI-1)、各自支持的分辨率。手动设置正确的屏幕布局:
假设你的超宽主屏是DP-0(分辨率3440x1440),竖屏副屏是HDMI-1(原分辨率1920x1080,需要旋转90度变成竖屏),运行以下命令:xrandr --output DP-0 --primary --mode 3440x1440 --pos 0x0 --rotate normal --output HDMI-1 --mode 1080x1920 --pos 3440x0 --rotate right解释下参数:
--primary:把DP-0设为主屏幕,解决主屏黑屏的问题--mode:指定对应显示器的分辨率(超宽屏用3440x1440,竖屏要把原横向分辨率反过来,比如1080x1920)--pos:设置副屏的位置(接在主屏右侧的话,x坐标就是主屏的宽度3440,y坐标0)--rotate right:把副屏顺时针旋转90度,变成竖屏模式
运行后如果两个屏幕都正常显示(主屏亮,副屏竖屏),说明X层面的问题解决了,接下来把这个配置持久化:
把上述xrandr命令添加到你的~/.xprofile或者~/.xinitrc文件末尾,这样每次启动Xorg时会自动执行。
第二步:修复AwesomeWM的配置,解决screen nil报错
报错screen expected, got nil是因为你的Awesome配置里可能硬编码了屏幕索引(比如写了screen[1]),但现在屏幕的识别顺序或数量变了,导致Awesome找不到对应的屏幕对象。
检查屏幕相关的配置逻辑:
打开你的~/.config/awesome/rc.lua,找到屏幕初始化的部分,确保用的是动态遍历所有屏幕的方式,而不是硬编码索引。比如正确的写法是:awful.screen.connect_for_each_screen(function(s) -- 在这里定义每个屏幕的标签、布局等 awful.tag({ "1", "2", "3", "4", "5" }, s, awful.layout.suit.tile) end)如果之前你写的是
screen[1].tags = ...或者screen[2].tags = ...,改成上面的动态遍历方式,让Awesome自动为每个识别到的屏幕创建标签和布局。检查窗口规则(awful.rules):
报错提示在awful/rules.lua,说明某个窗口规则里指定了不存在的屏幕。找到awful.rules.rules的配置块,看有没有类似这样的规则:{ rule = { class = "Firefox" }, properties = { screen = 1, tag = "1" } },这里的
screen = 1就是硬编码,改成动态获取当前屏幕的写法:{ rule = { class = "Firefox" }, properties = { screen = function(c) return awful.screen.focused() end, tag = "1" } },或者直接去掉
screen属性,让窗口默认在当前聚焦的屏幕打开。验证配置语法:
运行以下命令检查配置文件有没有语法错误:awesome --check如果没有报错,按
Mod+Ctrl+r重启AwesomeWM,应该就能正常启动,且屏幕布局符合预期了。
最后小贴士
如果还是有问题,可以查看~/.xsession-errors文件,里面会有更详细的AwesomeWM运行日志,帮你定位具体哪里出了问题。
内容的提问来源于stack exchange,提问作者Vincent Aury

