Window manager i3
Менеджер окон i3.
Содержание
1 Общая информация
- Тайловый менеджер окон.
- https://i3wm.org/
2 Репозиторий конфигурации
- Я сделал репозиторий со своей конфигурацией: https://github.com/yamadharma/config-i3
3 Файл конфигурации
- Файлы конфигурации просматриваются в следующем порядке:
$XDG_CONFIG_HOME/i3/config
(~/.config/i3/config
);~/.i3/config
;$XDG_CONFIG_DIRS/i3/config
(/etc/xdg/i3/config
);/etc/i3/config
.
- Начиная с версии 4.20, можно подключать другие файлы конфигурации из основного файла конфигурации i3.
- Примеры использования директивы
include
:1# Тильда преобразуется в домашний каталог пользователя 2include ~/.config/i3/assignments.conf 3 4# Переменные среды разыменовываются 5include $HOME/.config/i3/assignments.conf 6 7# Символы подстановки раскрываются 8include ~/.config/i3/config.d/*.conf 9 10# Можно выполнять команду 11include ~/.config/i3/`hostname`.conf 12 13# Каждый путь загружается только один раз 14include ~/.config/i3/config 15 16# Относительные пути интерпретируются относительно каталога конфигурационного файла 17include assignments.conf
- Примеры использования директивы
4 Навигация
4.1 Клавиша-модификатор
- В качестве модификатора обычно используется:
4.2 Основные комбинации клавиш
Mod
+Enter
: открыть терминал.
4.3 Перемещение фокуса
- Фокус можно перемещать как с помощью стрелок, так и с помощью буквенных клавиш, как в редакторе vi.
Mod
+h
илиMod
+Left
: сдвиг фокуса влево.Mod
+j
илиMod
+Down
: сдвиг фокуса вниз.Mod
+k
илиMod
+Up
: сдвиг фокуса вверх.Mod
+l
илиMod
+Right
: сдвиг фокуса вправо.
- Конфигурация выглядит следующим образом:
1## Home row direction keys, like vim 2set $left h 3set $down j 4set $up k 5set $right l 6## Move your focus around 7bindsym $mod+$left focus left 8bindsym $mod+$down focus down 9bindsym $mod+$up focus up 10bindsym $mod+$right focus right 11## Or use $mod+[up|down|left|right] 12bindsym $mod+Left focus left 13bindsym $mod+Down focus down 14bindsym $mod+Up focus up 15bindsym $mod+Right focus right
- Впрочем, следует заметить, что также могут использоваться и другие соглашения:
j
: влево;k
: вниз;l
: вверх;;
: вправо.
- Поскольку в данном менеджере окон поддерживаются контейнеры, то можно переключить фокус на родительский контейнер:
Mod
+a
: переключить фокус на родительский контейнер.- Конфигурация:
Mod
+Space
: переключить режим фокуса.
4.4 Перемещение окон
- Делается аналогично перемещению фокуса, но с добавлением модификатора
Shift
:Mod
+Shift
+h
илиMod
+Shift
+Left
: перемещение влево;Mod
+Shift
+j
илиMod
+Shift
+Down
: перемещение вниз;Mod
+Shift
+k
илиMod
+Shift
+Up
: перемещение вверх;Mod
+Shift
+l
илиMod
+Shift
+Right
: перемещение вправо.
- Конфигурация выглядит следующим образом:
1## Move the focused window with the same, but add Shift 2bindsym $mod+Shift+$left move left 3bindsym $mod+Shift+$down move down 4bindsym $mod+Shift+$up move up 5bindsym $mod+Shift+$right move right 6## Ditto, with arrow keys 7bindsym $mod+Shift+Left move left 8bindsym $mod+Shift+Down move down 9bindsym $mod+Shift+Up move up 10bindsym $mod+Shift+Right move right
4.5 Modifying windows
Mod
+ f toggle fullscreenMod
+ v split a window verticallyMod
+ h split a window horizontallyMod
+ r resize mode
4.6 Структура расположения контейнеров
- Поддерживаются следующие расположения контейнеров:
Mod
+e
: переключение разделённого расположения (split layout);Mod
+s
: стековое размещение (stacking layout);Mod
+w
: размещение с табами (tabbed layout).
- Конфигурация:
- Для раскладки по умолчанию я использую табы:
4.7 Floating
Mod
+ Shift + Space toggle floatingMod
+ Left click drag floating
4.8 Рабочие области (workspaces)
- Сконфигурим рабочие области:
Mod
+0
–9
: переключиться на соответствующую рабочую область:1## Switch to workspace 2bindsym $mod+1 workspace $ws1 3bindsym $mod+2 workspace $ws2 4bindsym $mod+3 workspace $ws3 5bindsym $mod+4 workspace $ws4 6bindsym $mod+5 workspace $ws5 7bindsym $mod+6 workspace $ws6 8bindsym $mod+7 workspace $ws7 9bindsym $mod+8 workspace $ws8 10bindsym $mod+9 workspace $ws9 11bindsym $mod+0 workspace $ws10
Mod
+Shift
+0
–9
: перенести окно на соответствующую рабочую область:1## Move focused container to workspace 2bindsym $mod+Shift+1 move container to workspace $ws1 3bindsym $mod+Shift+2 move container to workspace $ws2 4bindsym $mod+Shift+3 move container to workspace $ws3 5bindsym $mod+Shift+4 move container to workspace $ws4 6bindsym $mod+Shift+5 move container to workspace $ws5 7bindsym $mod+Shift+6 move container to workspace $ws6 8bindsym $mod+Shift+7 move container to workspace $ws7 9bindsym $mod+Shift+8 move container to workspace $ws8 10bindsym $mod+Shift+9 move container to workspace $ws9 11bindsym $mod+Shift+0 move container to workspace $ws10
4.9 Opening applications / Closing windows
Mod
+ d open application launcher (dmenu)Mod
+ Shift + q kill a window
4.10 Выход/Перезапуск
Mod
+Shift
+c
: перечитать конфигурационный файл.Mod
+Shift
+r
: перестартовать i3, сохранив сессию.Mod
+Shift
+e
: выход из i3.
5 Настройка
5.1 Терминал
В качестве терминала я использую kitty.
Конфигурация запуска терминала:
- В этом случае запускается одно окно терминала.
Для работы я использую специальную настройку сессии терминала. Я её запускаю при входе в сессию. Для этого я приспособил комбинацию
Mod
+Shift
+Enter
:1bindsym $mod+Shift+Return exec kitty --session ~/.config/kitty/startup
5.2 Управление окном с помощью мышки
Можно управлять окнами с помощью мышки.
Привязка осуществляется следующей командой:
1bindsym [--release] [--border] [--whole-window] [--exclude-titlebar] [<Modifiers>+]button<n> command
- По умолчанию привязка запускается только при нажатии на строку заголовка окна.
- Если указан флаг
--release
, он запустится, когда кнопка мыши будет отпущена. - Если указан флаг
--whole-window
, то привязка также будет выполняться при щелчке по любой части окна, за исключением границы. - Чтобы привязка выполнялась при щелчке границы, нужно указать флаг
--border
. - Если задан флаг
--exclude-titlebar
, заголовок не будет учитываться для привязки клавиш.
Примеры.
5.3 Строка статуса
5.3.1 i3bar
- Отрисовку панели осуществляет утилита
i3bar
. - Отображается вверху или внизу экрана.
- Содержит:
- область с кнопками переключения рабочих областей i3;
- системную строку, генерируемую при помощи
i3status
или аналогов; - системный трей с иконками программ.
- В конфигурационном файле задаётся следующим образом (https://i3wm.org/docs/userguide.html#_configuring_i3bar):
Поддержка иконок в i3bar
- В
i3bar
можно использовать шрифты иконок (см. Моноширинные шрифты). - Наиболее распространённым является шрифт Font Awesome.
- Установка:
- Gentoo
1emerge media-fonts/fontawesome
- Gentoo
- Для вставки шрифта в файл можно использовать список кодов для иконок https://fontawesome.com/cheatsheet.
- Шрифт лучше явно обозначить в конфигурации:
- Для набора символа по его коду следует использовать конфигурации клавиш. Например, для набора символа с кодом
0xf004
, требуется набрать:- приложения на основе GTK:
Ctrl
+Shift
+u
,f004
,Enter
; - emacs:
Ctrl
+x
,8
,Enter
,f004
,Enter
; - vim:
Ctrl
+v
,uf004
; - urxvt: удерживая
Ctrl
+Shift
, наберитеf004
.
- приложения на основе GTK:
- В
i3status
- Использовано https://igancev.ru/2020-05-11-configuring-i3status-in-i3wm.
i3status
генерирует строку состояния дляi3bar
.- Содержит встроенные модули:
- IPv6 — получает и выводит IPv6 адрес.
- Disk — отображает информацию о занятом и свободном месте в файловой системе.
- Run-watch — мониторинг определённого процесса в системе.
- Path-exists — проверяет на существование путь в файловой системе.
- Wireless — позволяет выводить подключения к WIFI сети, уровень сигнала, имя точки доступа.
- Ethernet — предоставляет IP адрес и скорость соединения сетевого интерфейса.
- Battery — показ уровня заряда батареи.
- CPU-Temperature — показ температуры процессора.
- CPU Usage — использование процессора в процентах.
- Memory — использование оперативной памяти.
- Load — среднее значение загрузки системы за 1, 5 и 15 минут (Load Overage).
- Time — время в текущей временной зоне.
- TzTime — время в заданной временной зоне.
- DDate — дата.
- Volume — управление громкостью звука.
- File Contents — вывод содержимого указанного файла.
- Модули в строке можно переиспользовать по нескольку раз, управляя порядком вывода.
- Конфигурацию условно можно разделить на 3 части:
- блок
general
— содержит общие параметры; - переменная
order
— в неё записывается порядок вывода интересующих модулей; - блоки конфигурации модулей — непосредственно настройки самих блоков с метриками.
- блок
- В конфигурации i3bar задаётся конфигурационный файл для i3status:
- Структура информационной панели задаётся в конфигурационном файле:
1### -*- mode: conf-unix; -*- 2## ~/.config/i3/i3status/config 3 4general { 5 colors = true # включение/выключение поддержки цветов true/false 6 interval = 1 # интервал обновления строки статуса, в секундах 7 output_format = "i3bar" # формат вывода, устанавливаем i3bar (JSON) 8} 9 10# порядок вывода модулей 11order += "run_watch openvpn" 12order += "run_watch openconnect" 13order += "volume master" 14order += "wireless _first_" 15order += "battery all" 16order += "disk /" 17order += "memory" 18order += "cpu_usage" 19order += "cpu_temperature 0" 20order += "tztime local" 21 22# отслеживание процесса openvpn 23# служит как индикатор работы openvpn клиента 24# при запуске openvpn необходимо 25# указывать параметр --writepid /var/run/openvpn.pid 26run_watch openvpn { 27 pidfile = "/var/run/openvpn.pid" 28 format = " openvpn" 29 # если пареметр format_down оставить пустым, 30 # то при неактивном процессе блок будет отсутствовать 31 format_down="" 32} 33 34# аналогичный блок индикатор openconnect vpn клиента 35# требуется запуск клиента с параметром --pid-file=/var/run/openconnect.pid 36run_watch openconnect { 37 pidfile = "/var/run/openconnect.pid" 38 format = " openconnect vpn" 39 format_down="" 40} 41 42# управление громкостью звука 43volume master { 44 format = " %volume" # шаблон громкости в активном состоянии 45 format_muted = " %volume" # шаблон громкости в состоянии muted (без звука) 46 device = "default" 47 mixer = "Master" 48 mixer_idx = 0 49} 50 51# индикатор WIFI 52wireless _first_ { 53 # шаблон вывода, можно дополнить 54 # наименованием подключения %essid 55 # и ip адресом %ip 56 format_up = "%quality %frequency" 57 format_down = "" 58} 59 60# состояние заряда батареи 61battery all { 62 # шаблон вывода, можно дополнить 63 # оставшимся временем работы %emptytime 64 # энергопотреблением %consumption в ваттах 65 format = "%status %percentage" 66 67 # true - показ процента заряда от 0 до 100 68 # false - показ процента заряда от 0 до n, с учетом 69 # изношенности аккумулятора 70 last_full_capacity = true 71 format_down = "" 72 status_chr = "" # статус подзарядки 73 status_bat = "" # статус в режиме работы от батареи 74 status_unk = "? UNK" # неизвестный статус 75 status_full = "" # статус полного заряда 76 path = "/sys/class/power_supply/BAT%d/uevent" 77 78 # нижний порог заряда, после которого блок 79 # будет окрашен в "color_bad" (по умолчанию красный) 80 # подробнее в man i3status 81 low_threshold = 10 82} 83 84# отслеживаемый накопитель 85disk "/" { 86 # доступные переменные: 87 # %used, %percentage_used - занятое пространство 88 # %free, %percentage_free - свободное пространство 89 # %avail, %percentage_avail - доступное пространство 90 # %total - всего 91 format = " %avail" 92 93 # будет окрашен в "color_bad" (по умолчанию красный) 94 # при достижении нижнего порога менее 10GB доступного пространства 95 low_threshold = "10" 96 threshold_type = "gbytes_avail" 97 format_below_threshold = " Warning: %avail" 98} 99 100# миниторинг оперативной памяти 101memory { 102 # доступные переменные: 103 # %total, percentage_total 104 # %used, percentage_used 105 # %free, percentage_free 106 # %available, percentage_available 107 # %shared, percentage_shared 108 format = " %used" 109 110 # порог, при котором вывод окрасится в 111 # желтый (degraded) или красный (critical) 112 # а формат вывода изменится на format_degraded 113 threshold_degraded = "1G" 114 threshold_critical = "200M" 115 format_degraded = "MEMORY < %available" 116} 117 118# температура процессора 119cpu_temperature 0 { 120 format = " %degrees" 121 122 # верхний порог температуры, при достижении которого 123 # вывод окрасится красным, 124 # и формат изменится на format_above_threshold 125 max_threshold = "80" 126 format_above_threshold = " %degrees" 127 path = "/sys/class/thermal/thermal_zone0/temp" 128} 129 130# использование центрального процессора 131cpu_usage { 132 # %usage - процентное использование ЦП 133 # %cpu<N> - начиная с %cpu0 и далее показывает использование ядер 134 format = " %usage" 135 136 # доступны параметры: 137 # degraded_threshold, окрас в желтый, по умолчанию 90 138 # max_threshold, окрас в красный, по умолчанию 95 139 # и кастомные форматы для них 140 # format_above_degraded_threshold и format_above_threshold 141} 142 143# вывод даты и времени по заданному формату 144tztime local { 145 format = " %d %b %Y %H:%M:%S" 146}
5.3.2 py3status
py3status
— это расширяемая оболочка дляi3status
, написанная на python.- Сайт: https://py3status.readthedocs.io/.
- Репозиторий: https://github.com/ultrabug/py3status.
- Можно управлять
i3bar
:- используя один из доступных модулей, поставляемых с
py3status
; - группировать несколько модулей и автоматически или вручную циклически отображать их отображение;
- писать свои собственные модули и отображать их вывод на панели;
- обрабатывать события кликов на
i3bar
.
- используя один из доступных модулей, поставляемых с
- Отображается вверху или внизу экрана.
- Содержит:
- область с кнопками переключения рабочих областей i3;
- системную строку;
- системный трей с иконками программ.
Запуск py3status
- Запускается вместо
i3bar
: - Использует конфигурационный файл от
i3status
или собственную конфигурацию. - Порядок поиска конфигурационного файла:
$XDG_CONFIG_HOME/py3status/config
;$XDG_CONFIG_HOME/i3status/config
;$XDG_CONFIG_HOME/i3/i3status.conf
;~/.i3status.conf
;~/.i3/i3status.conf
;$XDG_CONFIG_DIRS/i3status/config
;/etc/i3status.conf
.
- Запускается вместо
5.3.3 polybar
Отдельное приложение для строки статуса.
Применяется для замены i3bar.
Темы для polybar: https://github.com/adi1090x/polybar-themes
Одним из побудительных мотивов установки polybar может быть то, что здесь можно без проблем настроить индикатор раскладки клавиатуры.
Установка
- Gentoo:
1USE="i3wm" emerge x11-misc/polybar
- Gentoo:
Конфигурационный файл:
- стандартное расположение:
~/.config/polybar/config
($XDG_CONFIG_HOME/polybar/config
); - использую для локальных настроек только для i3:
~/.config/i3/polybar/config
.
- стандартное расположение:
Скрипт запуска
- Создадим скрипт запуска
polybar
.1#!/bin/bash 2# ~/.config/i3/polybar/launch.sh 3 4# Terminate already running bar instances 5killall -q polybar 6# If all your bars have ipc enabled, you can also use 7# polybar-msg cmd quit 8 9# Wait until the processes have been shut down 10while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done 11 12# Launch Polybar, using config location ~/.config/i3/polybar/config 13polybar --config=~/.config/i3/polybar/config i3 & 14 15echo "Polybar launched..."
- Установим права на исполнение:
1chmod +x ~/.config/i3/polybar/launch.sh
- Добавим вызов
polybar
в файл конфигурации i3. Конфигурацию для i3bar следует закомментировать.
- Создадим скрипт запуска
5.4 Запуск приложений
- По умолчанию используется
dmenu
. - Можно заменить на
rofi
(см. Запуск приложений. Rofi).
5.4.1 rofi
- Используется для запуска приложений, переключения окон.
- https://github.com/davatorium/rofi
- Конфигурация по умолчанию находится в
~/.config/rofi/config
. - Для выбора темы можно использовать команду:
1rofi-theme-selector
- Для запуска программ используется несколько мод:
run
: запускать приложения из пути ($PATH
) с возможностью запуска в терминале.drun
: запускать приложения на основе desctop-файлов (по стандарту XDG).window
: переключение между окнами в оконном менеджере, совместимом со спецификацией EWMH.ssh
: подключение к удаленному хосту черезssh
.file-browser
: базовый файловый броузер для открытия файлов.keys
: список внутренних привязок клавиш.script
: использование простых скриптов.combi
: объединяет несколько мод в одну.
- Использование запятых в файле настроек i3 может привести к проблемам. Лучше использовать файл настроек rofi или замените запятые символом
#
, например, заменить строкуна1rofi -combi-modi window,drun,ssh
1rofi -combi-modi window#drun#ssh
- Возможная конфигурация в командной строке команды
rofi
: - Конфигурация с помощью конфигурационного файла (поместим его в
~/.config/i3/rofi/config
).
5.5 Блокировка экрана
Для отключения экрана можно использовать DPMS:
1exec --no-startup-id xset dpms 1800
- Отключается через 30 минут.
5.5.1 Блокировщик экрана i3lock
В качестве блокировщика экрана используем
i3lock
.- Установка
- Gentoo
1emerge x11-misc/i3lock
- Gentoo
- Установка
Использование в конфигурационном файле:
1set $Locker i3lock --color=000000 && sleep 1
sleep 1
добавляет небольшую задержку, чтобы предотвратить возможное состояние гонки.
Для блокировки экрана после заданного периода времени можно использовать
xautolock
илиxss-lock
.Использование
xautolock
.Установка
- Gentoo
1emerge x11-misc/xautolock
- Gentoo
Использование в конфигурационном файле:
1exec --no-startup-id xautolock -time 10 -locker "$Locker"
- Блокирует через 10 минут.
Использование
xss-lock
.Установка
- Gentoo
1emerge x11-misc/xss-lock
- Gentoo
Использование в конфигурационном файле:
1exec --no-startup-id xss-lock -- "$Locker"
5.5.2 Блокировщик экрана i3lock-color
- Репозиторий: https://github.com/Raymo111/i3lock-color
Дополнительные возможности в i3lock-color
- Дополнительное управление цветом элементов.
- Размытие текущего экрана и использование его в качестве фона блокировки.
- Отображение часов в индикаторе.
- Обновление по таймеру, а не при каждом нажатии клавиши.
- Отображение раскладки клавиатуры.
Установка
- Gentoo
- Порт находится в оверлее
guru
:1emerge x11-misc/i3lock-color
- Порт находится в оверлее
- Gentoo
6 Приложения
6.1 Снимки экрана
Для скриншотов можно использовать scrot.
- Gentoo
1emerge media-gfx/scrot
- Gentoo
Добавим в конфигурационный файл:
1## Screenshot 2 3## Screenshot active display 4bindsym --release Print exec --no-startup-id scrot '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null' 5 6## Screenshot current window 7bindsym --release $mod+Print exec --no-startup-id scrot -u '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null' 8 9## Screenshot selected region 10bindsym --release $mod+Shift+Print exec --no-startup-id scrot -s '%Y-%m-%d_%H-%M-%S_$wx$h.png' -e 'mv $f `xdg-user-dir PICTURES` 2>/dev/null'
- По клавише
PrtScr
делается скриншот. - По клавише
mod
+PrtScr
делается скриншот активного окна. - По клавише
mod
+Shift
+PrtScr
предлагается выделить область экрана, скриншот которой следует сделать. - Скриншоты переносятся в каталог $XDG_PICTURES_DIR (обычно
~/Pictures
или~/Изображения
) (см. XDG. Пользовательские каталоги).
- По клавише
7 Совместимость приложений
7.1 Java
7.1.1 Серое окно, приложения не меняют размер с помощью WM, меню сразу закрываются
- В стандартных тулкитах для Java жестко зашит список оконных менеджеров.
- Следует установить переменную окружения:
1export _JAVA_AWT_WM_NONREPARENTING=1
7.1.2 Меню в приложениях плавает отдельно, им невозможно пользоваться
- В выпусках Java до версии 9 GTK интерфейс ориентирован на GTK2, в последующих версиях на GTK3.
- GTK LookAndFeel может работать с GTK версий 2, 2.2 и 3.
- По умолчанию используется GTK3.
- Следует явно задать более старую версию:
1export JAVA_TOOL_OPTIONS='-Djdk.gtk.version=2.2'