Qtile - Arch Linux 中文维基

跳至內容

# Qtile

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Qtile，最近一次同步於 2024-05-16，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- 平鋪式窗口管理器比較
- 窗口管理器

摘自 Qtile web site：

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

## 安裝

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

- qtile包 最新正式版
- qtile-gitAUR 最新開發版

為了讓 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 寫成的類似窗口管理程序

分類：​

- 平鋪式窗口管理器

Qtile
新增話題