不管是开发还是日常使用,我一直是使用黑苹果作为主力桌面系统,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功能比较简洁,如图:
左上角数字部分被称为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字体优选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/
多说一句,编辑好需要启动的脚本之后,建议检查下对应的脚本是否有可执行权限。
到这一步的截图: