在這份超詳細的指南中了解如何通過 i3 視窗管理器來自定義系統的外觀和體驗。
你可能在網上(尤其是通過
r/unixporn
子區)看到過很多炫酷的截圖,使用者可以根據個人喜好自定義他們的桌面并與大家分享。
這是因為 Linux 允許你自定義桌面體驗的方方面面。
而結果?就是比任何 Mac 或 Windows 系統更具視覺和感覺效果。
來看一下這個 😌
看起來像一個 Linux Mint 系統嗎?😲
但是你怎樣才能做到這樣呢?自定義你的 Linux 桌面外觀是很困難的。
答案就在于 視窗管理器。如果你能配置好視窗管理器,你就能自定義外觀。
在本指南中,我将引導你完成使用 i3 視窗管理器進行基本配置。它是Linux 上最好的視窗管理器之一。
💡 “加料Rice” 是一個常用的詞彙,用來指代在桌面上進行視覺改進和自定義。引用自/r/unixporn(LCTT 譯注:“加料”一詞來自于購買便宜的亞洲汽車,并給它們安裝售後零件,以讓它更好地類似于賽車。)
在遵循本指南之前,你需要了解以下内容:
- 在本指南中,我将使用 Arch Linux來示範步驟,但你可以使用你喜歡的任何發行版,結果也是一樣的。
- 請記住,本指南是 對 i3 進行“加料”定制的基礎。
在按照本指南進行操作後,你應該得到以下預期結果:
📥 為了節省你的時間,我已經在 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:
當首次登入 i3 時,它會詢問你是否要建立一個 i3 配置檔案。
按下Enter鍵建立一個新的 i3 配置檔案:
接下來,它會詢問你選擇
Win
或
Alt
鍵哪個作為修飾鍵(
mod
)。
我建議你選擇
Win
(或者
Super
鍵),因為大多數使用者已經習慣将其用作快捷鍵:
現在你可以開始使用 i3 視窗管理器了。
但在我們開始定制之前,讓我先介紹一下你如何使用 i3。
i3 視窗管理器的按鍵綁定
讓我們從基礎知識開始。
視窗管理器的基本功能是将多個視窗水準和垂直地組合在一起,這樣你就可以同時監視多個程序。
結果是這樣的:
你可以使用以下按鍵綁定執行更多操作:
按鍵綁定 | 描述 |
---|---|
| 打開終端。 |
| 切換到左側視窗。 |
| 切換到右側視窗。 |
| 切換到上方視窗。 |
| 切換到下方視窗。 |
| 将視窗移動到左側。 |
| 将視窗移動到右側。 |
| 将視窗移動到上方。 |
| 将視窗移動到下方。 |
| 将焦點視窗切換到全屏模式。 |
| 下一個視窗将垂直放置。 |
| 下一個視窗将水準放置。 |
| 啟用堆疊式視窗布局。 |
| 啟用頁籤式視窗布局。 |
| 啟用浮動視窗(針對焦點視窗)。 |
| 使用滑鼠拖動整個視窗。 |
| 切換到另一個工作區。 |
| 将視窗移動到另一個工作區。 |
| 打開應用程式啟動器(D 菜單)。 |
| 關閉焦點視窗。 |
| 重新加載 i3 配置檔案。 |
| 重新開機 i3 視窗管理器。 |
| 退出 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'
在我的情況下,顯示名稱是
Virtual-1
。
是以,如果我想将分辨率更改為
1920*1080
,我需要執行以下指令:
xrandr --output Virtual-1 --mode 1920x1080
但這隻是暫時生效。要使其永久生效,你需要在 i3 配置檔案中進行更改。
首先,打開配置檔案:
nano ~/.config/i3/config
通過按下
Alt + /
來在
nano
中跳到檔案末尾,并使用以下文法來永久更改顯示分辨率:
# 顯示分辨率
exec_always xrandr --output [顯示名稱] --mode [分辨率]
結果應該是這樣的:
完成後,儲存更改并退出 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
目錄中,是以我的指令如下:
儲存更改并退出
nano
文本編輯器。
為了使配置檔案的更改生效,使用
Mod + Shift + r
重新啟動 i3 視窗管理器。
我的效果如下:
自定義 i3 鎖屏界面
預設情況下,如果你想鎖定系統,你需要執行以下指令:
i3lock
鎖屏界面如下所示:
下面,我将向你展示:
- 如何建立自定義快捷方式以鎖定 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
作為鎖定螢幕的快捷鍵,你可以選擇任何你喜歡的快捷鍵。
最後的配置檔案将如下所示:
相當不錯,不是嗎?
在 i3 視窗管理器中更改主題和圖示
我知道你可能會想到這個問題。
你為什麼需要圖示呢?你并不僅僅使用視窗管理器來使用指令行工具。
有時候,使用圖形界面更加友善,比如使用檔案管理器。是以,在處理這些工具時,你希望界面看起來更好看?
是以,在本部分中,我将向你展示:
- 如何在 i3 中更改主題
- 如何在 i3 中更改圖示
讓我們從安裝主題開始。
在這裡,我将使用
materia-gtk-theme
和
papirus
圖示,但你可以使用任何你喜歡的主題和圖示。
在 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
,并在第一個結果上按Enter鍵。
在這裡,選擇你喜歡的主題。我這裡選擇
Materia-dark
。
選擇主題後,點選應用按鈕以應用更改:
同樣地,要更改圖示,選擇 “圖示主題Icon Theme”,選擇圖示主題,然後點選應用按鈕:
應用主題和圖示後,我的檔案管理器如下所示:
在 i3 視窗管理器中為工作區設定圖示
預設情況下,工作區僅由數字表示,這并不是你想要使用工作區的最理想方式。
是以,在本部分中,我将引導你如何使用合适的圖示更改工作區的名稱。
為了在配置檔案中使用圖示,首先你需要安裝名為
Awesome
的新字型:
對于基于 Arch 的發行版:
sudo pacman -S ttf-font-awesome
對于 Ubuntu/Debian 系統:
sudo apt install fonts-font-awesome
安裝完成後,打開 i3 配置檔案:
nano ~/.config/i3/config
在這個配置檔案中,找到工作區的部分,你将會看到為每個工作區給出的變量:
在這個部分,你需要用你想要的名稱替換給出的工作區數字。
我将把第一個工作區命名為 “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 中更改标題視窗和狀态欄的字型
首先,讓我們安裝新的字型(我将在這裡使用 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 視窗管理器中配置設定應用程式到工作區
在給工作區命名之後,你會想要将特定的軟體配置設定到相應的工作區中。
例如,如果我将第二個工作區命名為 “Firefox”,那麼我隻想在該工作區中使用 Firefox。
那麼要如何實作呢?
為了做到這一點,你需要找到每個要配置設定的應用程式的類名。
聽起來複雜?讓我告訴你如何做。
首先,将應用程式和終端并排打開。例如,在這個例子中,我将 Firefox 和終端并排打開:
現在,在終端中執行
xprop
指令,它會改變滑鼠指針的形狀:
xprop
接下來,将滑鼠懸停在應用程式上,并在應用程式視窗内的任何位置單擊,如圖所示:
類名将在以下行的最後一個字元串中找到:
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 視窗管理器中自定義狀态欄
預設情況下,狀态欄顯示各種資訊,但沒有圖示。
是以,在這個部分,我将展示如何從狀态欄中删除一些元素以及如何為它們添加圖示。
但是,在這裡,我将在
/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
}
最終的結果應該如下所示:
儲存更改并退出文本編輯器。
現在,讓我們從狀态欄中删除不必要的訓示器。
首先,打開 i3status 配置檔案:
nano .config/i3status/i3status.conf
在這裡,你可以将以
order
開頭的行注釋掉,這些行實際上是訓示器的變量。
例如,在這裡,我禁用了
ipv6
、
wireless _first_
、
battery all
和
load
這些對我來說不必要的訓示器:
#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 配置檔案:
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 配置檔案的
bar {...}
部分進行更改。
首先,打開配置檔案:
nano ~/.config/i3/config
在配置檔案中查找
bar {...}
部分。
找到該部分後,建立一個顔色部分,并為狀态欄定義顔色和類别,與你為視窗所做的相同:
bar {
status_command i3status -c /home/$USER/.config/i3status/i3status.conf
colors {
background $bgcolor
separator #191919
# border background text
focused_workspace $bgcolor $bgcolor $text
inactive_workspace $in-bgcolor $in-bgcolor $text
urgent_workspace $u-bgcolor $u-bgcolor $text
}
}
在這裡,我使用了
focused_workspace
、
inactive_workspace
和
urgent_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,字型将會被更改!
要使狀态欄透明,你可以使用現有十六進制代碼中的額外兩個數字來定義透明度。
如果你想要控制透明度,我建議你檢視 此指南,其中提供了從 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 {...}
中添加兩行代碼:
i3bar_command i3bar --transparency
tray_output none
請注意,使用
tray_output none
,它将不會在托盤中顯示任何圖示。如果你不希望出現這種行為,則可以跳過此行,隻添加第一行以實作透明度。
一旦完成,修改狀态欄的顔色方案,例如更改背景顔色、邊框和活動工作區的背景。
修改後,配置檔案應如下所示:
為了使你所做的更改生效,請重新啟動 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 配置檔案的路徑,如下所示:
完成後,使用
Mod + Shift + r
重新啟動 i3 視窗管理器,整個狀态欄都會被更改,并顯示如下:
不要擔心,你将很快使狀态欄比以前的 i3bar 更有價值和好看。
添加磁盤塊
如果你想要顯示磁盤剩餘空間,可以添加此塊。
在這裡,我将使用
nano
建立并打開用于磁盤塊的配置檔案。
nano ~/.config/scripts/disk
然後粘貼以下行:
#!/usr/bin/env sh
DIR="${DIR:-$BLOCK_INSTANCE}"
DIR="${DIR:-$HOME}"
ALERT_LOW="${ALERT_LOW:-$1}"
ALERT_LOW="${ALERT_LOW:-10}" # color will turn red under this value (default: 10%)
LOCAL_FLAG="-l"
if [ "$1" = "-n" ] || [ "$2" = "-n" ]; then
LOCAL_FLAG=""
fi
df -h -P $LOCAL_FLAG "$DIR" | awk -v label="$LABEL" -v alert_low=$ALERT_LOW '
/\/.*/ {
# 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
儲存更改并從文本編輯器中退出。
現在,将此檔案設定為可執行:
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:/ {
mem_total=$2
}
/^MemFree:/ {
mem_free=$2
}
/^Buffers:/ {
mem_free+=$2
}
/^Cached:/ {
mem_free+=$2
}
/^SwapTotal:/ {
swap_total=$2
}
/^SwapFree:/ {
swap_free=$2
}
END {
if (type == "swap") {
free=swap_free/1024/1024
used=(swap_total-swap_free)/1024/1024
total=swap_total/1024/1024
} else {
free=mem_free/1024/1024
used=(mem_total-mem_free)/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 create_argparse:
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 get_updates:
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 get_aur_yaourt_updates:
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 get_aur_yay_updates:
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 matching_updates(updates, watch_list):
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 = get_updates
if args.aur:
updates += get_aur_yaourt_updates
elif args.aur_yay:
updates += get_aur_yay_updates
update_count = len(updates)
if update_count > 0:
if update_count == 1:
info = str(update_count) + ' update available'
short_info = str(update_count) + ' update'
else:
info = str(update_count) + ' 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
NATURAL_MAPPING=${NATURAL_MAPPING:-0}
if [[ "$NATURAL_MAPPING" != "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。
添加了我提到的塊後,狀态欄将如下所示:
你可以檢視我的主螢幕,其中包含這些塊(點選下方的圖檔檢視)。
📋 如果你對那些預設塊(文檔和問候語)的位置感到困惑,我用了幾個注釋将它們禁用以實作所示的外觀!
在 Linux 中使用 i3gaps
如果你想在視窗之間添加間隙,可以使用
i3gaps
。在顔色方案之後,
i3gaps
是這個指南中最關鍵的元素。
要使用間隙,你必須對 i3 配置檔案進行一些更改。
打開 i3 配置檔案:
nano ~/.config/i3/config
轉到檔案的末尾,并粘貼以下内容:
# default gaps
gaps inner 15
gaps outer 5
# gaps
set $mode_gaps Gaps: (o)uter, (i)nner, (h)orizontal, (v)ertical, (t)op, (r)ight, (b)ottom, (l)eft
set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_horiz Horizontal Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_verti Vertical Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_top Top Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_right Right Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_bottom Bottom Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_left Left Gaps: +|-|0 (local), Shift + +|-|0 (global)
bindsym $mod+Shift+g mode "$mode_gaps"
mode "$mode_gaps" {
bindsym o mode "$mode_gaps_outer"
bindsym i mode "$mode_gaps_inner"
bindsym h mode "$mode_gaps_horiz"
bindsym v mode "$mode_gaps_verti"
bindsym t mode "$mode_gaps_top"
bindsym r mode "$mode_gaps_right"
bindsym b mode "$mode_gaps_bottom"
bindsym l mode "$mode_gaps_left"
bindsym Return mode "$mode_gaps"
bindsym Escape mode "default"
}
mode "$mode_gaps_outer" {
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 "$mode_gaps_inner" {
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 "$mode_gaps_horiz" {
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 "$mode_gaps_verti" {
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 "$mode_gaps_top" {
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 "$mode_gaps_right" {
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 "$mode_gaps_bottom" {
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 "$mode_gaps_left" {
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,并會看到視窗之間的間隙:
但是,如果你想調整間隙的大小怎麼辦?這非常簡單,隻需要簡單的步驟即可完成:
- 按下
進入間隙模式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中國榮譽推出