linux awesome 窗口管理器使用备忘

最近将窗口管理器从 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官网上挂着的图。

当然我也短暂尝试过 bspwmi3 ,感觉不是很舒服就没有往下继续了。

二、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样式图表删掉

image-20211231165628264

我目前仍然懒得修改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)

image-20211231172316850

同时背景设置还有其他的方法:

  • 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. 取消标题栏

参考资料:awesome (简体中文) - archlinux

标题栏太碍眼了,取消掉。搜索 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

对于新手,可以使用其他用户创建的插件库,这些插件库集成了功能齐全的插件,因此免去了自己编写插件的工作。这类的插件库有很多,常用的有ViciousObvious 等。

– 来自平铺式窗口管理器-Awesome - hahack.com

我没有折腾太多,显示了cpu/内存/电量就不做更多工作了。也许以后还会增加,到时候再说了。

  • rc.lua 头部增加声明信息:

    local vicious = require("vicious")
    

    image-20211231175612138

  • 新增信息

    -- 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信息。

    ba

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 快捷键查询。

image-20211229091449649配置信息基本都能看懂

image-20211231180420061

image-20211231180448581

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
  • 设置浮动窗口
  • 音量
  • 屏保
  • 微信

参考资料


我逃离了开源社区 - getleon.ai nmcli 使用命令行连接wifi