Herbstluftwm

来自 ArchWiki

Herbstluftwm 是一个使用 Xlib 的 X11 手动平铺窗口管理器。

安装

安装 herbstluftwm 软件包或 herbstluftwm-gitAUR 开发版本。

启动

从 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。此外,您可以监听窗口管理事件并相应地做出反应。

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

参见