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
:# Тильда преобразуется в домашний каталог пользователя include ~/.config/i3/assignments.conf # Переменные среды разыменовываются include $HOME/.config/i3/assignments.conf # Символы подстановки раскрываются include ~/.config/i3/config.d/*.conf # Можно выполнять команду include ~/.config/i3/`hostname`.conf # Каждый путь загружается только один раз include ~/.config/i3/config # Относительные пути интерпретируются относительно каталога конфигурационного файла include assignments.conf
- Примеры использования директивы
4 Навигация
4.1 Клавиша-модификатор
- В качестве модификатора обычно используется:
Alt
:set $mod Mod1
Super
(Клавиша со значком Windows):set $mod Mod4
- Предпочитаю
Super
, чтобы не конфликтовать с Emacs.
4.2 Основные комбинации клавиш
Mod
+Enter
: открыть терминал.
4.3 Перемещение фокуса
- Фокус можно перемещать как с помощью стрелок, так и с помощью буквенных клавиш, как в редакторе vi.
Mod
+h
илиMod
+Left
: сдвиг фокуса влево.Mod
+j
илиMod
+Down
: сдвиг фокуса вниз.Mod
+k
илиMod
+Up
: сдвиг фокуса вверх.Mod
+l
илиMod
+Right
: сдвиг фокуса вправо.
- Конфигурация выглядит следующим образом:
## Home row direction keys, like vim set $left h set $down j set $up k set $right l ## Move your focus around bindsym $mod+$left focus left bindsym $mod+$down focus down bindsym $mod+$up focus up bindsym $mod+$right focus right ## Or use $mod+[up|down|left|right] bindsym $mod+Left focus left bindsym $mod+Down focus down bindsym $mod+Up focus up bindsym $mod+Right focus right
- Впрочем, следует заметить, что также могут использоваться и другие соглашения:
j
: влево;k
: вниз;l
: вверх;;
: вправо.
- Поскольку в данном менеджере окон поддерживаются контейнеры, то можно переключить фокус на родительский контейнер:
Mod
+a
: переключить фокус на родительский контейнер.- Конфигурация:
## Move focus to the parent container bindsym $mod+a focus parent
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
: перемещение вправо.
- Конфигурация выглядит следующим образом:
## Move the focused window with the same, but add Shift bindsym $mod+Shift+$left move left bindsym $mod+Shift+$down move down bindsym $mod+Shift+$up move up bindsym $mod+Shift+$right move right ## Ditto, with arrow keys bindsym $mod+Shift+Left move left bindsym $mod+Shift+Down move down bindsym $mod+Shift+Up move up bindsym $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).
- Конфигурация:
## Switch the current container between different layout styles bindsym $mod+s layout stacking bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split
- Для раскладки по умолчанию я использую табы:
### Layout mode for new containers ## default|stacking|tabbed workspace_layout tabbed
4.7 Floating
Mod
+ Shift + Space toggle floatingMod
+ Left click drag floating
4.8 Рабочие области (workspaces)
- Сконфигурим рабочие области:
## Define names for workspaces set $ws1 1 set $ws2 2 set $ws3 3 set $ws4 4 set $ws5 5 set $ws6 6 set $ws7 7 set $ws8 8 set $ws9 9 set $ws10 10
Mod
+0
–9
: переключиться на соответствующую рабочую область:## Switch to workspace bindsym $mod+1 workspace $ws1 bindsym $mod+2 workspace $ws2 bindsym $mod+3 workspace $ws3 bindsym $mod+4 workspace $ws4 bindsym $mod+5 workspace $ws5 bindsym $mod+6 workspace $ws6 bindsym $mod+7 workspace $ws7 bindsym $mod+8 workspace $ws8 bindsym $mod+9 workspace $ws9 bindsym $mod+0 workspace $ws10
Mod
+Shift
+0
–9
: перенести окно на соответствующую рабочую область:## Move focused container to workspace bindsym $mod+Shift+1 move container to workspace $ws1 bindsym $mod+Shift+2 move container to workspace $ws2 bindsym $mod+Shift+3 move container to workspace $ws3 bindsym $mod+Shift+4 move container to workspace $ws4 bindsym $mod+Shift+5 move container to workspace $ws5 bindsym $mod+Shift+6 move container to workspace $ws6 bindsym $mod+Shift+7 move container to workspace $ws7 bindsym $mod+Shift+8 move container to workspace $ws8 bindsym $mod+Shift+9 move container to workspace $ws9 bindsym $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
: перечитать конфигурационный файл.## ~/.config/i3/config ## reload the configuration file bindsym $mod+Shift+c reload
Mod
+Shift
+r
: перестартовать i3, сохранив сессию.## ~/.config/i3/config ## restart i3 inplace (preserves your layout/session, can be used to upgrade i3) bindsym $mod+Shift+r restart
Mod
+Shift
+e
: выход из i3.## ~/.config/i3/config ## exit i3 (logs you out of your X session) bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
5 Настройка
5.1 Терминал
В качестве терминала я использую kitty.
Конфигурация запуска терминала:
set $term kitty bindsym $mod+Return exec $term
- В этом случае запускается одно окно терминала.
Для работы я использую специальную настройку сессии терминала. Я её запускаю при входе в сессию. Для этого я приспособил комбинацию
Mod
+Shift
+Enter
:bindsym $mod+Shift+Return exec kitty --session ~/.config/kitty/startup
5.2 Управление окном с помощью мышки
Можно управлять окнами с помощью мышки.
Привязка осуществляется следующей командой:
bindsym [--release] [--border] [--whole-window] [--exclude-titlebar] [<Modifiers>+]button<n> command
- По умолчанию привязка запускается только при нажатии на строку заголовка окна.
- Если указан флаг
--release
, он запустится, когда кнопка мыши будет отпущена. - Если указан флаг
--whole-window
, то привязка также будет выполняться при щелчке по любой части окна, за исключением границы. - Чтобы привязка выполнялась при щелчке границы, нужно указать флаг
--border
. - Если задан флаг
--exclude-titlebar
, заголовок не будет учитываться для привязки клавиш.
Примеры.
- Средняя кнопка на заголовке закрывает окно:
bindsym --release button2 kill
- Средняя кнопка и модификатор над любой частью окна закрывает окно:
bindsym --whole-window $mod+button2 kill
- Правая кнопка мыши переключает плавающий режим:
bindsym button3 floating toggle bindsym $mod+button3 floating toggle
- Боковые кнопки мыши перемещают окно:
bindsym button9 move left bindsym button8 move right
- Средняя кнопка на заголовке закрывает окно:
5.3 Строка статуса
5.3.1 i3bar
- Отрисовку панели осуществляет утилита
i3bar
. - Отображается вверху или внизу экрана.
- Содержит:
- область с кнопками переключения рабочих областей i3;
- системную строку, генерируемую при помощи
i3status
или аналогов; - системный трей с иконками программ.
- В конфигурационном файле задаётся следующим образом (https://i3wm.org/docs/userguide.html#_configuring_i3bar):
# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start i3bar to display a workspace bar bar { status_command i3status position top }
Поддержка иконок в i3bar
- В
i3bar
можно использовать шрифты иконок (см. Моноширинные шрифты). - Наиболее распространённым является шрифт Font Awesome.
- Установка:
- Gentoo
emerge media-fonts/fontawesome
- Gentoo
- Для вставки шрифта в файл можно использовать список кодов для иконок https://fontawesome.com/cheatsheet.
- Шрифт лучше явно обозначить в конфигурации:
## ~/.config/i3/config bar { … font pango:Source Sans Pro, FontAwesome 5 Free 10 … }
- Для набора символа по его коду следует использовать конфигурации клавиш. Например, для набора символа с кодом
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:
# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start i3bar to display a workspace bar bar { font pango:Source Sans Pro, FontAwesome 5 Free 10 status_command i3status --config ~/.config/i3/i3status/config position top }
- Структура информационной панели задаётся в конфигурационном файле:
### -*- mode: conf-unix; -*- ## ~/.config/i3/i3status/config general { colors = true # включение/выключение поддержки цветов true/false interval = 1 # интервал обновления строки статуса, в секундах output_format = "i3bar" # формат вывода, устанавливаем i3bar (JSON) } # порядок вывода модулей order += "run_watch openvpn" order += "run_watch openconnect" order += "volume master" order += "wireless _first_" order += "battery all" order += "disk /" order += "memory" order += "cpu_usage" order += "cpu_temperature 0" order += "tztime local" # отслеживание процесса openvpn # служит как индикатор работы openvpn клиента # при запуске openvpn необходимо # указывать параметр --writepid /var/run/openvpn.pid run_watch openvpn { pidfile = "/var/run/openvpn.pid" format = " openvpn" # если пареметр format_down оставить пустым, # то при неактивном процессе блок будет отсутствовать format_down="" } # аналогичный блок индикатор openconnect vpn клиента # требуется запуск клиента с параметром --pid-file=/var/run/openconnect.pid run_watch openconnect { pidfile = "/var/run/openconnect.pid" format = " openconnect vpn" format_down="" } # управление громкостью звука volume master { format = " %volume" # шаблон громкости в активном состоянии format_muted = " %volume" # шаблон громкости в состоянии muted (без звука) device = "default" mixer = "Master" mixer_idx = 0 } # индикатор WIFI wireless _first_ { # шаблон вывода, можно дополнить # наименованием подключения %essid # и ip адресом %ip format_up = "%quality %frequency" format_down = "" } # состояние заряда батареи battery all { # шаблон вывода, можно дополнить # оставшимся временем работы %emptytime # энергопотреблением %consumption в ваттах format = "%status %percentage" # true - показ процента заряда от 0 до 100 # false - показ процента заряда от 0 до n, с учетом # изношенности аккумулятора last_full_capacity = true format_down = "" status_chr = "" # статус подзарядки status_bat = "" # статус в режиме работы от батареи status_unk = "? UNK" # неизвестный статус status_full = "" # статус полного заряда path = "/sys/class/power_supply/BAT%d/uevent" # нижний порог заряда, после которого блок # будет окрашен в "color_bad" (по умолчанию красный) # подробнее в man i3status low_threshold = 10 } # отслеживаемый накопитель disk "/" { # доступные переменные: # %used, %percentage_used - занятое пространство # %free, %percentage_free - свободное пространство # %avail, %percentage_avail - доступное пространство # %total - всего format = " %avail" # будет окрашен в "color_bad" (по умолчанию красный) # при достижении нижнего порога менее 10GB доступного пространства low_threshold = "10" threshold_type = "gbytes_avail" format_below_threshold = " Warning: %avail" } # миниторинг оперативной памяти memory { # доступные переменные: # %total, percentage_total # %used, percentage_used # %free, percentage_free # %available, percentage_available # %shared, percentage_shared format = " %used" # порог, при котором вывод окрасится в # желтый (degraded) или красный (critical) # а формат вывода изменится на format_degraded threshold_degraded = "1G" threshold_critical = "200M" format_degraded = "MEMORY < %available" } # температура процессора cpu_temperature 0 { format = " %degrees" # верхний порог температуры, при достижении которого # вывод окрасится красным, # и формат изменится на format_above_threshold max_threshold = "80" format_above_threshold = " %degrees" path = "/sys/class/thermal/thermal_zone0/temp" } # использование центрального процессора cpu_usage { # %usage - процентное использование ЦП # %cpu<N> - начиная с %cpu0 и далее показывает использование ядер format = " %usage" # доступны параметры: # degraded_threshold, окрас в желтый, по умолчанию 90 # max_threshold, окрас в красный, по умолчанию 95 # и кастомные форматы для них # format_above_degraded_threshold и format_above_threshold } # вывод даты и времени по заданному формату tztime local { format = " %d %b %Y %H:%M:%S" }
5.3.2 py3status
py3status
— это расширяемая оболочка дляi3status
, написанная на python.- Сайт: https://py3status.readthedocs.io/.
- Репозиторий: https://github.com/ultrabug/py3status.
- Можно управлять
i3bar
:- используя один из доступных модулей, поставляемых с
py3status
; - группировать несколько модулей и автоматически или вручную циклически отображать их отображение;
- писать свои собственные модули и отображать их вывод на панели;
- обрабатывать события кликов на
i3bar
.
- используя один из доступных модулей, поставляемых с
- Отображается вверху или внизу экрана.
- Содержит:
- область с кнопками переключения рабочих областей i3;
- системную строку;
- системный трей с иконками программ.
Запуск py3status
- Запускается вместо
i3bar
:# ~/.config/i3/config -*- mode: conf-unix; -*- ## Start py3status to display a workspace bar bar { font pango:Iosevka Nerd Font 12 status_command py3status position top }
- Использует конфигурационный файл от
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:
USE="i3wm" emerge x11-misc/polybar
- Gentoo:
Конфигурационный файл:
- стандартное расположение:
~/.config/polybar/config
($XDG_CONFIG_HOME/polybar/config
); - использую для локальных настроек только для i3:
~/.config/i3/polybar/config
.
- стандартное расположение:
Скрипт запуска
- Создадим скрипт запуска
polybar
.#!/bin/bash # ~/.config/i3/polybar/launch.sh # Terminate already running bar instances killall -q polybar # If all your bars have ipc enabled, you can also use # polybar-msg cmd quit # Wait until the processes have been shut down while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done # Launch Polybar, using config location ~/.config/i3/polybar/config polybar --config=~/.config/i3/polybar/config i3 & echo "Polybar launched..."
- Установим права на исполнение:
chmod +x ~/.config/i3/polybar/launch.sh
- Добавим вызов
polybar
в файл конфигурации i3. Конфигурацию для i3bar следует закомментировать.## ~/.config/i3/config ## Start i3bar to display a workspace bar # bar { # font pango:Source Sans Pro, FontAwesome 5 Free 10 # status_command i3status --config ~/.config/i3/i3status/config # position top # } ## Start polybar exec_always --no-startup-id ~/.config/i3/polybar/launch.sh
- Создадим скрипт запуска
5.4 Запуск приложений
- По умолчанию используется
dmenu
. - Можно заменить на
rofi
(см. Запуск приложений. Rofi).
5.4.1 rofi
- Используется для запуска приложений, переключения окон.
- https://github.com/davatorium/rofi
- Конфигурация по умолчанию находится в
~/.config/rofi/config
. - Для выбора темы можно использовать команду:
rofi-theme-selector
- Для запуска программ используется несколько мод:
run
: запускать приложения из пути ($PATH
) с возможностью запуска в терминале.drun
: запускать приложения на основе desctop-файлов (по стандарту XDG).window
: переключение между окнами в оконном менеджере, совместимом со спецификацией EWMH.ssh
: подключение к удаленному хосту черезssh
.file-browser
: базовый файловый броузер для открытия файлов.keys
: список внутренних привязок клавиш.script
: использование простых скриптов.combi
: объединяет несколько мод в одну.
- Использование запятых в файле настроек i3 может привести к проблемам. Лучше использовать файл настроек rofi или замените запятые символом
#
, например, заменить строкунаrofi -combi-modi window,drun,ssh
rofi -combi-modi window#drun#ssh
- Возможная конфигурация в командной строке команды
rofi
:## ~/.config/i3/config set $menu rofi -combi-modi window#drun -show combi -modi combi -show-icons
- Конфигурация с помощью конфигурационного файла (поместим его в
~/.config/i3/rofi/config
).
5.5 Блокировка экрана
Для отключения экрана можно использовать DPMS:
exec --no-startup-id xset dpms 1800
- Отключается через 30 минут.
5.5.1 Блокировщик экрана i3lock
В качестве блокировщика экрана используем
i3lock
.- Установка
- Gentoo
emerge x11-misc/i3lock
- Gentoo
- Установка
Использование в конфигурационном файле:
set $Locker i3lock --color=000000 && sleep 1
sleep 1
добавляет небольшую задержку, чтобы предотвратить возможное состояние гонки.
Для блокировки экрана после заданного периода времени можно использовать
xautolock
илиxss-lock
.Использование
xautolock
.Установка
- Gentoo
emerge x11-misc/xautolock
- Gentoo
Использование в конфигурационном файле:
exec --no-startup-id xautolock -time 10 -locker "$Locker"
- Блокирует через 10 минут.
Использование
xss-lock
.Установка
- Gentoo
emerge x11-misc/xss-lock
- Gentoo
Использование в конфигурационном файле:
exec --no-startup-id xss-lock -- "$Locker"
5.5.2 Блокировщик экрана i3lock-color
- Репозиторий: https://github.com/Raymo111/i3lock-color
Дополнительные возможности в i3lock-color
- Дополнительное управление цветом элементов.
- Размытие текущего экрана и использование его в качестве фона блокировки.
- Отображение часов в индикаторе.
- Обновление по таймеру, а не при каждом нажатии клавиши.
- Отображение раскладки клавиатуры.
Установка
- Gentoo
- Порт находится в оверлее
guru
:emerge x11-misc/i3lock-color
- Порт находится в оверлее
- Gentoo
6 Приложения
6.1 Снимки экрана
Для скриншотов можно использовать scrot.
- Gentoo
emerge media-gfx/scrot
- Gentoo
Добавим в конфигурационный файл:
## Screenshot ## Screenshot active display bindsym --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' ## Screenshot current window bindsym --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' ## Screenshot selected region bindsym --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 жестко зашит список оконных менеджеров.
- Следует установить переменную окружения:
export _JAVA_AWT_WM_NONREPARENTING=1
7.1.2 Меню в приложениях плавает отдельно, им невозможно пользоваться
- В выпусках Java до версии 9 GTK интерфейс ориентирован на GTK2, в последующих версиях на GTK3.
- GTK LookAndFeel может работать с GTK версий 2, 2.2 и 3.
- По умолчанию используется GTK3.
- Следует явно задать более старую версию:
export JAVA_TOOL_OPTIONS='-Djdk.gtk.version=2.2'