摘自 Qtile web site:
- Qtile 是一個全功能、可輕易修改(駭)的平鋪式窗口管理程序。 Qtile 簡單、輕巧、擴展性高。 撰寫自訂的窗口堆疊模式、插件以及指令是輕而易舉的事情。程序以及設定均是以 Python 寫成,意味著:您可以使用語言所提供的所有能力及彈性來滿足您對窗口管理的需求。
安裝
從下列軟體包中選擇一個進行安裝:
為了讓 Qtile 作為一個 Wayland 混成器運行,你將需要安裝 python-pywlroots包。
啟動
Xorg
要讓 qtile 作為一個 X11 的窗口管理器啟動, 可用 xinit 執行 qtile start 來啟動.
Wayland
Qtile 同時也可作為一個 Wayland compositor 通過執行 qtile start -b wayland 來啟動.
關於 Qtile 的 wayland 端開發進度, 可以查看這個討論.
配置
根據配置查詢表(或者備選文檔),Qtile 會在路徑 ~/.config/qtile/config.py 提供一個默認的配置文件,它將會在用戶沒有進行自定義的情況下使用。
默認配置設置了 Super+Enter 作為打開終端的快捷鍵,(終端通過 hardcoded list 選擇), 快捷鍵 Super+Ctrl+q 可以退出 Qile.
最新的配置文件可以在 git 倉庫 libqtile/resources/default_config.py 下載。
一些更完整的配置文件示例可以在 qtile-examples 倉庫找到。
整個 Qtile 的配置均是以python寫成:為了快速了解 Python 語言可以閱讀這個教程。
在重新啟動 Qtile 之前,你可以用以下指令測試 config.py 文件是否有語法錯誤:
$ python -m py_compile ~/.config/qtile/config.py
若如果沒有其他輸出, 此設定文件應該便無重大問題.
組(Groups)
在 Qtile, 工作區(workspaces or views) 被稱為組(Groups)。他們可透過下列方式定義:
from libqtile.config import Group, Match
...
groups = [
Group("term"),
Group("irc"),
Group("web", match=Match(title=["Firefox"])), #表示标题含此关键字的程序均放置于此组别中
]
...
組規則(Group Rules)
下面的例子展示了如何根據屬性,如 title 和 wm_class,實現自動移動應用到工作區。如果想在 X 上做到這一點,你可能需要用到 xprop 。
from libqtile.config import Group, Match
...
def is_text_editor(window):
result = "neovim" in (window.name or "").lower()
return result
def is_terminal(window):
result = "kitty" in (window.name or "").lower() and not is_text_editor(window)
return result
...
groups = [
Group(name=str(idx), **group)
for idx, group in enumerate(
[
{
"label": "term",
# restrict layouts since tiling is handled by kitty
"layouts": [layout.Max()],
"matches": [
Match(func=is_terminal),
],
},
{
"label": "browser",
"matches": [
Match(role="browser"),
],
},
{
"label": "music",
"matches": [
Match(title="YouTube Music"),
],
},
{"label": "text editor", "matches": [Match(func=is_text_editor)]},
{"label": "other"},
],
start=1,
)
]
...
按鍵組合(Keys)
你可以配置你的快捷鍵通過 Key 這個類。
底下是一個按鍵範例, 按下 Alt+Shift+q 來退出窗口管理器
from libqtile.config import Key
from libqtile.command import lazy
...
keys = [
Key(
["mod1", "shift"], "q",
lazy.shutdown())
]
...
可執行 Xmodmap 來得知系統按鍵與 modX 之間的對應關係.
聲音控制(Sound)
你可以通過添加快捷鍵來方便地控制聲音以及狀態.
將用戶添加進 audio用戶組並且使用 alsamixer 命令行界面, 該程序包含在 alsa-utils包 包內.
keys= [
...
# Sound
Key([], "XF86AudioMute", lazy.spawn("amixer -q set Master toggle")),
Key([], "XF86AudioLowerVolume", lazy.spawn("amixer -c 0 sset Master 1- unmute")),
Key([], "XF86AudioRaiseVolume", lazy.spawn("amixer -c 0 sset Master 1+ unmute"))
]
語言(Language)
你可以使用 setxkbmap 來添加快捷鍵以便輕鬆切換不同語言的鍵盤布局:
keys= [
...
# Language
Key([mod], "F1",
lazy.spawn("setxkbmap us"),
desc= "Change to US layout"),
Key([mod],"F2",
lazy.spawn("setxkbmap gr"),
desc= "Change to Greek layout"),
]
顯示器(Screens)
為你的每一台顯示器配置 Screen 類, 而 任務欄(bar) 則配置於 Screen 類中.
from libqtile.config import Screen
from libqtile import bar, widget
import os.path
...
screens = [
Screen( # 一部显示器
wallpaper=os.path.join(os.path.expanduser("~"), "Photos/Wallpapers/arch_fill.png"),
wallpaper_mode="fill",
bottom=bar.Bar([ # 将任务栏(bar)放置于屏幕底部
widget.GroupBox(), # 插件,用于显示组的状态
widget.WindowName() # 插件,用于显示当前窗口名称
], 30))
]
...
任務欄和小部件(Bars and Widgets)
若想新增一個小部件, 只需要像上面任務欄設定那樣調用即可 (如 WindowName 插件). 例如, 要新增一個顯示電池狀態的小部件, 我們可使用 Battery:
from libqtile.config import Screen
from libqtile import bar, widget
...
screens = [
Screen(top=bar.Bar([
widget.GroupBox(), # 插件,用于显示组的状态
widget.Battery() # 插件,用于显示电池状态
], 30))
]
...
把Polybar作為主任務欄(Using Polybar as the main bar)
為了用 Polybar 代替默認任務欄,你需要刪除 screen 類的內容:
from libqtile.config import Screen
from libqtile import bar, widget
...
screens = [
Screen()
]
...
為了通過 Qtile 重新啟動 Polybar ,在#Keys 類的重啟快捷鍵配置處添加通過 spawn 命令的 Polybar 啟動代碼:
...
keys = [
Key([mod, "control"], "r", lazy.reload_config(), lazy.spawn("~/.config/polybar/launch.sh")),
]
...
啟動
你可以使用鉤(hooks) 來啟動程序, 特別是 startup.
startup 鉤是用於 Qtile 初始化事件的鉤, 能夠在 Qtile 初始化的時連帶啟動其他的程序(一次性指令或程序).
要查看所有可用的鉤, 可參考這個文檔
下面是只啟動一次程序的示例:
import os
import subprocess
from libqtile import hook
@hook.subscribe.startup_once
def autostart():
home = os.path.expanduser('~')
subprocess.Popen([home + '/.config/qtile/autostart.sh'])
調試
有時候會因為插件的參數沒有完整, 或者設定之間有衝突情形發生, 模組未 import 等問題出現錯誤.
需要檢查出錯位置,可以以如下方式啟動一個虛擬的 Xorg 並進行測試:
echo "exec qtile start" > /tmp/.start_qtile; xinit /tmp/.start_qtile -- :2
Qtile 將會輸出日誌到 ~/.local/share/qtile/qtile.log 裡.
參閱
- Qtile 官方網站
- 官方文檔
- 平鋪式窗口管理器比較
- xinitrc
- tilenol - 受 Qtile 啟發,以 Python3 寫成的類似窗口管理程序