不管是开发还是日常使用,我一直是使用黑苹果作为主力桌面系统,Linux作为服务器系统,但是最近入职了新公司,公司提供的开发用的电脑不是很好黑苹果,再加上目前做的项目使用Linux可能更友好,再加上借着公司项目开发的机会想更进一步学习下Linux,于是花了点时间在自己电脑上装了ArchLinux+DWM,研究了下ArchLinux配合DWM作为桌面系统,期间遇到了部分问题,在此做个记录,方便以后我自己再次配置或者同样有需要的朋友。

开始及前提

入门ArchLinux还是在2014年左右大学的时候,毕业之后就换到了macOS,这么多年也更没有那么多时间去折腾ArchLinux,如今再次将ArchLinux作为桌面系统使用,发现有些东西跟之前折腾的有些不一样了,至于为什么选择ArchLinux这个Linux发行版当做桌面系统,主要还是看中ArchLinux的AUR,实在是太强大了,基本上日常要用的软件都能通过AUR安装,例如微信、PhpStorm、Postman及Chrome等。

我之前也折腾过i3,记录在这:https://zocoxx.com/archlinux-i3wm.html,最后发现虽然功能类似,但是我还是更喜欢DWM,实际使用之后确实发现DWM比i3顺手,而且我更喜欢DWM的更改源代码及打补丁的配置方式,于是最后选择了DWM作为日常使用系统。

我不准备从ArchLinux安装开始记录,只记录DWM安装配置相关的,如果是刚接触ArchLinux的朋友,所以文章中涉及的一些概念或者软件会比较陌生,我希望我能尽量解释清楚。

我是从我自己的需求出发,所以大多数配置过程可能带有主观因素。我个人比较喜欢简约风,所以大多数情况不会去考虑美观,更多是考虑功能。

开始安装之前,我假设目前情况为一台纯净安装且能正常联网的ArchLinux主机,本地物理机、虚拟机或者是云主机都行,最好是没有安装任何软件包的。

开始之前建议创建一个具有sudo权限的非root用户,用于日常图形化界面登录,本文以zoco为用户名进行操作,本文相关命令需要root权限的我都加了sudo,我想尽量能方便以后我自己或者有需要的朋友直接复制黏贴。

因部分软件包依赖于AUR,建议提前配置并安装好yay等工具。

安装依赖

首先是安装Xorg相关软件包:

sudo pacman -S xorg-server xorg-xinit libxft

安装字体,否则可能会导致后续步骤无法进入图形化界面,如果安装的是别的字体,后续修改配置文件时记得修改成别的对应的字体:

sudo pacman -S ttf-dejavu

安装DWM下载及编辑源码所需要的依赖:

sudo pacman -S git vim

如果ArchLinux安装的时候,没有安装base-devel包,在安装DWM之前需要安装上:

sudo pacman -S base-devel # 非必须,如果安装ArchLinux时安装过了,无需再次安装

额外的,终端软件包,我不喜欢dwm同门的suckless出品的st,如果不需要的话可以不装:

sudo pacman -S alacritty

克隆DWM相关仓库及相应软件包

本文重点虽然为DWM,但是如果要能正常使用,其实还是需要别的一些软件包进行配合使用,这里先简单介绍一下对应的软件包:

  • dwm 窗口平铺管理器,重点,必须,没啥好说的
  • dmenu 软件启动器,用于在进入dwm之后借助此软件启动第三方软件,例如Chrome、IDEA等,非必须,功能及界面比较简单,如果想要美观,可以考虑第三方的rofi
  • st 终端软件,类似于Windows的cmd或者PowerShell,或者macOS的Terminal或iTerm2,非必须,修改配置麻烦,且不支持多Tab,我个人不喜欢,我更推荐使用alacritty
  • slstatus 用于进入dwm之后屏幕右上角显示额外的信息,右上角默认只有dwm的版本号,通过这个软件可以展示CPU、内存、日期及时间等信息,非必须

下面是对应的软件克隆名,可以根据需要进行:

mkdir suckless
cd suckless
git clone https://git.suckless.org/dwm
git clone https://git.suckless.org/dmenu
git clone https://git.suckless.org/st
git clone https://git.suckless.org/slstatus

如果是第一次接触DWM,获取到代码之后,可以先使用默认配置,进入如上每个源码文件目录执行如下命令即可编译及安装到系统:

sudo make clean install

多说一句,上面4个程序的源代码配置文件都是config.def.h,如果需要自定义配置的话,直接修改此文件,然后删除config.h再执行上述命令即可编译及安装到系统目录。

新手的话,建议先使用默认配置进入DWM再说,默认设置功能虽然少了点,但是也能凑合用,进入DWM可以根据实际的样式再进行调整。

启动DWM

要进入DWM,光是编译好上面几个程序还不够,还需要配置文件配合。

启动DWM的方式有两种,一种是系统启动后通过命令行登录,然后执行startx命令启动DWM,另一种是通过SDDM等登录管理器启动,两种启动方式我这里都做个记录。

startx命令启动dwm

如果不打算使用登录管理器,直接命令行启动的话,只需要一个~/.xinitrc文件就行。

复制配置文件到非root用户目录:

cp /etc/X11/xinit/xinitrc ~/.xinitrc

然后修改~/.xinitrc,将文件末尾的twm &开始到最后的几行删除,然后在文件末尾添加一行:

exec dwm

保存退出之后,命令行执行startx,如无意外的话,即可进入DWM了。

通过登录管理器进入DWM

使用root权限到/usr/share/xsessions/新建一个文件,名称可以为dwm.desktop,内容如下:

# /usr/share/xsessions/dwm.desktop

[Desktop Entry]
Encoding=UTF-8
Name=Dwm
Comment=Dynamic window manager
Exec=dwm
Icon=dwm
Type=XSession

然后启动登录管理器,例如SDDM,即可在登录界面选择DWM然后进入到DWM了。

DWM基本使用简介

默认配置的DWM功能比较简洁,如图:

DWM默认

左上角数字部分被称为tag,中间是显示各种软件或者内容的title,右上角默认是DWM的版本号,当前2022年9月是6.3,然后就是一个鼠标箭头以及一大块黑色区域了。

如果没有修改默认配置,则DWM的默认的MODKEY为Alt键,本文以下快捷键假设没有修改过MODKEY记录各种快捷键,如果修改了MODKEY,则需要根据实际修改的MODKEY进行操作。

一些常用的快捷键:

  • Alt + Shift + Enter 打开默认终端,默认为st,如果没有安装或者此快捷键没有响应,可以更改DWM源码目录下面的config.def.h相关配置
  • Alt + P 启动dmenu,用于程序启动,例如输入chrome可以启动Chrome浏览器
  • Alt + F 切换到浮动模式
  • Alt + T 切换到平铺模式
  • Alt + M 将窗口最大化
  • Alt + 数字 切换到对应的tag
  • Shift + Alt + 数字 将当前程序移动到对应的tag
  • Alt + Enter 将窗口在主窗口及栈窗口切换
  • Alt + J/K 切换程序
  • Alt + H/L 调整主窗口及右侧栈窗口直接的大小
  • Alt + Shift + Q 退出DWM
  • Alt + Shift + C 关闭程序
  • Alt + 空格 在平铺及浮动模式中切换

以下快捷键在浮动模式下可能用的上:

  • Alt + 鼠标左键单击 将对应的程序窗口切换到最上层
  • Alt + 鼠标右键拖动 调整窗口大小
  • Alt + 鼠标左键拖动 调整窗口位置
  • Alt + 鼠标中键点击 将窗口最大化

这是我默认配置下,使用浮动模式以及配合鼠标进行调整窗口的截图:

DWM 窗口浮动

DWM配置修改

DWM的配置我修改的比较少,主要是自定义了下DWM的字体信息,部分我修改了的配置如下:

/* 修改DWM字体优选SourceCodePro,中文字体是文泉驿微米黑 */
static const char *fonts[]          = { "SourceCodePro-Regular:size=14", "WenQuanYi Micro Hei:size=14" };

/* 设置DMENU字体默认为SourceCodePro */
static const char dmenufont[]       = "SourceCodePro-Regular:size=14";

/* 因我没有选择默认的st终端,而是选择了alacritty,所以将默认终端改为alacritty */
static const char *termcmd[]  = { "alacritty", NULL };

slstatus设置

默认情况下,DWM右上角是只有一个版本号的,slstatus就是用来在右上角显示部分别的信息的,从配置文件可以看出,其支持展示的信息也不少,这里贴出我的slstatus的config.def.h相关配置信息:

static const struct arg args[] = {
        { ram_perc, "[RAM %s%] ", NULL },
        { cpu_perc, "[CPU %s%] ", NULL },
        { load_avg, "[LOAD %s] ", NULL },
        { temp, "[TEMP %sC] ", "/sys/class/thermal/thermal_zone0/temp" },
        { battery_perc, "[BAT %s%] ", "BAT0" },
        { datetime, "%s",           "%F %T" },
};

我上面这段配置展示了内存及CPU的利用率,系统负载,CPU温度,因为是笔记本,还展示了笔记本的电量信息,最后就是日期及时间信息。

如果有别的需求,可参照config.def.h文件开头部分进行别的信息展示。

这里多说一句,需要注意每个展示项的参数格式,如果参数不正确,会导致编译时报错无法通过。

DWM打补丁

DWM默认功能比较简单,如果需要实现别的功能,需要通过对源代码进行打补丁操作进行扩展,DWM官网补丁相关页面:

https://dwm.suckless.org/patches/

打补丁的方法很简单,wget或者别的方式下载对应补丁文件,然后使用patch命令,例如,给DWM打autostart补丁,相关命令及流程如下:

wget https://dwm.suckless.org/patches/autostart/dwm-autostart-20210120-cb3f58a.diff
patch < dwm-autostart-20210120-cb3f58a.diff

执行完毕之后,重新执行sudo make clean install然后按Alt+Shift+Q退出DWM然后重新进入DWM即可。

DWM撤销打补丁

某些情况下,如果我们打完补丁之后发现编译报错或者想要取消对应的功能,可能需要用到撤销打补丁,以上面的autostart补丁为例,撤销命令为:

patch -R < dwm-autostart-20210120-cb3f58a.diff

也就是patch之后跟上-R参数即可。

DWM自启服务

虽然网上很多文章说,可以通过编辑~/.xinitrc文件实现自动启动部分程序或者执行部分命令,例如启动picom或者设置壁纸,但是经过我的实际使用发现,在~/.xinitrc文件中无论是直接启动对应的程序或者使用exec命令都可能出现对应程序无法启动的问题,我的解决办法是打上上面的autostart补丁,然后利用autostart补丁配合脚本进而启动别的程序。

打上autostart补丁之后,DWM启动时会自动执行”~/.dwm/autostart.sh &”脚本,我们可以把需要执行的程序或者命令放到此脚本。

相关详细解释可以移步这里:https://dwm.suckless.org/patches/autostart/

多说一句,编辑好需要启动的脚本之后,建议检查下对应的脚本是否有可执行权限。

到这一步的截图:

ArchLinux DWM