i3 窗口管理器终极定制指南

在这份超详细的指南中了解如何通过 i3 窗口管理器来自定义系统的外观和体验。

i3 窗口管理器终极定制指南

在这份超详细的指南中了解如何通过 i3 窗口管理器来自定义系统的外观和体验。

你可能在网上(尤其是通过 r/unixporn 子区)看到过很多炫酷的截图,用户可以根据个人喜好自定义他们的桌面并与大家分享。

这是因为 Linux 允许你自定义桌面体验的方方面面。

而结果?就是比任何 Mac 或 Windows 系统更具视觉和感知效果

来看一下这个 ?

i3 窗口管理器终极定制指南

看起来像一个 Linux Mint 系统吗? ?

但是你怎样才能做到这样呢?自定义你的 Linux 桌面外观是很困难的

答案就在于 窗口管理器。如果你能配置好窗口管理器,你就能自定义外观。

在本指南中,我将引导你完成使用 i3 窗口管理器 进行基本配置。它是 Linux 上最好的窗口管理器之一

? “ 加料 Rice ” 是一个常用的词汇,用来指代在桌面上进行视觉改进和自定义。引用自 /r/unixporn (LCTT 译注:“加料”一词来自于购买便宜的亚洲汽车,并给它们安装售后零件,以让它更好地类似于赛车。)

在遵循本指南之前,你需要了解以下内容:

  • 在本指南中,我将使用 Arch Linux 来演示步骤,但你可以使用你喜欢的任何发行版,结果也是一样的。
  • 请记住,本指南是 对 i3 进行“加料”定制的基础

在按照本指南进行操作后,你应该得到以下预期结果:

如何在 Linux 中配置 i3 窗口管理器、i3blocks 和 i3gaps

? 为了节省你的时间,我已经在 GitHub 上上传了与本文相关的所有 i3 配置文件,你可以通过这些文件实现我们在本文中所期望的最终外观。

下载 i3 配置文件

首先,让我们开始安装 i3 窗口管理器

目录

在 Linux 上安装 i3 窗口管理器

基于 Ubuntu/Debian:

“`
sudo apt install xorg lightdm lightdm-gtk-greeter i3-wm i3lock i3status i3blocks dmenu terminator

“`

Arch Linux:

“`
sudo pacman -S xorg lightdm lightdm-gtk-greeter i3-wm i3lock i3status i3blocks dmenu terminator

“`

当你完成安装后,使用以下命令启用 lightdm 服务:

“`
sudo systemctl enable lightdm.service

“`

然后启动 lightdm 服务:

“`
sudo systemctl start lightdm.service

“`

这将启动 lightdm 登录界面,并要求你输入用户名密码。

如果你安装了多个桌面环境,你可以从选择菜单中选择 i3:

在 Arch Linux 上使用 lightdm 使用 i3 窗口管理器

当首次登录 i3 时,它会询问你是否要创建一个 i3 配置文件。

按下回车键创建一个新的 i3 配置文件:

生成 i3 配置文件

接下来,它会询问你选择 WinAlt 键哪个作为修饰键(mod)。

我建议你选择 Win(或者 Super 键),因为大多数用户已经习惯将其用作快捷键:

i3 窗口管理器终极定制指南

现在你可以开始使用 i3 窗口管理器了。

但在我们开始定制之前,让我先介绍一下你如何使用 i3。

i3 窗口管理器的按键绑定

让我们从基础知识开始。

窗口管理器的基本功能是将多个窗口水平和垂直地组合在一起,这样你就可以同时监视多个进程。

结果是这样的:

在 Arch Linux 上使用 i3

你可以使用以下按键绑定执行更多操作:

| 按键绑定 | 描述 |
| |
| Mod + Enter | 打开终端。 |
| Mod + ← | 切换到左侧窗口。 |
| Mod + → | 切换到右侧窗口。 |
| Mod + ↑ | 切换到上方窗口。 |
| Mod + ↓ | 切换到下方窗口。 |
| Mod + Shift + ← | 将窗口移动到左侧。 |
| Mod + Shift + → | 将窗口移动到右侧。 |
| Mod + Shift + ↑ | 将窗口移动到上方。 |
| Mod + Shift + ↓ | 将窗口移动到下方。 |
| Mod + f | 将焦点窗口切换到全屏模式。 |
| Mod + v | 下一个窗口将垂直放置。 |
| Mod + h | 下一个窗口将水平放置。 |
| Mod + s | 启用堆叠式窗口布局。 |
| Mod + w | 启用选项卡式窗口布局。 |
| Mod + Shift + Space | 启用浮动窗口(针对焦点窗口)。 |
| Mod + 鼠标左键单击 | 使用鼠标拖动整个窗口。 |
| Mod + 0-9 | 切换到另一个工作区。 |
| Mod + Shift + 0-9 | 将窗口移动到另一个工作区。 |
| Mod + d | 打开应用程序启动器(D 菜单)。 |
| Mod + Shift + q | 关闭焦点窗口。 |
| Mod + Shift + c | 重新加载 i3 配置文件。 |
| Mod + Shift + r | 重启 i3 窗口管理器。 |
| Mod + Shift + e | 退出 i3 窗口管理器。 |

我知道按键绑定很多,但如果你每天练习它们,你很快就会习惯。

如果你想知道,你可以根据需要更改按键绑定,后面的指南中我会分享如何做到这一点。

现在,让我们来看看配置部分。

在 Arch Linux 中启用 AUR

如果你刚刚安装了 Arch Linux,可能还没有启用 AUR。

这意味着你错过了 Arch Linux 最重要的特性。

启用 AUR,你需要使用 AUR 包管理器。在这里,我将使用 yay

首先,安装 git

“`
sudo pacman -S git

“`

现在,克隆 yay 存储库并切换到 yay 目录:

“`
git clone https://aur.archlinux.org/yay-git.git && cd yay

“`

最后,构建包:

“`
makepkg -si

“`

还有其他一些 AUR 包管理器,比如 Paru,如果你想使用除 yay 之外的其他工具,你可以继续或者探索其他选项。

更改 i3 窗口管理器的分辨率

如果你使用虚拟机运行窗口管理器,可能会遇到问题,尤其是显示分辨率可能被锁定在 1024x768 上,就像我一样。

因此,你需要执行以下命令,指定所需的显示分辨率:

“`
xrandr –output [显示名称] –mode [分辨率]

“`

要找到已连接显示器的名称,你需要使用以下形式的 xrandr 命令:

“`
xrandr | grep -w ‘connected’

“`

在 i3 中查找已连接显示器

在我的情况下,显示名称是 Virtual-1

因此,如果我想将分辨率更改为 1920*1080,我需要执行以下命令:

“`
xrandr –output Virtual-1 –mode 1920×1080

“`

但这只是暂时生效。要使其永久生效,你需要在 i3 配置文件中进行更改。

首先,打开配置文件:

“`
nano ~/.config/i3/config

“`

通过按下 Alt + / 来在 nano跳到文件末尾,并使用以下语法来永久更改显示分辨率:

“`

显示分辨率

exec_always xrandr –output [显示名称] –mode [分辨率]

“`

结果应该是这样的:

在 i3 中永久更改显示分辨率

完成后,保存更改并退出 nano 文本编辑器。

现在,使用 Mod + Shift + r 重新启动 i3 窗口管理器,以使你对配置文件所做的更改生效!

在 i3 窗口管理器中更改壁纸

默认情况下,i3 的外观比较陈旧,你可能想切换回之前的桌面环境。

但是通过更改壁纸,你可以改变整个系统的氛围。

在 i3 中有多种方式可以更改壁纸,但在这里,我将向你展示如何使用 feh 实用工具。

首先,让我们从安装开始:

对于基于 Arch 的发行版

“`
sudo pacman -S feh

“`

对于 Ubuntu/Debian 系的发行版:

“`
sudo apt install feh

“`

安装完成后,你可以从互联网上下载你喜欢的壁纸。接下来,打开 i3 配置文件

“`
nano ~/.config/i3/config

“`

跳到文件的末尾,使用如下所示的 feh 命令:

“`

显示壁纸

exec_always feh –bg-fill /path/to/wallpaper

“`

在我的情况下,壁纸位于 Downloads 目录中,所以我的命令如下:

使用 feh 实用工具在 I3 窗口管理器中更改背景

保存更改并退出 nano 文本编辑器。

为了使配置文件的更改生效,使用 Mod + Shift + r 重新启动 i3 窗口管理器。

我的效果如下:

在 i3 窗口管理器中更改壁纸

自定义 i3 锁屏界面

默认情况下,如果你想锁定系统,你需要执行以下命令:

“`
i3lock

“`

锁屏界面如下所示:

锁定 i3 窗口管理器

下面,我将向你展示:

  • 如何创建自定义快捷方式以锁定 i3 会话
  • 如何更改锁屏界面的壁纸

为了使锁屏界面更加美观,你需要使用 i3lock-color 包。

但首先,你需要移除现有的 i3lock,因为它会与 i3lock-color 冲突:

在 Arch Linux 上移除它:

“`
sudo pacman -R i3lock

“`

对于 Ubuntu/Debian 用户:

“`
sudo apt remove i3lock

“`

完成后,你可以使用 AUR 包管理器安装 i3lock-color

“`
yay i3lock-color

“`

如果你使用的是基于 Ubuntu 的系统,你需要从头编译它。你可以在他们的 GitHub 页面上找到 详细的说明

安装完成后,让我们创建一个新目录并创建一个新文件来存储锁屏界面的配置:

安装好 i3lock-color 后,你可以创建一个新目录并创建一个新文件来存储锁屏界面的配置:

“`
mkdir ~/.config/scripts && nano ~/.config/scripts/lock

“`

将以下文件内容粘贴到文件中,定义锁屏界面的样式:

“`

!/bin/sh

BLANK=’#00000000′
CLEAR=’#ffffff22′
DEFAULT=’#00897bE6′
TEXT=’#00897bE6′
WRONG=’#880000bb’
VERIFYING=’#00564dE6′

i3lock \
–insidever-color=$CLEAR \
–ringver-color=$VERIFYING \
\
–insidewrong-color=$CLEAR \
–ringwrong-color=$WRONG \
\
–inside-color=$BLANK \
–ring-color=$DEFAULT \
–line-color=$BLANK \
–separator-color=$DEFAULT \
\
–verif-color=$TEXT \
–wrong-color=$TEXT \
–time-color=$TEXT \
–date-color=$TEXT \
–layout-color=$TEXT \
–keyhl-color=$WRONG \
–bshl-color=$WRONG \
\
–screen 1 \
–blur 9 \
–clock \
–indicator \
–time-str=”%H:%M:%S” \
–date-str=”%A, %Y-%m-%d” \
–keylayout 1 \

“`

保存更改并退出文本编辑器。

? 在网上可以找到各种不同的 i3 锁屏样式的 bash 脚本。这只是一个示例,对于大多数情况来说是一个较为简单的选项。

现在,使用 chmod 命令 将该文件设置为可执行文件:

“`
sudo chmod +x .config/scripts/lock

“`

接下来,你需要对配置文件进行一些更改,以添加该配置文件的路径以使其生效。

此外,我将向你展示如何使用自定义键盘快捷键锁定屏幕。

首先,打开配置文件:

“`
nano ~/.config/i3/config

“`

使用 Alt + / 跳至行尾并粘贴以下内容:

“`

锁屏快捷键

bindsym $mod+x exec /home/$USER/.config/scripts/lock

“`

在上面的示例中,我将 mod + x 作为锁定屏幕的快捷键,你可以选择任何你喜欢的快捷键。

最后的配置文件将如下所示:

如何在 Arch Linux 中使用 i3lock-color

相当不错,不是吗?

在 i3 窗口管理器中更改主题和图标

我知道你可能会想到这个问题。

你为什么需要图标呢?你并不仅仅使用窗口管理器来使用命令行工具。

有时候,使用图形界面更加方便,比如使用文件管理器。所以,在处理这些工具时,你希望界面看起来更好看?

因此,在本部分中,我将向你展示:

  • 如何在 i3 中更改主题
  • 如何在 i3 中更改图标

让我们从安装主题开始。

在这里,我将使用 materia-gtk-themepapirus 图标,但你可以使用任何你喜欢的主题和图标。

在 Arch 中安装主题,使用以下命令:

“`
sudo pacman -S materia-gtk-theme papirus-icon-theme

“`

在 Ubuntu/Debian 系统中:

“`
sudo apt install materia-gtk-theme papirus-icon-theme

“`

但仅仅安装还不能完成任务。你需要像使用 GNOME “ 调整 Tweaks ” 应用更改主题一样来应用主题。

在 i3 中,你可以使用 lxappearance 工具 来更改主题和图标。

在 Arch 中安装 lxappearance,使用以下命令:

“`
sudo pacman -S lxappearance

“`

在 Ubuntu/Debian 系统中:

“`
sudo apt install lxappearance

“`

安装完成后,使用 Mod + d 启动 D 菜单,然后输入 lxappearance,并在第一个结果上按回车键。

在这里,选择你喜欢的主题。我这里选择 Materia-dark

选择主题后,点击应用按钮以应用更改:

i3 窗口管理器终极定制指南

同样地,要更改图标,选择 “ 图标主题 Icon Theme ”,选择图标主题,然后点击应用按钮:

使用 lxappearance 更改 i3 窗口管理器中的图标

应用主题和图标后,我的文件管理器如下所示:

在 i3 窗口管理器中更改主题和图标

在 i3 窗口管理器中为工作区设置图标

默认情况下,工作区仅由数字表示,这并不是你想要使用工作区的最理想方式。

因此,在本部分中,我将引导你如何使用合适的图标更改工作区的名称。

为了在配置文件中使用图标,首先你需要安装名为 Awesome 的新字体:

对于基于 Arch 的发行版:

“`
sudo pacman -S ttf-font-awesome

“`

对于 Ubuntu/Debian 系统:

“`
sudo apt install fonts-font-awesome

“`

安装完成后,打开 i3 配置文件:

“`
nano ~/.config/i3/config

“`

在这个配置文件中,找到工作区的部分,你将会看到为每个工作区给出的变量:

在 i3 配置文件中的工作区变量

在这个部分,你需要用你想要的名称替换给出的工作区数字。

我将把第一个工作区命名为 “programs”,因为在本教程的后面部分,我将展示如何将特定的应用程序分配到特定的工作区。

我主要使用前 5 个工作区,所以我会相应地命名它们:

“`

定义默认工作区的名称,稍后我们将在其中配置键绑定。

我们使用变量来避免在多个地方重复使用名称。

set $ws1 “1: Terminal”
set $ws2 “2: Firefox”
set $ws3 “3: VMWare”
set $ws4 “4: Spotify”
set $ws5 “5: Shutter”
set $ws6 “6”
set $ws7 “7”
set $ws8 “8”
set $ws9 “9”
set $ws10 “10”

“`

现在让我们为配置文件中提到的每个应用程序添加图标。

你可以 参考 awesome 字体的备忘单 来找到合适的图标。

将图标复制粘贴到名称前面:

“`

定义默认工作区的名称,稍后我们将在其中配置键绑定。

我们使用变量来避免在多个地方重复使用名称。

set $ws1 “1:  Terminal”
set $ws2 “2:  Firefox”
set $ws3 “3:  VMWare”
set $ws4 “4:  Spotify”
set $ws5 “5:  Shutter”
set $ws6 “6”
set $ws7 “7”
set $ws8 “8”
set $ws9 “9”
set $ws10 “10”

“`

不要担心它看起来可怕!

完成后,使用 Mod + e 退出 i3,然后再次登录以应用你刚刚所做的更改。

我的效果如下图所示:

i3 窗口管理器终极定制指南

字体看起来太小?是时候解决这个问题了!

在 i3 中更改标题窗口和状态栏的字体

首先,让我们安装新的字体(我将在这里使用 Ubuntu 字体)。

要在 Arch 上安装 Ubuntu 字体,请执行以下操作:

“`
sudo pacman -S ttf-ubuntu-font-family

“`

如果你使用的是 Ubuntu,你已经安装了这些字体!

安装完成后,打开配置文件:

“`
nano ~/.config/i3/config

“`

在配置文件中,找到 font pango:monospace 8 这一行,这是默认字体。

找到那行后,添加字体名称和大小,如下所示:

“`
font pango:Ubuntu Regular 14

“`

然后,使用 Mod + Shift + r 重新启动窗口管理器,这样就完成了工作:

i3 窗口管理器终极定制指南

在 i3 窗口管理器中分配应用程序到工作区

在给工作区命名之后,你会想要将特定的软件分配到相应的工作区中。

例如,如果我将第二个工作区命名为 “Firefox”,那么我只想在该工作区中使用 Firefox。

那么要如何实现呢?

为了做到这一点,你需要找到每个要分配的应用程序的类名。

听起来复杂? 让我告诉你如何做。

首先,将应用程序和终端并排打开。例如,在这个例子中,我将 Firefox 和终端并排打开:

并排打开应用程序和终端

现在,在终端中执行 xprop 命令,它会改变鼠标指针的形状:

“`
xprop

“`

接下来,将鼠标悬停在应用程序上,并在应用程序窗口内的任何位置单击,如图所示:

在 i3 窗口管理器中查找类名

类名将在以下行的最后一个字符串中找到:

“`
WM_CLASS(STRING) = “Navigator”, “firefox”

“`

在我的情况下,Firefox 浏览器的类名将是 firefox

对所有你想要分配到工作区的应用程序重复这个过程。

一旦你知道每个你想要分配到工作区的应用程序的类名,打开配置文件:

“`
nano ~/.config/i3/config

“`

使用 Alt + /nano 定位到文件末尾,并使用以下语法将应用程序分配到工作区:

“`

分配应用到工作区

for_window [class=”类名”] move to workspace $[工作区变量]

“`

作为参考,下面是我为不同应用程序分配了 4 个工作区后的配置文件示例:

将应用分配到工作区

现在,无论在哪个工作区打开任何应用程序,它都会自动放置在配置的工作区中。非常方便! ?

在 i3 窗口管理器中让终端变透明

要启用透明效果,你需要安装 picom 合成器并对配置文件进行一些更改。

让我们从安装开始。

对于基于 Arch 的发行版:

“`
sudo pacman -S picom

“`

对于基于 Ubuntu/Debian 的发行版:

“`
sudo apt install picom

“`

安装完成后,你需要告诉系统使用 picom

首先打开配置文件:

“`
nano ~/.config/i3/config

“`

在配置文件的末尾插入以下行:

“`

使用 picom 合成器实现透明效果

exec_always picom -f

“`

这里,我使用 -f 标志来在切换工作区、打开新应用程序等时启用淡入淡出效果。

保存并退出文本编辑器。

现在,使用 Mod + Shift + r 重新启动 i3。

接下来,打开终端,打开 “ 首选项 Preference ”,然后选择“ 配置文件 Profiles ”,选择“ 背景 Background ”,然后选择“ 透明背景 Transparent background ”选项。

从这里,你可以调整透明度:

在 i3 窗口管理器中更改终端背景透明度

在 i3 窗口管理器中自定义状态栏

默认情况下,状态栏显示各种信息,但没有图标。

因此,在这个部分,我将展示如何从状态栏中删除一些元素以及如何为它们添加图标。

但是,在这里,我将在 /etc/i3status.conf 中创建一个原始状态栏的副本,以便如果出现任何错误,你可以随时恢复到默认配置。

首先,在 .config 目录下创建一个新的目录:

“`
mkdir .config/i3status

“`

在以下命令中,我使用了 cp 命令来复制文件

“`
sudo cp /etc/i3status.conf ~/.config/i3status/i3status.conf

“`

接下来,使用 chown 命令更改所有者,以便你可以进行所需的更改:

“`
sudo chown $USER:$USER ~/.config/i3status/i3status.conf

“`

现在,你需要通过修改 i3 配置文件来指示窗口管理器使用新的 i3status 配置文件。首先打开配置文件:

“`
nano ~/.config/i3/config

“`

在该配置文件中查找 status_command i3status 这一行。这是你将提供新状态配置文件路径的行。

找到该行后,进行以下更改:

“`
bar {
status_command i3status -c /home/$USER/.config/i3status/i3status.conf
}

“`

最终的结果应该如下所示:

在 i3 窗口管理器中更改 i3 状态配置路径

保存更改并退出文本编辑器。

现在,让我们从状态栏中删除不必要的指示器。

首先,打开 i3status 配置文件:

“`
nano .config/i3status/i3status.conf

“`

在这里,你可以将以 order 开头的行注释掉,这些行实际上是指示器的变量。

例如,在这里,我禁用了 ipv6wireless _first_battery allload 这些对我来说不必要的指示器:

“`

order += “ipv6”

order += “wireless first

order += “ethernet first

order += “battery all”

order += “disk /”

order += “load”

order += “memory”
order += “tztime local”

“`

然后,在浏览器中打开 awesome font 列表,找到与状态栏中列出的项目相关的适当图标。

在我的设置中,我删除了以下内容:

  • 删除了显示可用内存的行
  • 删除了显示以太网连接速度的行

最终,我的状态栏如下所示:

自定义 i3 窗口管理器中的状态栏

在 i3 窗口管理器中改变颜色方案

更改 i3 窗口管理器中的颜色方案是这个指南中最重要的部分,因为窗口管理器最吸引人的地方就是你选择的窗口装饰颜色。

? 我将为每个颜色声明变量,这样你只需更改变量本身的值,就可以轻松地获得新的颜色方案。

首先,打开 i3 配置文件:

“`
nano ~/.config/i3/config

“`

使用 Alt + / 快捷键到达文件末尾,并使用以下语法添加变量来存储颜色:

“`

窗口的色彩方案

set $bgcolor #523d64
set $in-bgcolor #363636
set $text #ffffff
set $u-bgcolor #ff0000
set $indicator #a8a3c1
set $in-text #969696

边框 背景 文本 指示器(显示下一个窗口位置的线条)

client.focused $bgcolor $bgcolor $text $indicator
client.unfocused $in-bgcolor $in-bgcolor $in-text $in-bgcolor
client.focused_inactive $in-bgcolor $in-bgcolor $in-text $in-bgcolor
client.urgent $u-bgcolor $u-bgcolor $text $u-bgcolor

“`

在这里:

  • bgcolor 表示背景色。
  • in-bgcolor 表示非活动窗口的背景色。
  • text 是文本颜色。
  • u-bgcolor 表示紧急操作的背景色。
  • indicator 是标示下一个窗口位置的线条的颜色。
  • in-text 是非活动窗口的文本颜色。

对于本指南,我仅使用了四个基本类别:

  • client.focused 定义了焦点窗口的颜色。
  • client.unfocused 定义了失去焦点时窗口的装饰。
  • client.focused_inactive 当其中一个容器处于焦点但当前没有焦点时,显示的颜色。
  • client.urgent 定义了紧急操作时的颜色。

? 除了这四个类别,还有更多类别,请参考 官方 i3 配置手册 以了解更多信息。

一旦你对配置文件进行了更改,请使用 Mod + Shift + r 重新启动 i3。

如果你按照我的颜色方案,设置应该如下所示:

更改 I3 窗口管理器中的窗口颜色

那么,状态栏的颜色怎么办?当然可以改!

更改 i3 窗口管理器中状态栏的颜色方案

在本节中,你将意识到为什么我使用变量来存储颜色,因为我将使用相同的变量来为我的状态栏上色!

要在状态栏中使用颜色,你需要在 i3 配置文件的 bar {...} 部分进行更改。

首先,打开配置文件:

“`
nano ~/.config/i3/config

“`

在配置文件中查找 bar {...} 部分。

找到该部分后,创建一个颜色部分,并为状态栏定义颜色和类别,与你为窗口所做的相同:

“`
bar {
statuscommand i3status -c /home/$USER/.config/i3status/i3status.conf
colors {
background $bgcolor
separator #191919
# border background text
focused
workspace $bgcolor $bgcolor $text
inactiveworkspace $in-bgcolor $in-bgcolor $text
urgent
workspace $u-bgcolor $u-bgcolor $text

    }

}

“`

在这里,我使用了 focused_workspaceinactive_workspaceurgent_workspace 这三个类别,根据需要定义了相应的颜色。

保存更改后,重新启动 i3,状态栏也会显示颜色。

设置 i3 状态栏的透明度

本节将向你展示如何使 i3 状态栏透明。

在此之前,让我们先更改 i3 状态栏的字体。

这里,我将使用 Droid 字体,使其看起来干净而带有一种极客风格。

要在 Arch Linux 上安装 Droid 字体,请使用以下命令:

“`
sudo pacman -S ttf-droid

“`

对于 Ubuntu/Debian 系统,请使用以下命令:

“`
sudo apt install fonts-droid-fallback

“`

安装完成后,打开配置文件:

“`
nano ~/.config/i3/config

“`

进入 bar {...} 部分,并按下面的示例输入字体名称和大小:

“`
font pango: Droid Sans Mono 11

“`

在 i3 状态栏中更改字体

完成后,请重新启动 i3,字体将会被更改!

要使状态栏透明,你可以使用现有十六进制代码中的额外两个数字来定义透明度。

如果你想要控制透明度,我建议你查看 此指南,其中提供了从 0 到 100% 透明度的代码范围

为此,我将在配置文件中使用两个新变量。首先,打开配置文件:

“`
nano ~/.config/i3/config

“`

在这里,我为背景颜色添加了 60% 的透明度,并为非活跃背景颜色添加了 30% 的透明度:

“`
set $bgcolor #523d6499
set $in-bgcolor #3636364D

“`

如果你仔细观察,我在现有的十六进制颜色代码中添加了两位数字来定义透明度。例如,使用 99 来表示 60% 的透明度,而使用 4D 来表示 30% 的透明度。

此外,我添加了两个新变量,透明度不同但颜色相同,作为背景使用,使其看起来更好:

“`
set $focused-ws #523d6480
set $bar-color #523d640D

“`

完成后,让我们修改 bar {...} 部分来应用透明度。

bar {...} 中添加两行代码:

“`
i3barcommand i3bar –transparency
tray
output none

“`

请注意,使用 tray_output none,它将不会在托盘中显示任何图标。如果你不希望出现这种行为,则可以跳过此行,只添加第一行以实现透明度。

一旦完成,修改状态栏的颜色方案,例如更改背景颜色、边框和活动工作区的背景。

修改后,配置文件应如下所示:

使 i3 状态栏透明的配置文件(i3 窗口管理器)

为了使你所做的更改生效,请重新启动 i3,你将得到透明的窗口和状态栏:

在 i3 窗口管理器中使状态栏和窗口透明

在窗口管理器中使用 i3blocks

默认的 i3 状态栏在我看来毫无用处;怎么样让它变得有用起来呢?

在本部分,我将解释如何添加以下功能:

  • 软件包更新
  • 内存使用情况
  • 磁盘使用情况
  • 音量指示器
  • Spotify 指示器

? 要实现这些功能,你需要使用一些脚本,这些脚本将允许你向状态栏添加所需的操作。不用担心,我不会让你手动输入脚本;GitHub 上有各种脚本可供选择,几乎涵盖了你所需的所有方面。

但在此之前,你需要进行一些配置,以存储脚本并指示 i3 使用 i3block 的配置,而不是使用 i3bar。

如果你在本指南的开头按照给定的说明进行操作,那么 i3blocks 已经安装好了,并且配置文件位于 /etc/i3blocks.conf

如果你希望快速下载块配置文件以进行设置而不阅读其他内容,请点击以下链接:

i3 配置文件

在本教程中,我将创建一个副本,使用它代替原始的配置文件,因此首先我们要创建一个目录来存储配置文件的副本:

“`
mkdir ~/.config/i3blocks

“`

现在,创建一个原始配置文件的副本:

“`
sudo cp /etc/i3blocks.conf ~/.config/i3blocks/

“`

最后,使用 chown 命令更改文件的所有者,以便你进行所需的更改:

“`
sudo chown $USER:$USER ~/.config/i3blocks/i3blocks.conf

“`

要启用 i3blocks,在 i3 配置文件中进行一些更改:

“`
nano ~/.config/i3/config

“`

进入 bar {...} 部分,在这里,你需要将 status_command 更改为 i3blocks 并添加 i3blocks 配置文件的路径,如下所示:

在 i3 窗口管理器中启用 i3blocks

完成后,使用 Mod + Shift + r 重新启动 i3 窗口管理器,整个状态栏都会被更改,并显示如下:

i3 窗口管理器中 i3blocks 的默认外观

不要担心,你将很快使状态栏比以前的 i3bar 更有价值和好看。

添加磁盘块

如果你想要显示磁盘剩余空间,可以添加此块。

在这里,我将使用 nano 创建并打开用于磁盘块的配置文件。

“`
nano ~/.config/scripts/disk

“`

然后粘贴以下行:

“`

!/usr/bin/env sh

DIR=”${DIR:-$BLOCKINSTANCE}”
DIR=”${DIR:-$HOME}”
ALERT
LOW=”${ALERTLOW:-$1}”
ALERT
LOW=”${ALERT_LOW:-10}” # color will turn red under this value (default: 10%)

LOCALFLAG=”-l”
if [ “$1” = “-n” ] || [ “$2” = “-n” ]; then
LOCAL
FLAG=””
fi

df -h -P $LOCALFLAG “$DIR” | awk -v label=”$LABEL” -v alertlow=$ALERTLOW ‘
/\/.*/ {
# full text
print label $4
# short text
print label $4
use=$5
# no need to continue parsing
exit 0
}
END {
gsub(/%$/,””,use)
if (100 – use < alert
low) {
# color
print “#FF0000”
}
}

“`

保存更改并从文本编辑器中退出。

现在,将此文件设置为可执行:

“`
sudo chmod +x ~/.config/scripts/disk

“`

接下来,打开 I3blocks 配置文件:

“`
nano ~/.config/i3blocks/i3blocks.conf

“`

根据你想要放置磁盘块的位置,粘贴以下行:

“`
[disk]
command=/home/$USER/.config/scripts/disk
LABEL=

DIR=$HOME

ALERT_LOW=10

interval=30

“`

完成后,保存更改并使用 Mod + Shift + r 重新启动 i3,状态栏中将显示带有磁盘图标的可用磁盘空间。

添加内存块

这将是状态栏中指示系统中已使用内存的块。

首先,创建并打开一个新文件用于新的块:

“`
nano ~/.config/scripts/memory

“`

然后在新文件中粘贴以下行:

“`

!/usr/bin/env sh

TYPE=”${BLOCK_INSTANCE:-mem}”
PERCENT=”${PERCENT:-true}”

awk -v type=$TYPE -v percent=$PERCENT ‘
/^MemTotal:/ {
memtotal=$2
}
/^MemFree:/ {
mem
free=$2
}
/^Buffers:/ {
memfree+=$2
}
/^Cached:/ {
mem
free+=$2
}
/^SwapTotal:/ {
swaptotal=$2
}
/^SwapFree:/ {
swap
free=$2
}
END {
if (type == “swap”) {
free=swapfree/1024/1024
used=(swap
total-swapfree)/1024/1024
total=swap
total/1024/1024
} else {
free=memfree/1024/1024
used=(mem
total-memfree)/1024/1024
total=mem
total/1024/1024
}
pct=0
if (total > 0) {
pct=used/total*100
}
# full text
if (percent == “true” ) {
printf(“%.1fG/%.1fG (%.f%%)\n”, used, total, pct)
} else {
printf(“%.1fG/%.1fG\n”, used, total)
}
# short text
printf(“%.f%%\n”, pct)
# color
if (pct > 90) {
print(“#FF0000”)
} else if (pct > 80) {
print(“#FFAE00”)
} else if (pct > 70) {
print(“#FFF600”)
}
}
‘ /proc/meminfo

“`

保存更改并从文本编辑器中退出。

现在,要使其生效,你需要使用以下命令将此文件设置为可执行:

“`
sudo chmod +x ~/.config/scripts/memory

“`

接下来,打开 i3blocks 配置文件:

“`
nano ~/.config/i3blocks/i3blocks.conf

“`

并将以下内容粘贴到你希望在状态栏中显示内存使用情况的位置:

“`
[memory]
command=/home/$USER/.config/scripts/memory
label=
interval=30

“`

保存更改并从文本编辑器中退出。重新启动 i3 以使更改生效!

添加更新指示块

这是最有帮助的指示器,它显示需要更新的旧软件包数量。

首先,使用以下命令安装依赖项以使其正常工作:

“`
sudo pacman -S pacman-contrib

“`

现在,创建一个新文件来存储脚本:

“`
nano ~/.config/scripts/arch-update

“`

然后粘贴以下内容:

“`

!/usr/bin/env python3

import subprocess
from subprocess import check_output
import argparse
import os
import re

def createargparse():
def _default(name, default=”, arg
type=str):
val = default
if name in os.environ:
val = os.environ[name]
return arg_type(val)

strbool = lambda s: s.lower() in ['t', 'true', '1']
strlist = lambda s: s.split()

parser = argparse.ArgumentParser(description='Check for pacman updates')
parser.add_argument(
    '-b',
    '--base_color',
    default = _default('BASE_COLOR', 'green'),
    help='base color of the output(default=green)'
)
parser.add_argument(
    '-u',
    '--updates_available_color',
    default = _default('UPDATE_COLOR', 'yellow'),
    help='color of the output, when updates are available(default=yellow)'
)
parser.add_argument(
    '-a',
    '--aur',
    action = 'store_const',
    const = True,
    default = _default('AUR', 'False', strbool),
    help='Include AUR packages. Attn: Yaourt must be installed'
)
parser.add_argument(
    '-y',
    '--aur_yay',
    action = 'store_const',
    const = True,
    default = _default('AUR_YAY', 'False', strbool),
    help='Include AUR packages. Attn: Yay must be installed'
)
parser.add_argument(
    '-q',
    '--quiet',
    action = 'store_const',
    const = True,
    default = _default('QUIET', 'False', strbool),
    help = 'Do not produce output when system is up to date'
)
parser.add_argument(
    '-w',
    '--watch',
    nargs='*',
    default = _default('WATCH', arg_type=strlist),
    help='Explicitly watch for specified packages. '
    'Listed elements are treated as regular expressions for matching.'
)
return parser.parse_args()

def getupdates():
output = ”
try:
output = check
output([‘checkupdates’]).decode(‘utf-8’)
except subprocess.CalledProcessError as exc:
# checkupdates exits with 2 and no output if no updates are available.
# we ignore this case and go on
if not (exc.returncode == 2 and not exc.output):
raise exc
if not output:
return []

updates = [line.split(' ')[0]
           for line in output.split('\n')
           if line]

return updates

def getauryaourtupdates():
output = ”
try:
output = check
output([‘yaourt’, ‘-Qua’]).decode(‘utf-8’)
except subprocess.CalledProcessError as exc:
# yaourt exits with 1 and no output if no updates are available.
# we ignore this case and go on
if not (exc.returncode == 1 and not exc.output):
raise exc
if not output:
return []

aur_updates = [line.split(' ')[0]
               for line in output.split('\n')
               if line.startswith('aur/')]

return aur_updates

def getauryayupdates():
output = check
output([‘yay’, ‘-Qua’]).decode(‘utf-8’)
if not output:
return []

aur_updates = [line.split(' ')[0] for line in output.split('\n') if line]

return aur_updates

def matchingupdates(updates, watchlist):
matches = set()
for u in updates:
for w in watch_list:
if re.match(w, u):
matches.add(u)

return matches

label = os.environ.get(“LABEL”,””)
message = “{0}{2}
args = create_argparse()

updates = getupdates()
if args.aur:
updates += get
auryaourtupdates()
elif args.auryay:
updates += get
auryayupdates()

updatecount = len(updates)
if update
count > 0:
if updatecount == 1:
info = str(update
count) + ‘ update available’
shortinfo = str(updatecount) + ‘ update’
else:
info = str(updatecount) + ‘ updates available’
short
info = str(update_count) + ‘ updates’

matches = matching_updates(updates, args.watch)
if matches:
    info += ' [{0}]'.format(', '.join(matches))
    short_info += '*'
print(message.format(label, args.updates_available_color, info))
print(message.format(label, args.updates_available_color, short_info))

elif not args.quiet:
print(message.format(label, args.base_color, ‘system up to date’))

“`

保存更改并从文本编辑器中退出。

现在,使用以下命令将此文件设置为可执行:

“`
sudo chmod +x ~/.config/scripts/arch-update

“`

接下来,打开 i3blocks 配置文件:

“`
nano ~/.config/i3blocks/i3blocks.conf

“`

并将以下内容粘贴到所需的位置:

“`
[arch-update]
command=/home/$USER/.config/scripts/arch-update
interval=3600
markup=pango
LABEL=

“`

保存更改并重新加载 i3 窗口管理器,它将显示需要更新的软件包数量。

如果你正在使用 Ubuntu,你可以 按照 GitHub 页面上的说明 进行操作。

添加音量指示块

添加音量指示块需要一些努力,因为你希望它的行为符合预期。你需要实现以下功能:

  • 使用媒体控制键管理音量的键绑定
  • 添加一个指示音量的音量块

但要做到这一点,首先你需要安装一些依赖项。

如果你使用的是 Arch Linux,请使用以下命令:

“`
sudo pacman -S pulseaudio-alsa pulseaudio-bluetooth pulseaudio-equalizer pulseaudio-jack alsa-utils playerctl

“`

如果你使用的是 Ubuntu/Debian 系统,请使用以下命令:

“`
sudo apt install pulseaudio-module-bluetooth pulseaudio-equalizer pulseaudio-module-jack alsa-utils playerctl

“`

接下来,让我们看看如何在 i3 窗口管理器中启用媒体控制键。

首先,打开 i3 配置文件:

“`
nano ~/.config/i3/config

“`

转到文件的末尾,并粘贴以下内容:

“`

Key bindings for Media control keys

bindsym XF86AudioPlay exec playerctl play
bindsym XF86AudioPause exec playerctl pause
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous

“`

现在,让我们为此块创建一个新文件:

“`
nano ~/.config/scripts/volume

“`

然后粘贴以下内容:

“`

!/usr/bin/env bash

if [[ -z “$MIXER” ]] ; then
MIXER=”default”
if command -v pulseaudio >/dev/null 2>&1 && pulseaudio –check ; then
# pulseaudio is running, but not all installations use “pulse”
if amixer -D pulse info >/dev/null 2>&1 ; then
MIXER=”pulse”
fi
fi
[ -n “$(lsmod | grep jack)” ] && MIXER=”jackplug”
MIXER=”${2:-$MIXER}”
fi
if [[ -z “$SCONTROL” ]] ; then
SCONTROL=”${BLOCK_INSTANCE:-$(amixer -D $MIXER scontrols |
sed -n “s/Simple mixer control ‘([^’]*)’,0/\1/p” |
head -n1
)}”
fi

The first parameter sets the step to change the volume by (and units to display)

This may be in in % or dB (eg. 5% or 3dB)

if [[ -z “$STEP” ]] ; then
STEP=”${1:-5%}”
fi

NATURALMAPPING=${NATURALMAPPING:-0}
if [[ “$NATURALMAPPING” != “0” ]] ; then
AMIXER
PARAMS=”-M”
fi

#

capability() { # Return “Capture” if the device is a capture device
amixer $AMIXER_PARAMS -D $MIXER get $SCONTROL |
sed -n “s/ Capabilities:.cvolume./Capture/p”
}

volume() {
amixer $AMIXER_PARAMS -D $MIXER get $SCONTROL $(capability)
}

“`

保存更改并退出配置文件。

接下来,打开 I3blocks 配置文件:

“`
nano ~/.config/i3blocks/i3blocks.conf

“`

然后粘贴以下内容:

“`
[volume]
command=/home/$USER/.config/scripts/volume
LABEL=♪

LABEL=VOL

interval=1
signal=10

STEP=5%

MIXER=default

SCONTROL=[determined automatically]

NATURAL_MAPPING=0

“`

保存更改并重新加载 i3,从现在开始,音量快捷键将起作用,并且指示器将按预期工作!

? 如果遇到音频/视频不工作等问题,请使用此命令,它应该解决该问题:

“`
systemctl –user disable –now pipewire.{socket,service} && systemctl –user mask pipewire.socket

“`

添加 Spotify 块

我将使用 firatakandere 的脚本来添加此功能。在继续之前,你可以先查看一下该脚本。

首先,创建并打开一个用于 Spotify 块的新文件:

“`
nano ~/.config/scripts/spotify.py

“`

然后粘贴以下内容:

“`

!/usr/bin/python

import dbus
import os
import sys

try:
bus = dbus.SessionBus()
spotify = bus.get_object(“org.mpris.MediaPlayer2.spotify”, “/org/mpris/MediaPlayer2”)

if os.environ.get('BLOCK_BUTTON'):
    control_iface = dbus.Interface(spotify, 'org.mpris.MediaPlayer2.Player')
    if (os.environ['BLOCK_BUTTON'] == '1'):
        control_iface.Previous()
    elif (os.environ['BLOCK_BUTTON'] == '2'):
        control_iface.PlayPause()
    elif (os.environ['BLOCK_BUTTON'] == '3'):
        control_iface.Next()

spotify_iface = dbus.Interface(spotify, 'org.freedesktop.DBus.Properties')
props = spotify_iface.Get('org.mpris.MediaPlayer2.Player', 'Metadata')

if (sys.version_info > (3, 0)):
    print(str(props['xesam:artist'][0]) + " - " + str(props['xesam:title']))
else:
    print(props['xesam:artist'][0] + " - " + props['xesam:title']).encode('utf-8')
exit

except dbus.exceptions.DBusException:
exit

“`

完成后,使用以下命令使其可执行:

“`
sudo chmod +x ~/.config/scripts/spotify.py

“`

现在,打开 I3blocks 配置文件:

“`
nano ~/.config/i3blocks/i3blocks.conf

“`

然后粘贴以下内容(建议将其粘贴到块的开头):

“`
[spotify]
label=
command=/home/$USER/.config/scripts/spotify.py
color=#81b71a
interval=5

“`

保存更改,退出配置文件,并重新启动 i3。

添加了我提到的块后,状态栏将如下所示:

在 i3 窗口管理器中定制 i3blocks

你可以查看我的主屏幕,其中包含这些块(点击下方的图片查看)。

在 i3 窗口管理器中定制 i3blocks

? 如果你对那些默认块(文档和问候语)的位置感到困惑,我用了几个注释将它们禁用以实现所示的外观!

在 Linux 中使用 i3gaps

如果你想在窗口之间添加间隙,可以使用 i3gaps。在颜色方案之后,i3gaps 是这个指南中最关键的元素。

要使用间隙,你必须对 i3 配置文件进行一些更改。

打开 i3 配置文件:

“`
nano ~/.config/i3/config

“`

转到文件的末尾,并粘贴以下内容:

“`

default gaps

gaps inner 15
gaps outer 5

gaps

set $modegaps Gaps: (o)uter, (i)nner, (h)orizontal, (v)ertical, (t)op, (r)ight, (b)ottom, (l)eft
set $mode
gapsouter Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapsinner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapshoriz Horizontal Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapsverti Vertical Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapstop Top Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapsright Right Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapsbottom Bottom Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode
gapsleft Left Gaps: +|-|0 (local), Shift + +|-|0 (global)
bindsym $mod+Shift+g mode “$mode
gaps”

mode “$modegaps” {
bindsym o mode “$mode
gapsouter”
bindsym i mode “$mode
gapsinner”
bindsym h mode “$mode
gapshoriz”
bindsym v mode “$mode
gapsverti”
bindsym t mode “$mode
gapstop”
bindsym r mode “$mode
gapsright”
bindsym b mode “$mode
gapsbottom”
bindsym l mode “$mode
gapsleft”
bindsym Return mode “$mode
gaps”
bindsym Escape mode “default”
}

mode “$modegapsouter” {
bindsym plus gaps outer current plus 5
bindsym minus gaps outer current minus 5
bindsym 0 gaps outer current set 0

    bindsym Shift+plus  gaps outer all plus 5
    bindsym Shift+minus gaps outer all minus 5
    bindsym Shift+0     gaps outer all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapsinner” {
bindsym plus gaps inner current plus 5
bindsym minus gaps inner current minus 5
bindsym 0 gaps inner current set 0

    bindsym Shift+plus  gaps inner all plus 5
    bindsym Shift+minus gaps inner all minus 5
    bindsym Shift+0     gaps inner all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapshoriz” {
bindsym plus gaps horizontal current plus 5
bindsym minus gaps horizontal current minus 5
bindsym 0 gaps horizontal current set 0

    bindsym Shift+plus  gaps horizontal all plus 5
    bindsym Shift+minus gaps horizontal all minus 5
    bindsym Shift+0     gaps horizontal all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapsverti” {
bindsym plus gaps vertical current plus 5
bindsym minus gaps vertical current minus 5
bindsym 0 gaps vertical current set 0

    bindsym Shift+plus  gaps vertical all plus 5
    bindsym Shift+minus gaps vertical all minus 5
    bindsym Shift+0     gaps vertical all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapstop” {
bindsym plus gaps top current plus 5
bindsym minus gaps top current minus 5
bindsym 0 gaps top current set 0

    bindsym Shift+plus  gaps top all plus 5
    bindsym Shift+minus gaps top all minus 5
    bindsym Shift+0     gaps top all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapsright” {
bindsym plus gaps right current plus 5
bindsym minus gaps right current minus 5
bindsym 0 gaps right current set 0

    bindsym Shift+plus  gaps right all plus 5
    bindsym Shift+minus gaps right all minus 5
    bindsym Shift+0     gaps right all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapsbottom” {
bindsym plus gaps bottom current plus 5
bindsym minus gaps bottom current minus 5
bindsym 0 gaps bottom current set 0

    bindsym Shift+plus  gaps bottom all plus 5
    bindsym Shift+minus gaps bottom all minus 5
    bindsym Shift+0     gaps bottom all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}
mode “$modegapsleft” {
bindsym plus gaps left current plus 5
bindsym minus gaps left current minus 5
bindsym 0 gaps left current set 0

    bindsym Shift+plus  gaps left all plus 5
    bindsym Shift+minus gaps left all minus 5
    bindsym Shift+0     gaps left all set 0

    bindsym Return mode "$mode_gaps"
    bindsym Escape mode "default"

}

“`

保存更改并退出配置文件。

使用 Mod + Shift + r 重新加载 i3,并会看到窗口之间的间隙:

在 i3 窗口管理器中使用 i3gaps

但是,如果你想调整间隙的大小怎么办?这非常简单,只需要简单的步骤即可完成:

  • 按下 Mod + Shift + g 进入间隙模式
  • 使用给定的选项选择要更改的内容
  • 使用 +- 增加/减小间隙
  • 完成后,按 Esc 键退出间隙模式

就是这样!

我们忘记自定义终端了吗?

不用担心;你可以 切换到 Zsh,这是一个不同的 shell,使终端看起来与众不同,或者探索一些鲜为人知的 Linux Shell

无论如何,你都可以 自定义现有终端,或选择不同的 终端模拟器

我希望你不再畏难如何美化系统! ?

如果你有任何建议或想展示你的配置,请在评论部分留言。

(题图:MJ/2874542d-6a8f-4b27-8e65-477389a0dcca)


via: https://itsfoss.com/i3-customization/

作者:Sagar Sharma 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

主题测试文章,只做测试使用。发布者:eason,转转请注明出处:https://aicodev.cn/2023/06/30/i3-%e7%aa%97%e5%8f%a3%e7%ae%a1%e7%90%86%e5%99%a8%e7%bb%88%e6%9e%81%e5%ae%9a%e5%88%b6%e6%8c%87%e5%8d%97/

Like (0)
eason的头像eason
Previous 2023年6月30日
Next 2023年7月1日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信