Bspwm:一个简单的窗口管理器
linux 哲学提倡模块化软件。 Linux 本身是模块化的。这确保了即插即用能力、可扩展性和随心所欲的定制。这也意味着您可以获得基本软件并仅安装适合您需求的基本要素。
Bspwm 或_Binary Space Partition Window Manager_,基于相同的理念。 Bspwm 是一个简约的现代窗口管理器,它将窗口表示为完整二叉树的叶子。现在,由于没有很多关于 bspwm 的综合文档(尤其是与 i3 等其他窗口管理器相比),我决定自己做一个(有点)实用指南。如果该系列中的这个特定条目太长,请原谅我。
-
特点
-
入门
-
设置我们的环境
*添加键绑定守护进程
*绘制壁纸
*设置合成器
*添加菜单栏
- bspwm 客户端
*节点操作
*窗口状态操作
*窗口规则
- 布局
*自动排版
*手动布局
*最长边布局
*螺旋布局
*极性
*第一个子极性
*二胎极性
*配置切换布局的键绑定
-
一些不足之处
-
判决
-
参考
特点
-
bspwm 是为多显示器构建的。
-
bspwm 中的每个监视器可以有多个桌面,每个桌面都是一个指向二叉树的指针。
-
它是骨架,需要额外的软件,即使对于设置键绑定这样常见的功能也是如此。
-
它只响应 X 事件,以及它在专用套接字上接收到的消息,这些消息可以由提供的客户端发送:
bspc。 -
还必须配置 bspwm 中所需的窗口布局。
入门
bspwm 在大多数源代码库中都可用。此外,您可以下载该版本并从源代码构建它。
巴斯克维尔/bspwm
基于二进制空间分区的平铺窗口管理器
说明
bspwm 是一个平铺窗口管理器,它将窗口表示为完整二叉树的叶子。
它只响应 X 事件,以及它在专用套接字上接收的消息。
bspc 是一个在_bspwm_ 的套接字上写入消息的程序。
bspwm 不处理任何键盘或指针输入:需要第三方程序(例如 sxhkd)才能将键盘和指针事件转换为 bspc 调用。
概述的架构如下:
PROCESS SOCKET
sxhkd --------> bspc <------> bspwm
配置
默认配置文件是$XDG_CONFIG_HOME/bspwm/bspwmrc:这只是一个调用 bspc 的 shell 脚本。
将一个参数传递给该脚本以指示是否在重新启动 ($1 -gt 0) 或不 ($1 -eq 0) 后执行。
键盘和指针绑定使用sxhkd定义。
示例配置文件可以在示例目录中找到。
...
在 GitHub 上查看
最简单的入门方法(在基于 debian 的系统上)是这样的:
sudo apt install bspwm
进入全屏模式 退出全屏模式
要运行它,只需在~/.xsession文件中添加以下行:
exec bspwm
进入全屏模式 退出全屏模式
注销并重新登录,然后繁荣!你已准备好出发。当您登录时,您将看到一个黑屏。那是因为 bspwm 还不知道如何绘制壁纸。您还会注意到典型的窗口管理器键绑定都不起作用。那是因为 bspwm 需要第三方守护进程。
从当前环境注销并登录到 tty 或任何其他环境,让我们开始配置,以便我们可以使 bspwm 有点可用。
设置我们的环境
示例配置位于/usr/share/doc/bspwm/examples/bspwmrc文件中。只需将_bspwmrc_ 文件复制到~/.config/bspwm/目录即可开始使用。默认配置文件如下所示:
#! /bin/sh
# for the key-binding daemon (we'll see it below)
sxhkd &
# for adding multiple monitors and workspaces
bspc monitor -d I II III IV V VI VII VIII IX X
bspc config border_width 2
# I like to keep it 10, let me know what you think.
bspc config window_gap 12
bspc config split_ratio 0.52
bspc config borderless_monocle true
bspc config gapless_monocle true
# Window rules (we'll see it below)
bspc rule -a Gimp desktop='^8' state=floating follow=on
bspc rule -a Chromium desktop='^2'
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off
进入全屏模式 退出全屏模式
请注意,bspwmrc 没有不同的语法或任何语言绑定。它只是使用一个普通的 shell 脚本来执行它。这是因为 bspwm 附带的 bspc 客户端。该客户端可以向服务器发送和从服务器发送套接字事件。看一下它的架构:
PROCESS SOCKET
sxhkd --------> bspc <------> bspwm
进入全屏模式 退出全屏模式
添加键绑定守护进程
Sxhkd,在上面给出的架构中提到,代表_Simple X Hot Key Daemon_(你认为herbstluftwm 很难发音)。它在后台运行并使用非常简单的语法将键绑定到命令。要开始使用它,只需运行:
sudo apt install sxhkd
进入全屏模式 退出全屏模式
Sxhkd 寻找用于初始化的配置文件。您可以在~/.config/sxhkd/sxhkdrc创建一个。让我们看看如何添加一些基本的键绑定以开始使用 bspwm:
我们的 sxhkdrc 文件:
# To spawn the terminal
alt + Return
terminator
# make sxhkd reload its configuration files:
alt + Escape
pkill -USR1 -x sxhkd
# for dmenu
alt + p
dmenu_run
# quit/restart bspwm
shift + alt + {q,r}
bspc {quit,wm -r}
进入全屏模式 退出全屏模式
第二条规则确保当我们点击alt + Escape时,我们的 sxhkd 会自动重新加载,因此进行任何进一步的更改将不需要我们手动杀死守护程序并自己重新启动它。
要启动守护程序,只需在bspwmrc中添加以下行:
# To start the daemon in the background
sxhkd &
进入全屏模式 退出全屏模式
现在注销并再次登录。你会看到一个黑屏,但是当你点击alt + Return的那一刻,你会得到你选择的终端!现在,这就是我们进一步配置 bspwm 所需的全部内容。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--7cjtj4rl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/vokkce7lc3xsyfpkelia.png)
画壁纸
没有人喜欢黑屏。我们的窗口管理器现在需要一些生命。让我们添加墙纸。 氮气是一个非常好的工具。要设置它,只需运行:
# install nitrogen (available in almost all public repos)
sudo apt install nitrogen
# setting wallpaper (provided that there is a mass_effect.png)
# you can add this line in your bspwmrc too (recommended)
nitrogen --set-scaled /usr/share/backgrounds/mass_effect.png
进入全屏模式 退出全屏模式
现在我们的环境(带有 dmenu)看起来像这样:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--uAGy7HOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/m94l50bghsdky8w079qo.png)
嗯,看起来已经很不错了。但是缺少一些东西。当我打开终端时,没有透明度或阴影。即使我在终端设置中正确配置了不透明度。让我们看看如何解决这个问题。
设置合成器
要了解什么是合成器,请查看这个链接。请注意,我的下一篇博客将让您更深入地了解 linux 中合成器的工作原理。所以请继续关注:)
长话短说,它是一款负责在我们的窗口管理器中添加阴影和透明度等效果的软件。让我们开始使用 compton,一个这样的合成器。
# installing compton
sudo apt install compton
# running comption in the background
# add this command in your bspwmrc (recommended)
comption &
进入全屏模式 退出全屏模式
在您的bspwmrc中添加上述行之后,只需重新加载您的 bspwm(请记住我们为它做了一个键绑定)。生成几个终端并欣赏美景:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--K4xIzQar--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/16fgu9v77xedkyamjn8z.png)
哇!看起来好赞。但是仍然缺少一些东西。我们需要一个面板来查看我们在哪个工作区,或者可以访问一些快速操作。让我们看看如何配置它。
添加菜单栏
社区在创建精美且可自定义的第三方菜单栏及其主题方面付出了很多努力。一些众所周知的面板如下:
-
多杆
-
柠檬吧
-
赞美
在本博客中,我们将研究如何设置 polybar。您可以使用安装候选,也可以从源代码编译它。完成后,只需创建一个文件夹~/.config/polybar/config即可。
我们将使用此存储库中的第三方主题:
adi1090x/polybar 主题
大量具有不同样式、颜色和变体的 polybar 主题。

[
](https ://camo.githubusercontent.com/2d595e9d27eabd720644cbb37e0b0eae2aab0b18cc9288d78676aa45eaf1be8c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f61646931303930782f706f6c796261722d7468656d65733f7374796c653d666f722d7468652d6261646765) [
](https://camo.githubusercontent.com/40e886eddbd70aa41dc5266b234a4085525ea4536c7fd1032a1b3f34c66853e4/68747470733a2f2f696 d672e736869656c64732e696f2f6769746875622f6973737565732f61646931303930782f706f6c796261722d7468656d65733f636f6c6f723d76696f6c6574267374796c653d666f722d7468652d6261646765)
[! 未定义](https://github.com/adi1090x/polybar-themes#hack)
[![未定义]
polybar主题的庞大集合,具有不同的样式、颜色和变体。
Polybar旨在帮助用户为其桌面环境构建美观且高度可定制的状态栏,而无需在 shell 脚本中使用黑带。
Polybar 的主要目的是帮助用户创建很棒的状态栏。它具有显示有关最常用服务的信息的内置功能。到目前为止包括的一些服务......
-
系统托盘图标
-
窗口标题
-
使用 libmpdclient 的 MPD 播放控件和状态显示
-
ALSA 音量控制
-
bspwm 和 i3 的工作区和桌面面板
-
EWMH 兼容窗口管理器的工作区模块
-
键盘布局和指示灯状态
-
CPU 和内存负载指示器
-
电池显示
-
网络连接详情
-
背光等级
-
日期和时间标签
-
基于时间的 shell 脚本执行
-
命令输出拖尾
-
用户自定义菜单树
-
进程间消息传递
-
和更多...
依赖项
在您使用这些程序之前,在您的系统上安装以下程序......
在 GitHub 上查看
选择您感兴趣的任何主题。为了这个博客,我们假设您想选择 polybar-1。只需运行以下命令,您就可以开始了:
# clone this repo
git clone https://github.com/adi1090x/polybar-themes
# go to polybar-1 dir
cd polybar-themes/polybar-1
# copy fonts to local fonts dir (i'll put the fonts in all dirs)
cp -r fonts/* ~/.local/share/fonts
# reload font cache
fc-cache -v
# copy everything from polybar-1 to polybar config dir (backup your config first if you have)
cp -r * ~/.config/polybar
# add the following two commands to your bspwmrc (recommended)
# kill previously running instances of polybar
pkill polybar
# run launch.sh
~/.config/polybar/launch.sh
进入全屏模式 退出全屏模式
在 bspwmrc 中添加这些行后,只需重新加载窗口管理器,您就可以在屏幕底部看到一个漂亮的面板。要配置此面板,只需将~/.config/polybar/config.ini文件编辑为您喜欢的内容。现在我们的环境看起来像这样:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--iVevxImJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/sm2jkmxcjiktkol26m4x.png)
啊,这更像它。这些碎片正在拼凑在一起。这就像谢尔顿库珀用乐高制作死星的时候。我向你保证,这没什么戏剧性的,但非常有趣:)
bspwm 客户端
bspc 是您自己的友好社区客户端,它随 bspwm 一起提供。它将套接字事件发送到 bspwm 以在您的 X 窗口系统中绘制或进行更改。由于它在命令行本身非常强大,因此 bspwm 的配置不需要第二语言或语法,因此使用带有一组 bspc 命令的 shell 脚本。在本节中,我们将查看一些最重要的 bspc 命令并使用它们进一步构建我们的配置。如果您遇到困难,请务必查看 bspc 的手册页(通过运行man bspc)或bspwm wiki。
请注意,就本块而言,每当我使用术语“动作”时,它都将指代 bspc 的子命令/功能。
节点操作
bspwm 中的节点指的是一个窗口。bspm node子命令控制特定于窗口的操作。下面列出了一些示例命令:
命令
执行的操作
bspc节点-c
关上一扇窗
bspc 节点 -k
杀死一扇窗户
bspc节点-d 7
将窗口发送到第 7 个桌面
bspc 节点 -p 北
东
在将它们添加到键绑定之前,在您的终端上尝试这些命令。添加后,我的sxhkdrc的节点部分如下所示:
# send the window to the given desktop
alt + shift + {1-9}
bspc node -d '^{1-9}'
# close and kill
alt + {_,shift + }c
bspc node -{c,k}
# preselect the direction
# we will see that this means in the manual layout
super + ctrl + {h,j,k,l}
bspc node -p {west,south,north,east}
进入全屏模式 退出全屏模式
窗口状态操作
_窗口状态_指的是您的窗口在桌面上的显示方式。它们与 layout 的不同之处在于它们应用于特定窗口,而不是应用于相对于彼此的不同窗口。 bpswm 为 windows 提供 4 种状态, bspc 可用于在它们之间切换:
命令
执行的操作
状态描述
bspc 节点 -t 平铺
将窗口切换到平铺状态
它的大小和位置由窗口树决定。
bspc 节点 -t 浮动
将窗口切换到浮动状态
可以自由移动/调整大小。虽然它不使用任何平铺空间,但它仍然是窗口树的一部分。
bspc 节点 -t 伪_tiled
将窗口切换到伪_平铺状态
一个平铺的窗口,它会自动缩小但不会超出其浮动大小。
bspc 节点 -t 全屏
将窗口切换到全屏状态
填充它的监视器矩形并且没有边框
我们可以在运行时通过添加一个简单的键绑定来切换窗口状态,如下所示:
# add these lines in your sxhkdrc file
# change window states
alt + {t,shift + t,s,f}
bspc node -t {tiled,pseudo_tiled,floating,fullscreen}
进入全屏模式 退出全屏模式
窗口规则
喜欢平铺模式但想以另一种布局启动某些程序?想要为每个程序配置特定规则?本节适合您。使用窗口规则,您可以做一些事情,例如确保某些软件在执行时具有某些窗口属性。
Bspc 有一个子命令,专门用于在每个窗口的基础上添加规则。例如:
bspc rule -a Firefox-esr desktop='^8' state=floating
进入全屏模式 退出全屏模式
这条规则规定,每当我打开 Firefox 时,它应该在第 8 个桌面(工作区/标签)上以浮动状态打开。您可以轻松浏览 bspwm wiki 或其联机帮助页上的所有可用选项。
需要注意的一点是,我们这里提到的服务名称:“Firefox-esr”实际上是XDG中程序的_类名_。bspc rule -a命令只使用 XDG 类名,使用xprop可以很容易地找到:
xprop | grep WM_CLASS
进入全屏模式 退出全屏模式
在命令行上输入后,只需单击要获取其类名的程序窗口。然后,您可以使用相同的名称在 bspwmrc 中引用它。
我们了解了 bspwm 中的窗口状态。现在让我们看一下 bspwm 提供的布局。
布局
布局是指窗口在桌面中相对于彼此放置的方式。它也是一种算法,它指示下一个窗口生成的位置和方式。 Bspwm 要求您手动配置要使用的布局。它提供以下布局:
-
自动排版
-
手动布局
-
最长边布局
-
螺旋布局
自动排版
自动布局是 bspwm 中的默认布局。每次生成一个窗口时,它都会将窗口拆分为 2 个节点,这样每个窗口要么有 2 个节点,要么根本没有节点(就像二叉树一样):
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--PSMgV4U6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/s9qrwvmhfof8qaiauha7.png)
手动布局
在手动布局中,您可以预先选择桌面中相对于当前焦点的区域。随后生成一个窗口将确保子级在预选区域中生成。您可以使用bspc node -p north|east|west|south命令预先选择一个区域。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--NZpLt5YU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/f63h57v1n5fzk8o5ppez.png)
最长边布局
最长边布局就像自动布局一样,它使用最长的窗口并递归地将其拆分为较小的窗口。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--mgELkoi---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to -uploads.s3.amazonaws.com/i/x4qih6wdugifv5dw269h.png)
螺旋布局
螺旋布局是比较常见的布局之一。您可能还记得 dwm 中的斐波那契布局。概念保持不变。窗户按左螺旋的顺序分裂。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--B8KYWLMs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/65ch9nte359ffri6sx5b.png)
极性
bspwm 中布局的极性是指围绕其拆分窗口的枢轴(子节点)。例如,在自动模式下,当我们生成 2 个孩子时,第一个孩子总是被分成更多的孩子。所以默认情况下自动布局的极性是_first_child_。但是,可以使用以下命令轻松更改极性:
bspc config initial_polarity first_child|second_child
进入全屏模式 退出全屏模式
让我们看看一些可用的初始极性:
第一个孩子极性
第一个孩子的极性类似于自动布局,它总是拆分第一个孩子而不是第二个孩子,这是默认配置的。
二胎极性
可以使用 bspc 设置第二个子极性。它与第一个孩子极性相反,因为它分裂了第二个孩子而不是第一个孩子。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--ctEnCdt7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/vd9o6rop85iv23p57rob.png)
配置切换布局的键绑定
bspc config子命令用途广泛。它可用于配置窗口的美感以及布局。要在布局之间切换,您可以简单地运行以下命令之一或将它们添加到您的 bspwmrc 中:
# for spiral mode
bspc config automatic_scheme spiral
# for longest side mode
bspc config automatic_scheme longest_side
进入全屏模式 退出全屏模式
在本节中,我们将在 sxhkdrc 中添加键绑定。目标是让我们能够在运行时更改布局并通知我们更改。
对于通知,我将使用一个名为 zenity 的包。它由 GNOME 项目维护。运行以下命令将为我们提供所需的警报:
zenity --info --width=200 --height=100 --text 'This is an info'
进入全屏模式 退出全屏模式
出于此键绑定的目的,我创建了一个 shell 脚本并将其放在我的~/.config/bspwm/config_scheme.sh中。每当我更改布局时,此脚本都会发出警报,通知我更改。
#!/bin/bash
if [ "$1" == "first_child" ]
then
bspc config automatic_scheme first_child
zenity --info --width=200 --height=100 --text "Switched to first_child mode!"
exit 0
elif [ "$1" == "longest_side" ]
then
bspc config automatic_scheme longest_side
zenity --info --width=200 --height=100 --text "Switched to longest_side mode!"
exit 0
elif [ "$1" == "spiral" ]
then
bspc config automatic_scheme spiral
zenity --info --width=200 --height=100 --text "Switched to spiral mode!"
exit 0
else
zenity --info --width=200 --height=100 --text "Invalid mode!"
exit 1
fi
进入全屏模式 退出全屏模式
现在要将这个键绑定添加到我的 sxhkdrc,我可以简单地附加以下行,瞧。
# to change layouts
alt + control + {1,2,3}
~/.config/bspwm/config_scheme.sh {first_child,longest_side,spiral}
进入全屏模式 退出全屏模式
一些不足
虽然 bspwm 是一个非常成熟的项目,但它还是有一些不足之处:
-
设置 bspwm 和键绑定可能是一个漫长的过程。
-
缺少大量文档可能会迫使您阅读其他人的配置文件。
-
sxhkd与 fish shell 一起使用时有断线的习惯,因为 fish 不支持^字符。这可以通过键入set -U SXHKD_SHELL sh更改执行 shell 轻松避免。 -
由于键绑定在 shell 内执行,因此使用较重的 shell(例如:fish 而不是 sh)可能不利于性能。
判决
Bspwm 是一个窗口管理器,专为热爱模块化和极简软件的精英和爱好者设计。对于新手来说,学习、配置和使用可能非常具有挑战性,但好处是它可以完全控制您,即用户。您需要对使用 bspwm 的工作效率负责。这就是我喜欢它的地方。
生产力和乐趣的满分,因为您自己配置一切。默认键绑定的外观中没有隐藏任何阴影命令。学习曲线相当高。但是,如果您知道要使用的概念和工具,则可以将各个部分拼凑在一起,用乐高积木制作您自己的死星演绎版。有一件事是肯定的:语言语法不会成为你的瓶颈(不像 awesome 或 xmonad 之类的窗口管理器)。我强烈推荐给爱好者。
PS:我有一种感觉,我会坚持使用 bspwm 一段时间 :)
判断量规
评分
使用简单
❤️❤️
配置简单
❤️ ❤️ ❤️
学习曲线(越少越好)
❤️ ❤️ ❤️ ❤️
生产率
❤️ ❤️ ❤️ ❤️ ❤️
乐趣
❤️ ❤️ ❤️ ❤️ ❤️
参考文献
在这里查看我的点文件:
L04DB4L4NC3R/DEC
开发环境配置。使用我的 dotfiles 比以往更快地工作

开发环境配置
当有人以“它会很好,如果..”开始一个句子时,正确的做法是礼貌地等待说话者说完。没有一个项目能够解决它会很好的功能:或者如果他们这样做了,他们会后悔的。等待以“我们必须......”开头的句子并密切注意,看看你是否同意。 - 汤姆·范弗莱克
你是程序员吗?您想花更多时间思考和解决问题,而不是一次又一次地编写 biolerplate 代码吗?你厌倦了糟糕的导航吗?那么这就是你的解决方案!
开发环境工具
-
zsh外壳 + 插件 -
terminator平铺管理器 -
vim编辑器+插件 -
ranger文件管理器
参考文献
-
哦,我的 zsh
-
终结器配置
-
zsh 插件
-
shell 主题

包括### 个 Vim 插件
-
vim-go
-
ctrlp.vim
-
航空公司
-
emmet-vim
-
vim-逃犯
-
书呆子树
-
vim 多光标
-
YouCompleteMe
-
vim-yaml
-
lightline.vim
-
病原体
包含### 个 Zsh 插件
-
zsh-autosuggestions
-
混帐
推荐的键盘快捷键
...
在 GitHub 上查看
-
Bspwm 拱维基
-
Sxhkd 拱维基
更多推荐




所有评论(0)