Herbstluftwm
Herbstluftwm 是一个为 X11 编写的、使用 Xlib 的手动平铺窗口管理器。
安装
安装 herbstluftwm 软件包。
启动
从 tty
使用 xinit 运行 herbstluftwm。
显示管理器
herbstluftwm 包含 herbstluftwm.desktop 作为 Xsession 来启动窗口管理器。
从其他窗口管理器内部启动
如果你已经在一个窗口管理器会话中,可以通过运行 herbstluftwm --replace 来用 herbstluft 替换该窗口管理器。
初步步骤
阅读 herbstluftwm(1) 和 herbstclient(1) 的帮助页,它们包含了大量信息,从用于保存布局的二叉树解释到配置文件选项及其可能的值。
配置
将 /etc/xdg/herbstluftwm/autostart 文件复制到 ~/.config/herbstluftwm/autostart。你可以根据需求编辑该文件。确保 autostart 文件具有可执行权限,否则你可能会发现没有快捷键绑定!
herbstluftwm 的配置可以通过运行 herbstclient reload 实时更新(参见 #命令)。每次重新加载时都会调用 autostart,因此在 autostart 内部,你通常需要先取消映射所有现有配置。
多显示器支持
Herbstluftwm 将多显示器支持视为一个虚拟概念;herbstluftwm 中的显示器不必与 xrandr 报告的真实显示器配置相匹配。这带来了很大的灵活性,并让用户能更自由地控制显示器排列。你可以使用 herbstclient detect_monitors 来自动适应物理设置。否则,请参阅帮助页了解如何添加、删除、调整大小和移动显示器。在多显示器设置中,标签不“属于”某个特定显示器。这意味着当一个显示器切换到一个在另一个显示器上处于激活状态的标签时,这两个显示器将交换标签。
命令
Herbstclient 是一个非常强大的工具,因为它允许你通过命令行完全控制窗口管理器。
herbstclient 的参数支持 Tab 补全。尝试运行 herbstclient list_commands 来显示所有参数。
目前,如果你在命令中使用了错误的参数,不会有错误消息,而只会返回一个非零值。如果你在 shell 提示符中看不到命令的返回值,可以使用 echo $? 来查找最后一个命令的返回值。
脚本与钩子
控制 herbstluftwm 的主要方式是通过向 herbstclient 发送命令。由于 herbstclient 可以从任何脚本中调用,因此这种控制方式具有极高的灵活性。此外,你可以监听窗口管理事件并做出相应的反应。
Herbstluftwm 包含了一些示例脚本:/usr/share/doc/herbstluftwm/examples/ 或 https://github.com/herbstluftwm/herbstluftwm/tree/master/scripts
切换到下一个空标签的脚本
以下 Python 脚本允许你切换到(下一个或上一个)(满或空)标签。使用参数(+1 或 -1)以及(full 或 empty)来调用它。例如,如果你将脚本保存为 herbst-move.py,那么
python3 herbst-move.py +1 full
将带你跳转到下一个满标签。我使用以下按键绑定。
hc keybind $Mod-Left spawn herbst-move.py -1 empty hc keybind $Mod-Right spawn herbst-move.py +1 empty hc keybind $Mod-Up spawn herbst-move.py -1 full hc keybind $Mod-Down spawn herbst-move.py +1 full
脚本如下。
#!/usr/bin/env python3
def run(*cmd):
from subprocess import Popen, PIPE
proc = Popen(cmd, shell=False, stderr=PIPE, stdout=PIPE)
return proc.stdout.read()
import sys
tag_offset, mode = sys.argv[1:]
tag_offset = int(tag_offset)
if mode == 'full':
ch = {'.'}
elif mode == 'empty':
ch = {':', '!'}
else:
raise Exception('Unknown type ' + mode)
tag_list = run('herbstclient', 'tag_status', '0').strip().decode('ascii').split('\t')
tag_curr = int(run('herbstclient', 'attr', 'tags.focus.index').strip())
tag_next = (tag_curr + tag_offset) % len(tag_list)
while (tag_next != tag_curr) and (tag_list[tag_next][0] in ch):
tag_next = (tag_next + tag_offset) % len(tag_list)
if tag_next != tag_curr:
run('herbstclient', 'use_index', str(tag_next))
循环切换间距(或其他设置)的脚本
这是一个用于循环切换一组间距的 Ruby 脚本,不过你可以将其修改为循环切换任何设置集合。该脚本通过在 /tmp 中查找两个虚拟文件的存在来识别之前的布局。
#!/usr/bin/ruby
file1 = "/tmp/herbst-padding-1"
file2 = "/tmp/herbst-padding-2"
pad1 = 'pad 0 0 0 0 0'
pad2 = 'pad 0 0 20 0 200'
pad3 = 'pad 0 0 0 0 150'
files = [file1, file2].map{|f| File.exist? File.expand_path(f)}
if files == [false, false] # 0 files
system "herbstclient #{pad2}"
system "touch #{file1}"
elsif files == [true, false] # 1 file
system "herbstclient #{pad1}"
system "touch #{file2}"
else # 2 files
system "herbstclient #{pad3}"
system "rm #{file1} #{file2}"
end
按标签更改装饰的脚本
以下 Perl 脚本演示了如何使用钩子来响应窗口管理事件。它可以被调用在 autostart 中(在后台运行)。
#!/usr/bin/perl
# This script watches for tag changes and gives visual feedback
## Configuration (fill with your tag names)
my %colors = (
main => '#DD0000',
devel => '#13B8E0',
write => '#96E013',
admin => '#C713E0'
);
## Apply tag color
# Right now we change the active window's border color to the tag's color.
sub redecorate
{
my ($foo, $activity) = @_;
system("herbstclient", "set", "window_border_active_color",
"$colors{$activity}");
}
## main routine
use v5.20;
# set up a pipe for reading hooks
open HOOKS, "herbstclient -i '(tag_changed|reload)'|"
or die "can't fork: $!";
# process incoming messages
OUTER:
while (<HOOKS>) {
chomp;
for ($_) {
redecorate(split(/\t/)) when /^tag_changed/;
last OUTER when /^reload/; # quit on reload
}
}
close HOOKS or die "unfinished love story: $! $?"; # happens on hlwm crash
故障排除
- 安装后,
$mod+enter快捷键可能无法启动终端:herbstluftwm 的 autostart 配置文件默认使用 xterm 终端。请确保已安装 xterm,或编辑 autostart 文件以使用其他终端。 - 要退出 herbstluftwm,请使用命令
herbstclient quit或默认快捷键$mod+shift-q
参见
- Herbstluftwm 主页
- Arch Linux BBS 讨论帖
/usr/share/doc/herbstluftwm/examples/- 各种脚本/usr/share/doc/herbstluftwm/BUGS- Bug 列表- CrunchBang 论坛上的 herbstluftwm 讨论帖
- 截图与配置文件: 在 Arch Linux 论坛上
#herbstluftwm- irc.libera.chat 的 IRC 频道- 用户 Git 仓库 #1,包含用 Perl 编写的 autostart 和一些自定义脚本
- 用户 Git 仓库 #2,包含用 Python 编写的 autostart 和面板
- Github Discussions
- Herbstluftwm Subreddit