☰
Arch Linux st+dwm深度定制指南:从X11配置到可审计工作流
2026/10/18 4:48:40 网站建设 项目流程

1. 这不是“换皮肤”,而是一场对Linux底层交互逻辑的重写

Arch Linux 美化(st + dwm)——这八个字在终端用户圈里,早已不是“让系统看起来更漂亮”这么简单。它代表一种明确的技术立场:拒绝预设、剥离冗余、亲手构建人与机器之间最精简、最可控的交互通道。st 是一个极简主义终端模拟器,代码不到3000行,不支持鼠标、不带标签页、不提供图形配置界面;dwm 是一个平铺式窗口管理器,没有任务栏、没有开始菜单、没有动画过渡,所有窗口布局由键盘指令实时计算生成。把这两个组件组合起来,本质上是在 Arch 这个“裸金属发行版”之上,用 C 语言和 X11 协议,从零搭起一套完全可审计、可预测、无黑箱的图形工作环境。

我第一次在某高校实验室的旧 ThinkPad 上部署这套组合时,花了整整三天才让 CapsLock 键真正变成 Mod4(Super)键,让Mod4 + Shift + Return稳定唤出 st 终端,而不是偶尔触发 GNOME 的快捷键覆盖层。这不是配置失误,而是两种哲学的碰撞:桌面环境(DE)追求“开箱即用”的包容性,而 st + dwm 追求“每行代码可知可控”的确定性。它解决的核心问题,从来不是“怎么让图标变圆润”,而是“当我要执行一条命令时,从按下回车到字符出现在屏幕上,中间到底经过了多少层抽象、多少次内存拷贝、多少个未声明的事件监听器?”——这个问题的答案,在 GNOME 或 KDE 里需要翻阅数万行文档和源码,在 st + dwm 里,你打开config.h文件,就能看到static char *termcmd[] = { "st", NULL };这一行,它就是全部。

适合谁?不是所有 Linux 用户。它适合那些已经用过至少两个主流桌面环境、能熟练编写 shell 脚本、愿意为 200ms 的窗口切换延迟去阅读 X11 事件循环文档的人;也适合刚接触 Linux 的硬核新手——不是因为他们技术强,而是因为他们尚未被“图形界面就该有托盘、通知、自动挂载U盘”的惯性思维固化,反而更容易理解“窗口只是矩形坐标+像素缓冲区”这个本质。它不教你怎么点开设置调主题,它逼你去改Xresources里的st.color0: #2e3440,然后xrdb -merge ~/.Xresources,再手动重启 st 才能看到变化。这种“低效”,恰恰是它最珍贵的教学价值:它把所有隐藏的自动化过程,全部摊开在你面前,让你亲手缝合每一处接口。

2. 整体设计思路:为什么是 st + dwm,而不是其他组合?

2.1 选型逻辑:轻量不是目的,可控才是核心

很多人看到“Arch + st + dwm”第一反应是“为了轻量”。这是常见误解。st 的二进制体积确实只有 120KB,dwm 编译后约 80KB,但这不是关键。真正决定这个组合生命力的,是它们的可审计性边界和扩展范式一致性。

  • st 的不可替代性在于其“无状态”设计:它不维护会话历史(靠 shell 的 history 实现),不缓存字体(每次渲染都走 fontconfig 查询),不管理标签页(交给 tmux 或 shell 的 job control)。这意味着,当你发现文字渲染发虚,问题一定出在~/.fonts.conf或Xresources的st.font配置上,绝不会是 st 自身的某个隐藏渲染开关。我曾为排查一个中文标点错位问题,直接在 st 源码的xdraws()函数里加了三行fprintf(stderr, "..."),重新编译,5分钟定位到是XftDrawStringUtf8调用时传入的XftFont对象未正确加载 fallback 字体。这种调试效率,在 Electron 构建的终端里是不可想象的。

  • dwm 的平铺逻辑天然适配键盘工作流:它不模拟 Windows/Mac 的“自由拖拽”窗口模型,而是将屏幕划分为动态网格。Mod4 + J/K切换焦点,Mod4 + H/L调整主区域宽度,Mod4 + Space切换布局(堆叠/并排/全屏)。这些操作背后是纯数学计算:nmaster(主区域窗口数)、mfact(主区域占比)、nstack(堆叠区窗口数)三个变量,决定了每个窗口的x,y,w,h值。你可以打开dwm.c,找到tile()函数,里面就是几行 for 循环和除法运算。没有状态机,没有异步回调,只有确定性的坐标生成。这使得自动化脚本可以精确预测窗口位置——比如写一个 Python 脚本,调用xdotool获取当前窗口尺寸,再计算下一个终端应该 spawn 在哪个坐标,实现真正的“所想即所得”。

提示:不要试图用dmenu替代应用启动器。dmenu 是一个 X11 客户端,它本身也需要被 dwm 管理。它的价值在于“输入即执行”:你敲f,它过滤出 firefox,回车,dwm 就收到MapRequest事件,按当前布局规则分配空间。这个过程没有中间代理,没有 DBus 通信,没有权限协商。

2.2 为什么不是其他终端或 WM?

  • 对比 alacritty / kitty:它们性能更强、支持 GPU 渲染、有丰富功能,但代价是引入 Vulkan/GL 后端、WebAssembly 字体光栅化、复杂的配置 TOML/YAML。当alacritty.yml里一个draw_bold_text_with_bright_colors: true配置项导致粗体中文显示异常时,你需要查的是 Alacritty 的 issue tracker、font-kit 库的 PR、甚至 freetype 的版本兼容性。而 st 的问题,永远只在你自己改的那几行config.h里。

  • 对比 i3 / sway:i3 功能完备,有文档、有社区、有状态保存,但它是一个“黑盒”WM。它的布局算法封装在src/layout.c里,你无法在运行时用printf打印出当前split_ratio的实时值;sway 作为 wlroots 实现,又引入了 Wayland 协议栈的复杂性。而 dwm 的整个窗口管理逻辑,就写在dwm.c的 2000 行代码里,且注释清晰。某次我需要实现“仅在主显示器启用全屏,副屏保持平铺”,直接在togglefullscreen()函数里加了两行if (selmon->m == selmon->mon) { ... }就完成了,无需学习新 API。

  • 为什么必须是 Arch?不是因为它“最新”,而是因为它的包管理哲学与 st/dwm 完全同频:不提供预编译二进制,只提供 PKGBUILD。当你yay -S st时,AUR 助手会下载 PKGBUILD,你可以在build()函数里插入sed -i 's/DEFAULT_FONT.*/DEFAULT_FONT = "Iosevka Nerd Font:size=12"/' config.def.h,然后makepkg -si。整个过程,你始终掌控着编译参数、补丁应用顺序、依赖链接方式。Ubuntu 的apt install st-term给你一个.deb,你永远不知道它链接了哪个版本的libxft。

2.3 美化的本质:是信息密度的重构,而非视觉装饰

在 st + dwm 语境下,“美化”一词需要被重新定义。它不等于“安装一个 GTK 主题包”或“换一套图标”。它是指:

  • 降低视觉噪声:st 默认禁用光标闪烁(cursorblink = 0),dwm 默认无边框(borderpx = 0),所有非必要像素都被移除。你看到的每一个像素,都是你主动选择保留的。

  • 提升信息信噪比:通过Xresources设置st.background: #00000000(完全透明),配合compton的opacity-rule = [ "90:class_g = 'st'" ],让终端背景呈现微妙的毛玻璃效果,但文字依然锐利——这不是为了炫技,而是让终端内容(代码/日志)在纷杂的桌面背景下依然成为视觉焦点。

  • 建立操作肌肉记忆:Mod4 + P唤出 dmenu,输入nvim,回车,st 启动,自动执行exec nvim -u ~/.config/nvim/init.vim。这一串动作,从按键到编辑器加载完成,全程无鼠标介入,耗时 < 800ms。这种确定性,是任何触控或语音交互都无法替代的生产力内核。

这套设计思路,最终导向一个反直觉的结论:最成功的美化,是让用户忘记“美化”这件事本身。当你不再需要思考“怎么让窗口圆角”“怎么让通知不遮挡代码”,而是所有交互都像呼吸一样自然时,你就真正进入了 st + dwm 的世界。

3. 核心细节解析:从 Xresources 到 dwm 补丁链

3.1 Xresources:那个被低估的“全局配置中枢”

~/.Xresources是 st + dwm 生态里最沉默也最关键的枢纽。它不是简单的“颜色配置文件”,而是一个运行时注入 X11 客户端属性的协议网关。st 和 dwm 都在启动时读取它,并据此初始化各自的内部状态。

先看一个生产环境级的Xresources片段:

! st 配置 st.font: Iosevka Nerd Font:size=12:antialias=true:autohint=true st.color0: #2e3440 st.color1: #bf616a st.color2: #a3be8c st.color3: #ebcb8b st.color4: #81a1c1 st.color5: #b48ead st.color6: #88c0d0 st.color7: #e5e9f0 st.color8: #4c566a st.color9: #bf616a st.color10: #a3be8c st.color11: #ebcb8b st.color12: #81a1c1 st.color13: #b48ead st.color14: #88c0d0 st.color15: #eceff4 st.background: #2e3440 st.foreground: #e5e9f0 st.cursorColor: #88c0d0 st.scrollBar: false st.transparent: true st.alpha: 0.95 ! dwm 配置 dwm.normbgcolor: #2e3440 dwm.normfgcolor: #e5e9f0 dwm.selbgcolor: #4c566a dwm.selfgcolor: #88c0d0 dwm.borderpx: 2 dwm.snap: 10

关键点解析:

  • 字体配置的陷阱:st.font必须使用 X Logical Font Description(XLFD)格式或 fontconfig 别名。Iosevka Nerd Font:size=12是 fontconfig 别名,它依赖于~/.fonts.conf中已注册该字体。我曾因fc-list | grep "Iosevka"返回空而卡住一整天,最后发现是~/.local/share/fonts/下的字体文件权限为600,fc-cache无法读取。解决方案:chmod 644 ~/.local/share/fonts/Iosevka*.ttf && fc-cache -fv。

  • 颜色值的双重含义:st.color0不仅定义了 ANSI 黑色,还作为st.background的默认值。但st.background可以覆盖它,实现“背景色 ≠ ANSI 黑色”的效果。这在开发中极其有用:你可以让st.color0是深灰(用于ls --color的目录显示),而st.background是纯黑(减少 OLED 屏幕烧屏风险)。

  • 透明度的层级控制:st.transparent: true启用 X11 的Composite扩展,但实际透明度由st.alpha: 0.95控制。这个值不是越大越好。实测发现,alpha=0.98在 Intel 核显上会导致轻微拖影,0.95是稳定阈值。而dwm.borderpx: 2配合dwm.selbgcolor: #4c566a,让当前聚焦窗口有一条 2px 的高亮边框,这是唯一能快速识别“哪个窗口有焦点”的视觉线索——在无边框设计中,这个细节能避免 30% 的误操作。

注意:xrdb -merge ~/.Xresources必须在startx或lightdm启动 dwm 之前执行。如果在 dwm 运行中修改并重新 merge,st 会立即生效(因为它监听 X 属性变更),但 dwm 的颜色不会变——dwm 只在启动时读一次。这是 X11 客户端生命周期的经典特性,不是 bug。

3.2 dwm 的 config.h:你的个人操作系统内核

dwm的配置不是写 YAML,而是直接修改 C 头文件config.h,然后sudo make clean install。这个看似“反人类”的流程,恰恰是其力量的来源:所有配置项都是编译期常量,没有运行时解析开销,没有配置错误导致的崩溃。

一个典型config.h的关键区块:

/* appearance */ static const unsigned int borderpx = 2; /* border pixel of windows */ static const unsigned int snap = 10; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "Iosevka Nerd Font:size=12" }; static const char dmenufont[] = "Iosevka Nerd Font:size=12"; static const char col_gray1[] = "#2e3440"; /* normal background */ static const char col_gray2[] = "#4c566a"; /* inactive border */ static const char col_gray3[] = "#e5e9f0"; /* normal foreground */ static const char col_gray4[] = "#88c0d0"; /* active border */ static const char col_cyan[] = "#005577"; /* tagging */ static const char *tags[] = { "", "", "", "", "", "", "", "", "" }; /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ /* key definitions */ #define MODKEY Mod4Mask #define TAGKEYS(KEY,TAG) \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "st", NULL }; static const char *browsercmd[] = { "firefox", NULL };

深度拆解:

  • mfact = 0.55的数学意义:在monocle布局外,dwm 默认使用tile布局。mfact决定了主区域(master area)占屏幕宽度的比例。0.55意味着主区域占 55%,堆叠区(stack area)占 45%。如果你打开 3 个终端,nmaster=1,则第一个终端独占 55% 宽度,后两个终端在右侧 45% 区域内垂直平分(各占 22.5%)。这个值不是凭感觉调的,而是基于黄金分割比0.618向下微调而来,实测在 1920x1080 屏幕上,0.55让主区域刚好容纳 120 列代码,堆叠区两个终端各 60 列,符合程序员多任务习惯。

  • tags[]的图标编码:""是 FontAwesome 的终端图标,它不是一个图片,而是 Unicode 字符。dwm 使用XCreateFontSet加载字体,因此必须确保fonts[]数组里指定的字体(如 Iosevka Nerd Font)包含了这些图标 glyph。fc-list | grep "Nerd"可验证。如果图标显示为方块,说明字体缺失,需重新安装 Nerd Font 并fc-cache -fv。

  • SHCMD宏的威力:{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd} }启动 st,但termcmd是静态数组。而{ MODKEY|ShiftMask, XK_E, spawn, SHCMD("st -e nvim ~/notes.md") }则能动态执行任意 shell 命令。这个宏展开后是spawn, { .v = (const char*[]){ "/bin/sh", "-c", "st -e nvim ~/notes.md", NULL } },它绕过了 dwm 的静态命令表,实现了无限扩展性。

3.3 st 的 config.h:终端行为的终极控制权

st 的config.h比 dwm 更激进,它直接定义了终端的“物理定律”:

/* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ [0] = "#2e3440", /* black */ [1] = "#bf616a", /* red */ [2] = "#a3be8c", /* green */ [3] = "#ebcb8b", /* yellow */ [4] = "#81a1c1", /* blue */ [5] = "#b48ead", /* magenta */ [6] = "#88c0d0", /* cyan */ [7] = "#e5e9f0", /* white */ /* 8 bright colors */ [8] = "#4c566a", /* black */ [9] = "#bf616a", /* red */ [10] = "#a3be8c", /* green */ [11] = "#ebcb8b", /* yellow */ [12] = "#81a1c1", /* blue */ [13] = "#b48ead", /* magenta */ [14] = "#88c0d0", /* cyan */ [15] = "#eceff4", /* white */ /* special colors */ [256] = "#2e3440", /* background */ [257] = "#e5e9f0", /* foreground */ [258] = "#88c0d0", /* cursor */ }; /* more color options */ static const char *initcolors[] = { "#2e3440", /* background */ "#e5e9f0", /* foreground */ "#88c0d0", /* cursor */ NULL }; /* Default font settings */ static const char *font = "Iosevka Nerd Font:size=12"; static const char *font2 = "Noto Color Emoji:size=12"; /* CursorBlink timeout (in ms) */ static unsigned int cursorblink = 0; /* Line height (factor) */ static float lineheight = 1.0; /* Allow bold and underline to use bright colors */ static int allow_bold = 1; static int allow_underline = 1; /* Scrollback buffer size (in lines) */ static unsigned int scrollback = 10000;

关键细节:

  • scrollback = 10000的内存权衡:st 的滚动缓冲区是纯内存数组,10000行意味着约 10MB 内存(假设每行 100 字符)。这比默认的1000行大 10 倍,但换来的是less查看大日志时无需担心丢失顶部内容。实测在 16GB 内存的机器上,这个值完全无压力。

  • font2的存在意义:font2是 fallback 字体,专门用于渲染 emoji 和特殊符号。当font(Iosevka)里找不到某个 glyph(如 🐧),st 会自动切换到font2(Noto Color Emoji)渲染。这避免了 emoji 显示为方块,且不影响主字体的编程体验。

  • lineheight = 1.0的精准控制:这个值是行高的缩放因子。1.0表示字体原始行高,1.1会增加 10% 行距。在高 DPI 屏幕上,1.05能缓解文字挤在一起的感觉,但1.2会让代码行间距过大,破坏视觉节奏。这个参数没有“标准值”,必须根据你的屏幕 PPI 和个人眼感实测调整。

4. 实操过程:从空白 Arch 到可工作的 st + dwm 环境

4.1 环境准备:最小化安装与基础依赖

Arch Linux 的安装本身就是一个“净化仪式”。我们跳过 GUI 安装器,全程使用archinstall脚本或手动分区,目标是得到一个纯净的 base 系统:

# 1. 分区(UEFI 模式) sgdisk -Z /dev/sda # 清空 GPT sgdisk -o /dev/sda # 新建空 GPT sgdisk -n 1:0:+512M -t 1:ef00 -c 1:"EFI System" /dev/sda # EFI 分区 sgdisk -n 2:0:0 -t 2:8300 -c 2:"Linux Root" /dev/sda # 根分区 # 2. 格式化 mkfs.fat -F32 /dev/sda1 mkfs.ext4 /dev/sda2 # 3. 挂载 mount /dev/sda2 /mnt mkdir -p /mnt/boot/efi mount /dev/sda1 /mnt/boot/efi # 4. 安装基础系统 pacstrap /mnt base linux linux-firmware vim nano sudo # 5. 生成 fstab genfstab -U /mnt >> /mnt/etc/fstab # 6. 进入新系统 arch-chroot /mnt

进入 chroot 后,安装核心依赖:

# 更新系统 pacman -Syu # 安装 X11 基础 pacman -S xorg-server xorg-xinit xorg-xrandr xorg-xset xorg-xinput # 安装字体(关键!) pacman -S ttf-iosevka-nerd ttf-noto-emoji ttf-dejavu # 安装 AUR 助手(用于 st/dwm) pacman -S git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si cd .. # 安装 st 和 dwm(从 AUR) yay -S st-term dwm

注意:st-term和dwm的 AUR PKGBUILD 默认会编译并安装到/usr/local/bin/。确保你的$PATH包含/usr/local/bin,否则startx会找不到dwm。

4.2 配置 X11 启动流程:.xinitrc的艺术

~/.xinitrc是 X11 会话的“启动脚本”,它决定了startx后运行什么。一个健壮的.xinitrc必须处理三件事:环境变量注入、后台服务启动、前台 WM 启动。

#!/bin/sh # 1. 加载 Xresources if [ -f "$HOME/.Xresources" ]; then xrdb -merge "$HOME/.Xresources" fi # 2. 启动后台服务(必须 &,且 sleep 避免竞态) # 启动 compton(透明/阴影) compton -b --config ~/.config/compton.conf & # 启动 picom(compton 的现代分支,更稳定) # picom -b --config ~/.config/picom.conf & # 启动网络管理器(如果不用 NetworkManager,可跳过) # systemctl --user start NetworkManager & # 启动剪贴板管理器(重要!st 默认不支持跨应用粘贴) clipit & # 3. 设置 DPI 和缩放(高 DPI 屏幕必需) xrandr --dpi 192 # 4. 启动 dwm(前台进程,不能加 &) exec dwm

关键点:

  • xrdb -merge必须在compton之前:因为 compton 的opacity-rule依赖class_g属性,而class_g是由Xresources里的st*className: St定义的(需在 st 源码config.h中设置static char *class = "St";)。

  • comptonvspicom:compton 已停止维护,picom 是其活跃分支。但 picom 的--config参数要求配置文件路径必须绝对,且shadow-exclude规则语法略有不同。生产环境推荐 picom,配置文件~/.config/picom.conf示例:

backend = "glx" vsync = true paint-on-overlay = true unredir-if-possible = true shadow-radius = 12 shadow-offset-x = -12 shadow-offset-y = -12 shadow-opacity = 0.3 shadow-exclude = [ "! name~=''", "name *= 'Notification'", "name *= 'Plank'", "class_g = 'St'" ]
  • clipit的不可替代性:st 默认只支持 PRIMARY 剪贴板(鼠标选中即复制,中键粘贴),不支持 CLIPBOARD(Ctrl+C/Ctrl+V)。clipit是一个轻量级守护进程,它监听 PRIMARY 剪贴板变化,并自动同步到 CLIPBOARD,完美解决 st 与 Firefox/VSCode 的粘贴兼容性问题。

4.3 st 的深度定制:从编译补丁到运行时技巧

st 的强大在于其“补丁文化”。AUR 上有超过 50 个 st 补丁,每个都解决一个具体痛点。以下是生产环境必打的三个补丁:

补丁 1:scrollback(增强滚动缓冲区)

官方 st 的滚动缓冲区是固定大小且不可配置。scrollback补丁添加了ScrollUp/ScrollDown键绑定,并允许通过st -l 10000指定行数。

应用方法:

yay -S st-git # 安装 git 版本,支持补丁 cd ~/.cache/yay/st-git/src/st-* # 下载补丁 wget https://st.suckless.org/patches/scrollback/st-scrollback-0.8.5.diff # 打补丁 patch -p1 < st-scrollback-0.8.5.diff # 修改 config.h,添加键绑定 # { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, # { ShiftMask, XK_Page_Down, kscrolldown, {.i = 1} }, make && sudo make install
补丁 2:clipboard(原生支持 Ctrl+C/V)

此补丁让 st 直接响应Ctrl+Shift+C和Ctrl+Shift+V,无需clipit。但它会与某些 shell 的Ctrl+V(字面量输入)冲突,需在config.h中谨慎启用。

补丁 3:alpha(原生透明度支持)

比compton更底层的透明方案。它修改 st 的绘图逻辑,直接在 X11 surface 上绘制半透明像素,CPU 占用更低,且与compton的阴影效果叠加更自然。

实操心得:不要一次性打所有补丁。st 的补丁之间可能有冲突(如alpha和scrollback都修改x.c的xdraws()函数)。我的做法是:每次只打一个补丁,make成功后,用st -v验证版本号,再测试功能,确认无误后再打下一个。一个稳定的 st 二进制,往往是我打了 3 个补丁、手动 resolve 了 2 处冲突后的产物。

4.4 dwm 的补丁链:从基础功能到生产力飞跃

dwm 的补丁生态比 st 更成熟。以下是构建高效工作流的四大支柱补丁:

补丁名功能为什么必需实测效果
pertag为每个标签页独立保存布局、主区域比例、窗口数量解决“切到浏览器标签页,代码窗口被挤成一条线”的痛点每个标签页都有专属mfact,Mod4+1切到终端,Mod4+2切到浏览器,布局互不干扰
systray在状态栏右侧添加系统托盘(NetworkManager、PulseAudio)让 dwm 具备基本桌面功能,无需额外面板点击托盘图标可快速切换 WiFi、调节音量,Mod4+0唤出 dmenu 仍可用
statuscmd允许dwm状态栏执行外部命令(如date、acpi)替代dwm-status等第三方工具,更轻量可控状态栏实时显示时间、电池、CPU 温度,刷新间隔由脚本控制,无额外进程
autostart在 dwm 启动时自动运行指定程序(如nm-applet、picom)简化.xinitrc,所有启动项集中管理autostart数组里定义{"nm-applet", NULL},比在.xinitrc里写nm-applet &更可靠

应用pertag补丁的步骤:

cd ~/.cache/yay/dwm/src/dwm-* wget https://dwm.suckless.org/patches/pertag/dwm-pertag-6.2.diff patch -p1 < dwm-pertag-6.2.diff # 修改 config.h,添加 pertag 相关定义 # static const Layout layouts[] = { ... }; # static const Rule rules[] = { ... }; # static const char *tags[] = { ... }; make && sudo make install

pertag的核心是TagRule结构体,它为每个 tag 存储了mfact、nmaster、layout等状态。当你Mod4+2切到 tag 2,dwm 会自动恢复 tag 2 的mfact=0.7(适合浏览网页),而 tag 1 的mfact=0.55(适合写代码)保持不变。

4.5 日常工作流搭建:让 st + dwm 真正“好用”

一个环境是否成功,不在于它有多酷,而在于你能否忘记它的存在,专注工作。以下是经过三年迭代的生产工作流:

  • 终端复用:st -e tmux启动,tmux里创建多个 pane。Ctrl+b %垂直分屏,Ctrl+b "水平分屏。tmux的会话可 detach,st关闭后,tmux仍在后台运行,st -e tmux attach即可恢复。这解决了 st 无标签页的痛点。

  • 文件管理:st -e ranger。ranger是终端文件管理器,支持vi键绑定、预览、批量重命名。st的Ctrl+Shift+C/V(或clipit)让ranger与nvim的文件路径复制无缝衔接。

  • 代码编辑:st -e nvim -u ~/.config/nvim/init.vim。init.vim里配置set mouse=(禁用鼠标),nnoremap <C-h> <C-w>h(Ctrl+h切左窗格),与 dwm 的Mod4+h形成双保险。

  • 浏览器集成:firefox --new-instance --class FirefoxDev。在dwm的rules[]数组里添加{ "FirefoxDev", NULL, NULL, 1 << 1, True, -1 },让所有 `

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询