大家好 在本文中,我将介绍我在设置和使用sway(Linux的平铺窗口管理器)方面的经验。
它是什么,为什么需要它?
正式来说,sway是平铺窗口管理器,是在Wayland上运行的透明i3wm替代品。
魏兰德(又名Wölund)等 -来自古德语和古北欧神话的人物,这本书是由英国民俗家杰西·韦斯顿(Jessie Weston)一次写的。 现在你知道了。
但是,我认为sway的主要特征是它是一个构造函数,具有此方法的所有优点和缺点。 如果您喜欢Vim(使用键盘时的方向会加剧与Vim的相似性),Archlinux和类似项目,那么我建议您仔细研究一下。 我个人的看法是,一旦花费更多的时间进行设置,您将为自己带来一个非常稳定和便捷的环境,其中不会发生任何意外情况。
如果sway和Wayland的劣势(例如缺乏对NVidia私人司机的支持以及需要为许多熟悉的程序寻找类似物)对您来说致命,我建议您注意x3 i3wm。 构造器部分将完全不同,您将必须安装xinit,配置各种.Xauthority,有可能处理撕裂,但系统的一般逻辑是完全相同的。
安装方式
Sway可能在您的发行版存储库中。 但是,如果要安装较新的版本,则非常简单。 github项目页面的依赖项列表很少。 安装它们,克隆存储库,将wlroots
克隆到subprojects
文件夹:
hub clone swaywm/sway hub clone swaywm/wlroots sway/subprojects/wlroots
(在这里,我使用集线器 。这是一种非标准但非常方便的工具)。 之后,您可以配置和构建:
meson setup ./sway-build ./sway --buildtype=minsize ninja -C ./sway-build doas ninja -C ./sway-build install
doas是OpenBSD开发人员的轻量级sudo替代品。 Linux通常使用其OpenDoas分支。
发射
如果您想在不使用SDDM之类的管理器的情况下从命令行运行,那么唯一正确的方法是
$ exec sway
如果您在没有exec
情况下运行sway,使用swaylock锁定屏幕,并且sway崩溃,您将被退回到命令行。 锁将无用。
给系统风扇的注意事项:摇摆既不需要systemd-logind也不需要elogind。 是的,在这种情况下,您将必须设置suid位或配置功能。 参见维基 。
环境变量
我在几个地方开了这些药。
位于~/.local/bin/sway
Shell脚本-用于特定于sway的变量。 例如,我希望Qt应用程序不显示风景并使用qt5ct
的主题:
#!/bin/bash QT_QPA_PLATFORMTHEME=qt5ct \ QT_WAYLAND_DISABLE_WINDOWDECORATION=1 \ /usr/bin/sway
~/.pam_environment
用于我要立即在systemd用户会话中使用的变量。 一个例子:
SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"
但是,请谨慎更改此文件,尤其是在使用其他环境的情况下。 例如,如果KDE Plasma在那里检测到$WAYLAND_DISPLAY
则不会非常喜欢(具有讽刺意味的是, pam_env
此文件的pam_env
模块是N年前创建的,主要用于设置$DISPLAY
变量)。
~/.bashrc
对于所有其他情况。
摇摆设置
进入
在我的系统中,一切都非常简单:我们安装了俄语和英语版式,并通过Alt+Shift
在它们之间Alt+Shift
。 在sway配置中,它看起来像这样:
input * { xkb_layout us,ru xkb_options grp:alt_shift_toggle }
Sway使用libinput
库进行输入,与KDE和Gnome相同。 因此,我们有许多可用的选项。 触摸板设置,自然滚动,鼠标指针加速等 等 可以在man sway-input
检查选项列表,并在命令的输出中检查输入设备的列表
swaymsg -t get_inputs
但是,我想提请注意一个有趣的机会。 如果您要从X环境迁移,则只需从那里转移键盘设置即可。 在此环境中运行命令
$ xkbcomp $DISPLAY /path/to/keymap.xkb
并在sway配置寄存器中
input * { xkb_file /path/to/keymap.xkb }
热键
像其他所有热键一样,热键也在配置中设置。 有3条命令来定义它们:
bindswitch
。 当打开/关闭笔记本电脑的机盖,切换到平板电脑模式等时执行此操作。bindcode
。 当按下具有指定代码的键时执行。 它不依赖于当前布局,对于多媒体键尤其有用。bindsym
。 输入的当前字符取决于布局。 但是,如果添加--to-code
参数,则该字符将从--to-code
隐式转换为第一个布局的相应代码(请参见输入设置)。
例如,这样的热键将跳动当前窗口,而不管布局如何:
bindsym --to-code $mod+Shift+q kill
您可以在mana中阅读有关这些参数的更多信息: man 5 sway
。
为了轻松确定按下的内容,sway的作者编写了一个特殊的键盘记录程序 (他需要root用户权限才能工作,因此无需担心安全性)。
结论
可用命令获取可用输出设备的列表
swaymsg -t get_outputs
在每个配置中,您可以设置视频模式,缩放(包括小数),图片,旋转等。 最简单的配置如下所示:
output HDMI-A-1 mode 1920x1080@60Hz output * bg /path/to/wallpaper.jpg fill
选项的完整列表可以在man sway-output
魔法中找到。
还有一个wlr-randr程序,可以在命令行中设置所有这些程序(也就是说,它是Wayland的XRandr的类似物)。
摇杆
Swaybar-在其上显示状态信息的面板。 日期,时间,系统托盘等 等 通常,i3和摇摆爱好者会花费最多时间来设置此特定面板(或多个面板,可能有几个)。 就个人而言,我已经足够了,接近最低配置:
bar { position top colors { statusline #ffffff background #282828E6 inactive_workspace #282936BF #282936BF #5c5c5c } font Hack 11 status_command i3blocks }
有许多选项可用于调整位置,颜色,字体,纸盘等。 您可以在mana- man 5 sway-bar
有关它们的信息。
Swaybar致力于以i3bar格式读取和解析json,由status_command
输出。 这里有许多程序可以使用。 i3status , waybar , i3status-rs和许多其他项目。 就个人而言,我更喜欢i3blocks,因为其配置简单且易于添加自定义块。
应用程式设定
通知事项
这可以通过mako守护程序完成(很可能在您的发行版中)。 您也可以在那里调整颜色等,但这都是可选的。 只需运行它,它将起作用。
Mako实现了基于dbus的XDG桌面通知规范。 许多程序都支持它,包括Chromium,Firefox和Telegram。
终端模拟器
在诸如KDE的环境中,Plasma通常使用内置的模拟器来显示菜单,选项卡和许多其他设计元素。 但是,为什么这一切都可以控制? 我更喜欢Alacritty-非常感谢使用Rust编写的方式使用GPU仿真器。 我在他的配置( ~/.config/alacritty/alacritty.yml
)的key_bindings部分中添加了这样的热键:
- { key: T, mods: Control|Shift, action: SpawnNewInstance }
用当前目录打开一个新窗口。 制表符的一个很好的替代品,并且摇摆会照顾到布局。
- { key: Up, mods: Control|Shift, action: ScrollLineUp, mode: ~Alt } - { key: Down, mods: Control|Shift, action: ScrollLineDown, mode: ~Alt }
向上/向下滚动一行。
我们在sway配置中编写
set $term alacritty bindsym $mod+Return exec $term
Alacritty不支持连字,因为它们会影响渲染速度。 如果您仍然需要它们,请注意小猫 -这个模拟器也非常快,而且引擎盖下只有令人恐惧的功能和设置。
启动应用程序
通常,使用热键菜单启动正在运行的应用程序。 在配置中,他们写类似
set $menu ... bindsym --to-code $mod+d exec $menu
有很多程序可以显示菜单。 有些,例如dmenu或rofi ,需要XWayland。 在Wayland领导下的工作人员中,我们可以区分bemenu甚至krunner(KDE中Alt+F2
。是的,这是一个独立程序)。
但是,我更喜欢通用的解决方案,即sway-launcher-desktop 。 尽管有名称,但它并不依赖于sway,并且通常不是GUI程序,而是在控制台中工作的小型Shell脚本。 此脚本由$PATH
程序,已安装的桌面文件(根据XDG Desktop Entry规范)以及可能的其他源(在config中配置)组成菜单。 出色的fzf
实用程序用于显示和搜索菜单-请注意。
因此,要显示菜单,我们需要使用此程序打开一个终端窗口。 具有敏捷性,这是这样完成的:
set $menu exec alacritty -e sway-launcher-desktop bindsym --to-code $mod+d exec $menu
您可能希望默认情况下使此窗口浮动。 在i3和sway中,使用for_window
指令在配置中配置这些规则。 要将规则映射到sway-launcher-desktop
窗口,需要为其分配一些唯一的类,对我来说,它只是Launcher
。 请记住,由于使用Wayland,因此i3手册中列出的条件不适合摇摆。 正确的答案可以在“ man 5 sway
”的章节中找到。 在这种情况下, app_id
非常合适,最终配置如下所示:
set $menu exec alacritty --class Launcher -e sway-launcher-desktop for_window [app_id="Launcher"] floating enable, border pixel 10, sticky enable bindsym --to-code $mod+d exec $menu
自动启动应用
原则上,要自动启动程序,您只需编写
exec /path/to/program
在sway config中,甚至创建自定义systemd单元。 但是,在本文中,我将使用KDE和Gnome所采用的XDG Autostart规范。
该规范是运行位于/etc/xdg/autostart
和~/.config/autostart
中的桌面文件。 通常,这些文件与程序打包在一起,但是很容易创建自己。
这就是摇摆的模块化本质所在。 Sway本身对XDG自动启动一无所知,也对XDG桌面条目一无所知。 此外,其开发人员积极不喜欢这些以及所有类似的规范。 但是, dex控制台实用程序可以管理它们(很可能在发行版的存储库中)。
要检查自动运行中的内容,请键入以下命令
$ dex -ade Sway
a
表示自动启动, d
“空运行”, -e Sway
设置环境名称(可以是任意名称),并用于过滤。
结果列表很可能不适合您。 例如,我在kgpg
有kgpg
。 我们按如下步骤进行:将相应的桌面文件从/etc/xdg/autostart
复制到~/.config/autostart
,在其中添加该行
NotShowIn=Sway
然后再次检查自动运行。 许多程序(尤其是用Electron编写的程序)可能不喜欢在Wayland下运行。 我们对他们也一样。 我们复制桌面文件并在那里更改启动行。 那是:
Exec=/usr/bin/skypeforlinux
成为:
Exec=env GDK_BACKEND=x11 /usr/bin/skypeforlinux
上一段落中的swing-launcher-desktop可以使用相同的技术。 解决所有问题后,将行添加到sway配置中
exec dex -ae Sway
或者,您也可以执行相反的操作:将所需的桌面文件复制到某个非标准目录,然后使用以下命令在其上设置dex
exec dex -as /path/to/your/dir
屏幕截图
两个棺材将帮助我们解决这个问题。 slurp允许您在屏幕上选择任意矩形区域,然后grim对其进行截图。 在我的配置中,它看起来像这样:
bindsym Print exec grim ~/Pictures/screen-"$(date +%s)".png bindsym $mod+Print exec grim -g "$(slurp)" ~/Pictures/screen-"$(date +%s)".png
$mod+PrintScreen
任意区域的屏幕截图, PrintScreen
整个屏幕的屏幕截图。
截屏
如果您需要将截屏视频写入文件或将其流式传输到RTMP流(例如,在Twitch上),则wf-recorder将对此提供帮助(还支持slurp)。
如果要使用OBS Studio,则可以使用wlrobs插件。
但是,一方面在KDE和Gnome中以及在另一方面(尤其是在Chrome和Firefox浏览器中)支持的最通用的解决方案是使用Pipewire和XDG Desktop Portal规范。 为了摇摆,有必要的xdg-desktop-portal-wlr层 ,尽管我没有检查其性能。
夜间模式
夜间模式是在黑暗中用较暖的颜色替换显示器的颜色。 科学家们怀疑这真的有用吗,Wayland的开发人员认为,出于技术原因,对伽玛校正协议进行标准化是没有用的。
不过,我喜欢这个功能,而且它也一直存在。 对于夜间模式,我们需要该redshift分支以支持特定于摇摆的协议。
我们可以通过任何方式安装它,在~/.config/redshift/redshift.conf
配置中,选择所需的协议并指定经度和纬度。
[redshift] location-provider=manual adjustment-method=wayland [manual] lat=xx.xx lon=yy.yy
锁定并关闭屏幕
来自另一个棺材的两个人来这里营救。 如果没有活动, swayidle
将在超时中运行给定命令(反之亦然,其外观),并且swaylock
锁定屏幕并要求输入密码。 您可以关闭屏幕(或所有屏幕,如果有多个屏幕)
swaymsg "output * dpms off"
守护程序的外观如下所示:在不活动300秒后阻止屏幕,并在600秒后将其关闭:
swayidle -w \ timeout 300 'swaylock -f -c 000000' \ timeout 600 'swaymsg "output * dpms off"' \ resume 'swaymsg "output * dpms on"' \ before-sleep 'swaylock -f -c 000000'
以任何方式运行它。
i3blocks
带有日历,网络,磁盘状态等的现成块。 等 可以从i3blocks-contrib存储库中借用。 在i3blocks中,它们被添加到~/.config/i3blocks/config
。 例如,一个块,按星期,日期和时间每5秒更新一次:
[time] command=date +"%a %d/%m %H:%M" interval=5
但这只是一个简单的例子。 实际上,i3和摇摆爱好者有一个圣杯:在顶部栏中显示当前窗口的标题栏。 让我们弄清楚如何实现这一目标。
首先,我们开始阅读man sway-ipc
,发现您可以在那里订阅活动。 所需的代码为0x80000003. WINDOW
0x80000003. WINDOW
并返回此结构的json对象:
{ "change" : "focus | title | ...", "container": { focused: true | false, name: "...", ... } }
实际上,窗口本身可以更改其标题( change == title
),或者我们可以将焦点移至另一个窗口( change == focus
)。 但是,该窗口可能会更改标题和焦点。 要过滤掉此类事件,我们必须检查container.focused
属性。
您可以用Python或Go描述所有这些逻辑,但是有更好的方法。 swaymsg
可以轻松地订阅所需的事件并将其输出到stdout:
$ swaymsg -m -t SUBSCRIBE "['window']"
我们将在jq
处理生成的json。 无需深入探讨这个出色实用程序的查询语法的细微之处,可得出以下结果:
$ query='select(.change == "focus" or (.change == "title" and .container.focused)) | .container.name' $ swaymsg -m -t SUBSCRIBE "['window']" | jq --unbuffered -r "$query"
bash上的两行脚本,不再需要任何代码! 需要--unbuffered
标志,否则i3blocks将不会立即接收新行,而仅当清除缓冲区时才接收。
最后,将以下块添加到i3blocks配置中:
[active_window] command=/path/to/our/script.sh interval=persist
作业:教严厉的人为当前窗口截图。 他们说在Wayland这样的事情是不可能的,但是人们对此表示怀疑。
作业2:教i3blocks将当前键盘布局显示为标志。 i3blocks-contrib中有几个块,但是它们显示文本而不是标志,并且在Wayland中不起作用。
其他程序
wl-clipboard允许您从终端上使用剪贴板,即,它替换了xclip和xsel。 这对于vim用户特别有用,其中复制/粘贴使用"+y
/ "+p
(只需安装此软件包,不需要其他配置)。
ydotool-替换xdotool。
waypipe-网络透明度的代理。 老实说,我不记得上次有人在专门论坛上问与该功能有关的问题。 也许他们根本不使用它? 我-绝对不是。
KDE连接 将org.kde.kdeconnect.nonplasma.desktop
文件添加到org.kde.kdeconnect.nonplasma.desktop
(请参阅前面的部分),在智能手机上安装KDE Connect并配置它们的连接-您可以使用vlc中的等离子集成插件在浏览器中控制智能手机的音乐和视频播放,cantata中,带有mpv-mpris插件的mpv中 ,还可以通过mako接收通知。 我尊重KDE项目,因为它开发的程序不属于其生态系统。
结论
您可以撰写有关无休止地设置所有这些内容的信息(特别是i3blocks面板),但是最好在这里停止。 这是我得到的:

还可以转到subreddit / r / unixporn惊叹于人们在做什么。 (但是,在那里摆放的所有东西中有95%看起来很漂亮,但绝对不适合日常工作:))。