Qtile

出自 Arch Linux 中文维基

From Qtile web site:

Qtile 是一個全功能、可輕易修改(駭)的平鋪式窗口管理程序。 Qtile 簡單、輕巧、擴展性高。 撰寫自訂的窗口堆疊模式、插件以及指令是輕而易舉的事情。程序以及設定均是以 python 寫成,意味着:您可以使用語言所提供的所有能力及彈性來滿足您對窗口管理的需求。

安裝[編輯 | 編輯原始碼]

從下列軟件包中選擇一個進行安裝

為了讓 Qtile 作為一個 Wayland compositor 運行,你將需要安裝 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 裡.

參閱[編輯 | 編輯原始碼]