linux awesome 窗口管理器使用备忘
2021-12-29 tech linux 30 mins 7 图 10677 字
最近将窗口管理器从 gnome3 换到了 awesome,一个平铺式的窗口管理器。已经使用了5天了,感觉还可以。中途还研究了其他东西,最后回归到 awesome + nautilus 的方式使用。 这篇文章做一些记录。
我使用的环境是 Debian 9 x86_64
,由 gnome3 登录界面切换为 awesome 窗口管理器。
目前安装的awesome信息为:
awesome v4.0 (Harder, Better, Faster, Stronger)
• Compiled against Lua 5.1.5 (running with Lua 5.1)
• D-Bus support: ✔
• execinfo support: ✔
• RandR 1.5 support: ✔
• LGI version: 0.9.1
一、Awesome 介绍与WM概念
窗口管理器 vs 桌面环境
-
窗口管理器(Windows Manager),负责绘制窗口的边框,处理窗口运行比如移动、最小化之类的行为。
-
桌面环境(Desktop Environment),窗口管理器的超集,它使用窗口管理器及其其他软件提供一个完整的工作环境。
例如:gnome就是一个桌面环境,默认使用Metacity作为窗口管理器。
平铺式窗口管理器
平铺就是之所有的窗口都不会相互重叠,而是 自动的 被调整大小使得它们能够刚好占满整个屏幕。
相对的,我们平时使用的是浮动式窗口管理器,由于屏幕空间有限,当前激活的窗口会浮在最上面,而遮住下面的窗口。
常见的窗口管理相关的工具如下:(来自alim0x - Awesome-Linux-Software-zh_CN)
合成器
- Compton - Compton 是一款独立的合成管理器,适合同没有原生提供合成功能的窗口管理器一同使用。
- Gamescope - Gamescope 是一款微合成器,提供一个带有独立输入,分辨率和刷新率的沙盒 Xwayland 桌面。
- Sway - Sway 是平铺 Wayland 合成器和 X11 下 i3 窗口管理器的新替代。
- Xcompmgr - Xcompmgr 是一个简单的合成管理器,能够渲染下拉阴影,使用 transset 工具的话,还可以实现简单的窗口透明。
叠加式窗口管理器
- 2bwm - 快速的浮动窗口管理,有两个特殊边界,基于 XCB 库,由 mcwm 衍生。
- Blackbox - 快速,轻量化的 X 窗口系统窗口管理器,没有那些烦人的库依赖。
- Fluxbox - 基于 Blackbox 0.61.1 代码的 X 窗口管理器。
- Openbox - 高度可配置,带有可扩展标准支持的下一代窗口管理器。
平铺式窗口管理器
- Bspwm - bspwm 是一个平铺式窗口管理器,将窗口以二叉树的叶结点的方式展现。
- Herbstluftwm - 使用 Xlib 和 Glib 的手工平铺式窗口管理器。
- i3 WM - 更好的平铺及动态窗口管理器。完全重写。目标平台是 GNU/Linux 和 BSD 操作系统。
- i3-gaps - i3-gaps 是拥有更多功能的 i3。
- Pop!_OS Shell - Pop Shell 是基于 GNOME shell 的窗口管理器,键盘驱动,自动平铺。
- Qtile - qtile 是一款全功能,可 hack 的平铺窗口管理器,使用 Python 编写和配置。
动态窗口管理器
- awesome - 高度可配置,下一代 X 框架窗口管理器。
- dwm - X 动态窗口管理器。它以平铺,单片镜以及浮动布局的方式管理窗口。
- spectrwm - 小型动态平铺 X11 窗口管理器。主要受 xmonad 和 dwm 启发。
- xmonad - 动态平铺 X11 窗口管理器,用 Haskell 编写和配置。
为什么选择Awesome
朋友推荐且已经正常使用很久了,所以稳定性是没有问题的。有如下优点:
- 体积小,运行迅速,占用资源少。
- 支持多种窗口布局。
- 使用Lua脚本的配置文件,灵活性高。
- 持续更新。
- 良好的鼠标支持。
- 多显示器支持。本文开头的图片就是awesome官网上挂着的图。
当然我也短暂尝试过 bspwm
和 i3
,感觉不是很舒服就没有往下继续了。
二、Awesome 安装与基本概念
除了安装了 awesome,我还安装了相应的compton
,用于透明美化等功能。
安装了插件 vicious 用于在状态栏显示cpu内存等信息。
同时文件管理器沿用 gnome
默认的 nautilus
,减少对日常使用的冲击。
对于截图,我使用了 shutter,可以参考这篇文章
实际上我尝试了 ranger 这个命令行文件管理器,并作了不小的配置改动。后续因为一些无法深入的问题放弃了。这部分我开新的文章做个记录。
$ sudo apt-get install awesome awesome-extra compton
Awesome提供了一个设置文件 rc.lua ,把它拷贝到~/.config/Awesome/里。
$ sudo cp /etc/xdg/awesome/rc.lua ~/.config/awesome
安装完Awesome后,注销当前用户回到用户选择界面,然后选择使用Awesome桌面环境。
对于Debian/Gnome 用户,在用户密码框的右侧有个按钮,点击之后会展示桌面环境选择菜单,选择“Awesome”即可。
登录后顶部有一条类似Windows任务栏的东西,叫做状态栏(Status Bar)。
状态栏的最左侧是Awesome的图标,点击它将会打开一个小菜单,这就是Awesome的主菜单。
Awesome 图标的右侧可以看到阿拉伯数字1-9,这些叫做标签(Tag),类似GNome或者KDE下的虚拟桌面。
在状态栏最右侧是布局切换器,布局(Layout)是根据屏幕上的可用空间来调整窗口位置、尺寸的方式。Awesome支持多种布局:
-
平铺
Tiled平铺模式下屏幕被分为master和stacking两个区域。master中的窗口包含了需要最多关注的窗口(通常这表示master中的窗口会占据更大的屏幕空间),而stacking区域中包含了其它窗口。如果你想的话master区域可以被划分为多行和多列。
-
最大化 Max
每个窗口都是全屏显示。
-
放大 Magnifier
当前窗口(也就是被鼠标点选中,正在操作的窗口)会显示在屏幕中间,占据大部分屏幕空间。剩下的窗口都处在stacking区域,并放到当前窗口的后面。
-
浮动 Floating
每个窗口都可以自由的移动和调整大小,就好像普通的窗口管理器一样。无论当前是什么布局,对话框窗口总是处在浮
三、使用感想
我是比较懒得折腾的人,就做了一点点事情,大多保持原样:
- 使用默认主题
- 布局layout只留下一个
awful.layout.suit.tile,
把其他都禁用掉了 - 默认右上角的layout样式图表删掉
我目前仍然懒得修改tag,等过一阵子如果使用了,我再来更新这一篇文章把。
四、默认快捷键
以下是默认的快捷键,如果没有做修改,则 mod4 是 Win 键的意思。
一般命令 | 快捷键 |
---|---|
打开菜单 | mod4 + w |
打开程序选择器(需修改配置文件) | alt + esc |
打开程序或命令 | mod4 + r |
执行lua代码 | mod4 + x |
打开终端 | mod4 + enter |
重启awesome | mod4 + ctrl + r |
退出awesome | mod4 + shift + q |
桌面操作 | 快捷键 |
---|---|
切换桌面 | mod4 + num |
在桌面间移动 | mod4 + left/right |
切换至上一个桌面 | mod4 + esc |
将另一桌面的内容显示至当前桌面 | mod4 + ctrl + num |
更改桌面布局 | mod4 + space |
反向更改桌面布局 | mod4 + shift + space |
窗口操作 | 快捷键 |
---|---|
切换至下一窗口 | Mod4 + j |
切换至上一窗口 | Mod4 + k |
在两个窗口间切换 | Mod4 + Tab |
将当前窗口与下一窗口互换位置 | Mod4 + Shift + j |
将当前窗口与上一窗口互换位置 | Mod4 + Shift + k |
增加窗口大小 | Mod4 + l |
减小窗口大小 | Mod4 + h |
增加主窗口个数 | Mod4 + Shift + l |
减少主窗口个数 | Mod4 + Shift + h |
切换窗口的浮动状态 | Mod4 + Ctrl + Space |
窗口最大化与还原 | Mod4 + m |
全屏与还原 | Mod4 + f |
窗口最小化 | Mod4 + n |
窗口最小化还原 | Mod4 + Ctrl + n |
移动至另一桌面 | Mod4 + Shift + num |
关闭窗口 | Mod4 + Shift + c |
移动浮动窗口位置-鼠标 | Mod4 + mouse-left-click |
更改浮动窗口大小-鼠标 | Mod4 + mouse-right-click |
移动浮动窗口位置-键盘 | Mod4 + Ctrl + Arrow-keys |
更改浮动窗口大小-键盘 | Mod4 + PgUp/DN |
我最常用的快捷键:
默认的快捷键并不太符合我的操作习惯,我使用tmux已经很多年了,所以也按照tmux的快捷键给修改掉了。
-
Mod4 + 数字: 到达到某个桌面。
- Mod4+Shift + 数字: 移动当前窗口到某个桌面。
- Mod4+W: 打开nautilus文件浏览器
- Mod+Q:关闭当前窗口。
- Mod+U:提升当前窗口向前,一般用来挪到master的视角。相当于默认的
Mod4 + Shift + k
。
五、自定义配置
awesome的配置文件位于~/.config/awesome/rc.lua
,先前我已经从/etc/xdg/awesome/rc.lua
里拷贝过来了。如果不小心弄坏的话,可以继续从老地方拷贝过来。
每次修改完使用 Mod4 + ctrl + R
重新加载配置。
1. 布局
layouts =
{
awful.layout.suit.floating,
awful.layout.suit.tile,
awful.layout.suit.tile.left,
awful.layout.suit.tile.bottom,
awful.layout.suit.tile.top,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.magnifier
}
注释你不需要的内容。
2. 主题/背景
主题:
rc.lua 配置文件,找到这一行内容:
beautiful.init("/usr/share/awesome/themes/default/theme.lua")
改成你想要的主题名。
背景排列方式:
我希望背景图片最大化但不要拉伸,所以我将原本的
gears.wallpaper.maximized(wallpaper, s, true)
改成了
gears.wallpaper.maximized(wallpaper, s, false)
同时背景设置还有其他的方法:
- centered (surf, s, background, scale)
- tiled (surf, s, offset)
- fit (surf, s, background)
背景:
修改主题的theme.lua文件,改一下图片路径:
theme.wallpaper = { "awsetbg /usr/share/awesome/themes/default/background.png" }
比如我:
theme.wallpaper = "/home/kelu/Pictures/shenhe.JPG"
3. 取消标题栏
标题栏太碍眼了,取消掉。搜索 titlebars_enabled
,设置为 false 来取消标题栏。
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = false }
},
4. 自动登录
由于我是多主机工作的模式,所以其他机器必须要自动登录,我才可以直接操作它们。
一些关于登录管理器的概念可以参考:
我是 gnome 环境,gnome 使用的是 GDM 登录管理器,修改文件 /etc/gdm/daemon.conf
文件即可:
[daemon]
AutomaticLoginEnable=True
AutomaticLogin=username
5. 状态栏插件
Awesome 里的插件指的是你可以在 wibox 上添加的小插件,通过使用插件(Widget),我们可以在状态栏上添加一些有用的信息,例如内存使用、CPU温度、电池状态,等等。官方wiki上有很详细的介绍:http://awesome.naquadah.org/wiki/Widgets_in_awesome
对于新手,可以使用其他用户创建的插件库,这些插件库集成了功能齐全的插件,因此免去了自己编写插件的工作。这类的插件库有很多,常用的有Vicious、 Obvious 等。
我没有折腾太多,显示了cpu/内存/电量就不做更多工作了。也许以后还会增加,到时候再说了。
-
在
rc.lua
头部增加声明信息:local vicious = require("vicious")
-
新增信息
-- kelu custom widget cpuwidget = wibox.widget.textbox() vicious.cache(vicious.widgets.cpu) vicious.register(cpuwidget, vicious.widgets.cpu, "CPU: <span foreground='#20B2AA'> $1% </span>", 13) memwidget = wibox.widget.textbox() vicious.cache(vicious.widgets.mem) vicious.register(memwidget, vicious.widgets.mem, "内存: <span foreground='#20B2AA'> $1% </span>", 13) batwidget = wibox.widget.textbox() vicious.register(batwidget, vicious.widgets.bat, "电量: <span foreground='#20B2AA'> $2% </span>", 61, "BAT1") -- kelu custom widget end
同时在稍微下面一些
wful.screen.connect_for_each_screen
的方法里增加widget信息。
6. 开机自启动应用
以下是我的例子:
-- "by kelu",
local function run_once(cmd_arr)
for _, cmd in ipairs(cmd_arr) do
awful.spawn.with_shell(string.format("pgrep -u $USER -fx '%s' > /dev/null || (%s)", cmd, cmd))
end
end
run_once({ "synergy" })
run_once({ "ibus-daemon -d -x -r -n awesome" })
run_once({ "compton --conf /home/kelu/.config/compton.conf" })
run_once({ "/home/kelu/桌面/WeChat.desktop" })
7. 自定义快捷键
编辑 rc.lua
,在文件中查找文本
-- {{{ Key bindings
globalkeys = awful.util.table.join(
在此之下,可以添加您的自定义命令,例如:
-- {{{ Key bindings
globalkeys = awful.util.table.join(
-- My Bindings
awful.key({ }, "F1", function () awful.util.spawn_with_shell("terminator") end),
以下是我的一些例子,注意不要和原有的快捷键冲突噢:
-- Custom
awful.key({ "Control" , }, "3", function () awful.util.spawn_with_shell("shutter -f") end,
{description = "screenshot", group = "custom"}),
awful.key({ "Control" , }, "4", function () awful.util.spawn_with_shell("shutter -a") end,
{description = "screenshot", group = "custom"}),
awful.key({ "Control" , }, "5", function () awful.util.spawn_with_shell("shutter -s") end,
{description = "screenshot", group = "custom"}),
awful.key({ modkey, }, "e", function () awful.util.spawn_with_shell("nautilus --no-desktop .") end,
{description = "nautilus", group = "custom"}),
awful.key({ modkey, }, "w", function () awful.util.spawn_with_shell("/usr/share/typora/Typora /home/kelu/Workspace/document/todo.md") end,
{description = "Typora", group = "custom"}),
-- awful.key({ modkey, }, "w", function () awful.util.spawn_with_shell("nautilus --no-desktop .") end,
-- {description = "nautilus", group = "custom"}),
awful.key({ modkey, }, "b", function () awful.util.spawn_with_shell("google-chrome-stable") end,
{description = "chrome", group = "custom"}),
我配置了自己的group叫custom,所有快捷键的信息可以使用 Mod4+S
快捷键查询。
配置信息基本都能看懂
8.管理网络连接
Gnome Shell 有自己的网络连接管理面板,但实际上还是调用了 NetworkManager 的 接口,而 NetworkManager 又很贴心地提供了命令行控制程序 nmcli . 我的网络环 境一般比较稳定,没必要特地在 GUI 上显示网络状态,一般的网络操作在命令行下就 能完成。
参考redhat有相关文档。我这篇 blog 记录如何操作 nmcli
。
nmcli dev wifi
nmcli dev wifi connect <SSID>
nmcli conn up <Name or UUID>
9. 自定义关闭窗口快捷键
在方法 clientkeys = awful.util.table.join
内部添加:
awful.key({ modkey, }, "q", function (c) c:kill() end,
{description = "close", group = "custom"}),
awful.key({ altkey, }, "q", function (c) c:kill() end,
{description = "close", group = "custom"}),
10. 透明设置
compton是窗口透明化的工具,如果你当前使用的软件支持窗口透明的功能,那么compton可以帮你设置透明度,阴影效果,窗口切换效果等。
$ sudo apt-get install compton
$ compton & #启动
安装后配置文件在
~/.config/compton.conf
这是我的配置:compton.conf 。配置里做了一些系统阴影和透明度的处理。透明度是这个配置。
inactive-opacity = 0.8;
不活动的窗口设置0.8的透明度。
修改之后要记得重启 compton
# 先查找compton的pid
ps aux | grep comption
kill -9 <pid>
compton --conf /home/kelu/.config/compton.conf
待完成
- 多显示器
- 设置tags
- 设置浮动窗口
- 音量
- 屏保
- 微信
参考资料
- 从 Gnome Shell 切换到 Awesome WM
- 平铺式窗口管理器-Awesome
- Hash Linux:预配置了四种平铺窗口管理器的 Arch Linux 衍生版
- awesome:linux下的平铺式桌面
- Awesome配置
- Awesome 入门安装、配置、使用(纯入门实用主义)
- https://archlinuxblog.medium.com/installing-and-configuring-awesome-wm-b4684fd09c9
- compton透明设置
- b4dtR1p/awesome
- awesome WM 每个tag用不同壁纸
- awesome (简体中文)
- How To Install and Configure Awesome WM
- Hash Linux:预配置了四种平铺窗口管理器的 Arch Linux 衍生版