Stumpwm
StumpWM 是一个手动平铺、键盘驱动的 X11 窗口管理器,完全由 Common Lisp 编写。
作为经典软件 Ratpoison 的精神续作,StumpWM 增加了 Common Lisp 所有的灵活性和可黑客性,允许用户在窗口管理器运行期间对其源代码进行修改。它也被称为“窗口管理器界的 Emacs”。
摘自 StumpWM 官网
- StumpWM 旨在实现高度可定制且视觉极简。它没有窗口装饰,没有图标,也没有按钮。它提供了各种钩子(hooks)来附加个人定制,以及可供调优的变量。
- 黑掉优秀的黑客作品
- 调试你的优秀作品
- 自定义你的窗口管理器
- 就在它运行的时候。没错。凭借 100% Common Lisp 编写的窗口管理器,黑客行为永不止步。只需重新求值 (re-eval) 即可启动!
想看看实际效果?一位 StumpWM 用户创建了一个 视频。
安装
一个可运行的 StumpWM 安装由 3 部分组成:
- Common Lisp REPL
- StumpWM Lisp 包及其依赖项
- 作为入口的可执行文件
通过包管理器安装
安装 stumpwm 或 stumpwm-gitAUR。
如果你在没有 AUR 助手的情况下安装,应按以下顺序安装这些包:
- sbcl
- cl-alexandria-gitAUR
- clx-gitAUR
- cl-ppcre
- stumpwm 或 stumpwm-gitAUR
安装完成后,在 ~/.xinitrc 中加入 exec stumpwm 并运行 startx。要退出,在默认配置下按下 C-t ;,然后输入 quit 并按回车。
这两个包都会在 /usr/share/xsessions 中安装一个 xsession 条目,因此如果你使用的显示管理器会检查该目录,你应该可以直接启动。
要查看常用键绑定列表,请按 C-t ?。
通过 Roswell 安装
强烈建议使用 roswell 来管理你的 Lisp REPL。
这种方法可以使用 ql:update-all-dists 轻松地将 StumpWM 与其他 Lisp 包一起升级。
要在 roswell 中启动 REPL,请在终端运行 ros run;要安装 stumpwm,请在 REPL 内部运行 (ql:quickload :stumpwm)
为了通过登录管理器或 ~/.xinitrc 启动,必须创建一个可执行文件。使用 roswell 创建新项目:
ros init stumpwm
创建 stumpwm.ros
stumpwm.ros
#!/bin/sh #|-*- mode:lisp -*-|# #| exec ros -Q -- $0 "$@" |# (progn #+quicklisp (ql:quickload '(stumpwm) :silent t)) (defpackage :ros.script.stumpwm.3749863733 (:use :cl)) (in-package :ros.script.stumpwm.3749863733) (defun main (&rest argv) (declare (ignorable argv)) (stumpwm:stumpwm))
然后将 stumpwm.ros 文件放置在任何你喜欢的地方,并将其作为这个极棒 WM 的入口点。
要将 stumpwm 添加到登录管理器,请在 /usr/share/xsessions/ 中创建 stumpwm.desktop
stumpwm.desktop
[Desktop Entry] Encoding=UTF-8 Name=StumpWM Comment=Login using StumpWM Exec=/path/to/stumpwm.ros Type=XSession
或者你也可以直接使用 ~/.xinitrc 启动
exec /path/to/stumpwm.ros
文档与支持
AUR 包、源代码以及在线页面中都包含一份 TeXInfo 手册。
此外还有一个 wiki,Libera Chat 上的 IRC 频道 #stumpwm,以及一个 邮件列表。更多信息请参阅 项目网站。
配置
StumpWM 将其配置存储在 ~/.stumpwmrc 中,或者你可以使用 ~/.config/stumpwm/config
更改默认 X 光标形状
默认情况下,StumpWM 将光标保持为 XOrg 标准的 X 形状,热点在中心。你可以通过运行以下命令获得更常见的向左指针:
$ xsetroot -cursor_name left_ptr
你也可以将此内容放入你的配置文件中
(run-shell-command "xsetroot -cursor_name left_ptr")
鼠标点击切换窗口焦点
点击另一个窗口会将点击事件发送到该窗口,但它不会获得焦点,这意味着任何键盘输入仍将发送到当前拥有焦点的窗口。以下代码行使焦点转移到任何被点击的窗口。
(setf *mouse-focus-policy* :click)
启用 modeline (状态栏)
这将设置一个基础的 modeline,左侧显示组名后跟窗口名,右侧显示日期和时间。
首先设置窗口名称格式和整体 modeline 格式
(setf *window-format* "%m%n%s%c") (setf *screen-mode-line-format* (list "[^B%n^b] %W^>%d"))
日期格式使用与 strftime(3) 相同的格式说明符,例如:
(setf *time-modeline-string* "%a %b %e %k:%M")
(可选)更改 modeline 自动更新的频率,单位为秒(当你对 StumpWM 执行操作如切换窗口时,它也会更新)。
(setf *mode-line-timeout* 2)
最后启用 modeline(这必须在设置完你想要的选项之后进行)
(enable-mode-line (current-screen) (current-head) t)
设置消息和 modeline 的字体
StumpWM 使用默认的 XOrg 字体,这可能很小且有像素感。你可以通过调用以下命令设置字体,例如:
(set-font "-xos4-terminus-medium-r-normal-*-20-*-*-*-*-*-*-*")
其中字符串是由 xorg-xfontsel 生成的。
有两个外部模块允许你使用 TTF 字体:ttf-fonts 和 sdl-fonts。sdl-fonts 是 SDL2_ttf 的一个非常薄的封装,而 ttf-fonts 则委托给另一个 Lisp 模块 —— clx-truetype —— 该模块使用 Lisp 原生的 TTF 解析器和渲染器。初步测试显示 sdl-fonts 性能更好且整体更稳定。
要使用 sdl-fonts,你需要在系统中安装 SDL2_ttf。以下代码演示了如何加载字体:
(load-module "sdl-fonts") (defparameter *the-font* (sdl-fonts:load-font "/usr/share/fonts/TTF/DroidSansMono.ttf" 14)) (set-font *the-font)
对于 ttf-fonts,你需要安装 clx-truetype,它已不再包含在 QuickLisp 发行版中。可以在这里或备份仓库中获取副本,将其放入 ~/quicklisp/local-projects/ 目录下,然后运行:
(ql:quickload "clx-truetype") (load-module "ttf-fonts") (xft:cache-fonts) ;; Tell clx-truetype about the fonts you have installed. You really only need to do this once, but putting it here means you will not forget in the future. (set-font (make-instance 'xft:font :family "DejaVu Sans Mono" :subfamily "Book" :size 11))
- 你需要安装 quicklisp 包才能使其生效。
- 你需要从 stumpwm-contrib 安装 ttf-fonts 和 sdl-fonts 模块(见 #调优)。
调整
请参阅 wiki 以了解更多适用于 .stumpwmrc 的实用调优技巧。
此外,stumpwm-contrib 仓库包含许多有用的实用程序,可以通过 stumpwm-contrib-gitAUR 安装。例如,如果你是 emacs 用户,你会发现一个用于编辑 StumpWM 文件的 emacs minor mode(以及与 stumpish 程序交互的接口,详见下文)。
stumpish 是 STUMP 窗口管理器的交互式 Shell (Interactive SHell)。它是一个允许用户在终端(或使用 emacs 模式)中与运行中的 StumpWM 进行交互的程序。它随 StumpWM 一起安装在 /usr/bin/ 中。
故障排除
- 如果你在配置多显示器时遇到问题,可能需要安装 'xorg-xdpyinfo' 包。
- 如果你无法启动 stumpwm 并且在 REPL 中得到:
debugger invoked on a SB-INT:SIMPLE-PARSE-ERROR in thread
#:
no non-whitespace characters in string "".
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
(no restarts: If you did not do this on purpose, please report it as a bug.)
(PARSE-INTEGER "" :START 0 :END NIL :RADIX 10 :JUNK-ALLOWED NIL)
可以通过删除 ~/.Xauthority 来解决。参阅 github 上的此问题
- 如果你遇到 SBCL_HOME 被设置为 NIL 的问题,你可能需要手动设置它:
find / | grep sbcl.core
$ export SBCL_HOME=/usr/lib/sbcl/
然后你可能需要重新安装 stumpwm
- 如果你在某些程序中无法使用鼠标滚轮滚动,请尝试将以下内容添加到
(setf (getenv "GDK_CORE_DEVICE_EVENTS") "1")
你的 .stumpwmrc 中(来源:[1])
- 如果你在安装 StumpWM 之后才安装 Quicklisp,那么 Quicklisp 在 StumpWM 中将无法工作 —— 在这种情况下,请卸载并重新安装 StumpWM
参见
- StumpWM 官方网站
- StumpWM 社区 Wiki
- Awesome StumpWM: StumpWM 高质量文档/模块/配置列表
- github.com/stumpwm/mahogany 一个非常实验性/开发中的 Wayland 版 StumpWM 克隆