# Тайловый оконный менеджер i3 [i3](https://i3wm.org/) — это динамический [тайловый оконный менеджер](https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BE%D0%BA%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80 ), вдохновлённый [wmii](https://ru.wikipedia.org/wiki/Wmii ) и нацеленный на разработчиков и опытных пользователей. Полные возможности по настройке и использованию i3 описаны в [документации](https://i3wm.org/docs/). В частности руководство пользователя лежит на [этой странице](https://i3wm.org/docs/userguide.html#configuring) (**!**)**Note**: также с руководством по i3wm на русском языке можно ознакомиться [здесь](https://wiki.archlinux.org/title/I3_(Русский) ) ## Мастер настройки и альтернативные раскладки клавиатуры При первом запуске i3 без готового файла конфигурации он предлагает запустить мастер настройки i3-config-wizard. Этот инструмент создаёт файл `~/.config/i3/config`, беря за основу шаблон `/etc/i3/config.keycodes`. Он вносит в шаблон два изменения: - Просит пользователя выбрать клавишу-модификатор по умолчанию. Будет предложено два варианта - **Meta** (windows кнопка - Mod4) или **Alt** (Mod1), и выбранный он добавит в шаблон в виде одной строки, например, `set $mod Mod1`; - Заменяет все строки bindcode на строки bindsym, соответствующие текущей раскладке клавиатуры пользователя. Шаг 2 предназначен для того, чтобы гарантировать, что четыре навигационных сочетания клавиш, **j**, **k**, **l** и **;** на Qwerty-клавиатуре будут отображены на символы клавиш, которые имеют такое же расположение, например, **h**, **t**, **n**, **s** на клавиатуре Dvorak.\\ Побочным эффектом этого действия является то, что до пятнадцати других клавиш могут быть переадресованы таким образом, что это нарушит мнемонику — так, для пользователя Dvorak "перезапуск" ("restart") будет привязан к $mod1+p вместо $mod1+r, "разделение по горизонтали" ("split horizontally") будет привязано к $mod1+d вместо $mod1+h, и так далее. Поэтому пользователи альтернативных раскладок клавиатуры, которым нужны простые привязки клавиш, соответствующие привязкам, приведённым в руководствах, могут предпочесть обойтись без «мастера настройки». Это можно сделать, просто скопировав файл `/etc/i3/config` в файл `~/.config/i3/config` (или `~/.i3/config`) и отредактировав его. //Обратите внимание, что также [возможна конфигурация на основе кодов клавиш](http://151.248.112.239:8181/dokuwiki/doku.php?id=linux:i3wm#%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8_%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D1%85_%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88), например, для пользователей, которые **часто переключаются между раскладками клавиатуры, но хотят, чтобы привязки i3 оставались неизменными**//. ### Cheatsheet с горячими клавишами принятыми по умолчанию, картинки-подсказки: * горячие клавиши для использования с **$mod** (здесь - alt): {{:linux:i3wm-keyboard-layer1.png?direct&600|}} * горячие клавиши для использования с **Shift+$mod**: {{:linux:i3wm-keyboard-layer2.png?direct&600|}} Красные клавиши - это модификаторы, которые вам нужно нажать (по умолчанию), синие клавиши - это ваше рабочее пространство . ## Использование i3 ### Открытие терминала и перемещение вокруг Одной из самых основных операций является открытие нового терминала. По умолчанию комбинация клавиш для этого - **$mod+enter**, то есть **alt+enter** (mod1+enter) в конфигурации по умолчанию.\\ При нажатии **$mod+enter**, будет открыт новый терминал, который заполнит все пространство, доступное на вашем экране. {{ :linux:i3-single_terminal.png?direct&400 |}} Если теперь открыть ещё один терминал, то i3 поместит его рядом с текущим, разделив размер экрана пополам.\\ В зависимости от размеров монитора i3 поместит созданное окно либо рядом с существующим окном (на широких дисплеях), либо под существующим окном (повернутые дисплеи). {{ :linux:i3-two_terminals.png?direct&400 |}} Для перемещения фокуса между двумя терминалами можно использовать клавиши со стрелками.\\ Для удобства перемещение фокуса также доступно прямо в основном ряду клавиатуры под правой рукой: |$mod+j |left | |$mod+k |down | |$mod+l |up | |$mod+; |right |
Обратите внимание, что это отличается на одну клавишу от популярного текстового редактора vi, который был разработан для терминала ADM-3A и поэтому использует **hjkl** вместо **jkl;** — По умолчанию в i3 требуется минимальное движение пальцев, но некоторые пользователи vi меняют конфигурацию i3 для обеспечения единообразия.
На данный момент рабочее пространство на экране разделено на два окна (оно содержит два терминала) в определенном направлении (по умолчанию — горизонтально). Каждое окно можно разделить по горизонтали или по вертикали, как и рабочее пространство.\\ В используемой терминологии - «окно» (window) применяется для контейнера, который фактически содержит окно X11 (например, терминал или браузер), и «разделенный контейнер» (split container) для контейнеров, состоящих из одного или нескольких окон.\\ Чтобы разделить окно по вертикали, нажмите **$mod+v** перед созданием нового окна. Чтобы разделить его по горизонтали, нажмите **$mod+h** ### Изменение компоновки контейнера Разделенный контейнер может иметь одну из следующих компоновок: - **splith**/**splitv** - Деление по горизонтали или вертикали. При этом размеры окон выбираются таким образом, чтобы каждому окну отводилось одинаковое пространство в контейнере. **splith** распределяет окна по горизонтали (окна расположены рядом друг с другом), **splitv** распределяет их по вертикали (окна расположены друг над другом). - **stacking** - Штабелирование. При этом в контейнере отображается только сфокусированное окно. В верхней части контейнера отображается список всех окон. - **tabbed** - С вкладками. Принцип отображения тот же, что и в stacking, но список окон вверху состоит всего из одной строки, разделенной по вертикали. {{ :linux:i3-modes.png |}} Для переключения режимов нажмите **$mod+e** для splith/splitv (переключается), **$mod+s** для штабелирования и **$mod+w** для отображения с вкладками. ### Переключение полноэкранного режима для окна Чтобы отобразить окно в полноэкранном режиме или снова выйти из полноэкранного режима, нажмите **$mod+f**.\\ В i3 также есть глобальный полноэкранный режим, в котором клиент будет использовать все доступные выходные данные (команда - `fullscreen toggle global`). ### Закрытие окон Если приложение не предоставляет свой механизм закрытия (большинство приложений предоставляют меню, клавишу Escape или сочетание клавиш, например Control+w, для закрытия), то можно нажать **$mod+Shift+q**, чтобы закрыть окно.\\ Для приложений, поддерживающих протокол WM\_DELETE, приложение будет корректно закрыто (с сохранением всех изменений или другой очисткой). Если приложение не поддерживает протокол WM_DELETE, то ваш X-сервер закроет окно, и поведение зависит от приложения. ### Открытие других приложений Помимо открытия приложений из терминала, вы также можете использовать удобное dmenu, которое по умолчанию открывается нажатием клавиш **$mod+d**. Просто введите название (или его часть) приложения, которое вы хотите открыть. Чтобы это сработало, соответствующее приложение должно быть указано в вашем **$PATH**. Кроме того, если у вас есть приложения, которые вы открываете очень часто, вы можете создать привязку клавиш для непосредственно запуска данного приложения. Подробности смотрите в разделе [[https://i3wm.org/docs/userguide.html#configuring|настройка]]. ### Использование рабочих областей Рабочие области - это простой способ сгруппировать набор окон. По умолчанию пользователь находится в первой рабочей области, о чем свидетельствует панель в левом нижнем углу (индикатор с цифрой 1).\\ Чтобы переключиться на другое рабочее пространство, нажмите $mod+num, где num - номер рабочего пространства, которое хотите использовать. Если рабочее пространство еще не существует, оно будет создано. Распространенная парадигма заключается в размещении веб-браузера в одном рабочем пространстве, коммуникационных приложений (mutt, irssi, ...) - в другом, а тех, с которыми вы работаете, - в третьем. Конечно, это не догма. Если у вас несколько экранов, при запуске на каждом из них будет создано рабочее пространство. Если вы откроете новое рабочее пространство, оно будет привязано к экрану, на котором вы его создали. При переключении на рабочее пространство на другом экране i3 настроит фокус на этот экран . ### Перемещение окон в рабочие области Чтобы переместить окно в другую рабочую область, просто нажмите **$mod+Shift+num**, где **num** - это (как при переключении рабочих областей) номер целевой рабочей области. Аналогично переключению рабочих областей, целевая рабочая область будет создана, если она еще не существует . ### Изменение размера Самый простой способ изменить размер контейнера - с помощью мыши: возьмите рамку и переместите ее до нужного размера. Вы также можете использовать [binding_modes](https://i3wm.org/docs/userguide.html#binding_modes ), чтобы задать режим изменения размера с помощью клавиатуры. Чтобы увидеть пример этого, посмотрите на предоставленную [конфигурацию i3 по умолчанию](https://github.com/i3/i3/blob/next/etc/config.keycodes). ### Перезапуск i3 на месте (без выхода из сеанса пользователя) Чтобы перезапустить i3 на месте (и, таким образом, перейти в чистое состояние, если есть ошибка, или перейти на более новую версию i3), вы можете использовать **$mod+Shift+r**. ### Выход из i3 Чтобы полностью завершить работу с i3, не отключая ваш X-сервер, вы можете использовать **$mod+Shift+e**. По умолчанию в диалоговом окне пользователю будет предложено подтвердить, действительно ли он хочет завершить работу. ### Плавающий режим Плавающий режим является противоположностью тайлинговому (плиточному) режиму. Положение и размер окна управляются i3 не автоматически, а вами вручную.\\ Использование этого режима нарушает парадигму тайлинга, но может быть полезно для некоторых сложных случаев, таких как диалоговые окна "Сохранить как" или окна панели инструментов (GIMP или аналогичные). Эти окна обычно содержат соответствующую подсказку и по умолчанию открываются в плавающем режиме. Вы можете переключить плавающий режим для окна, нажав **$mod+Shift+Space**. Перетаскивая строку заголовка окна с помощью мыши, вы можете перемещать окно по кругу. Захватывая границы и перемещая их, вы можете изменять размер окна. Вы также можете сделать это с помощью [floating_modifier](https://i3wm.org/docs/userguide.html#floating_modifier). Другой способ изменить размер плавающих окон с помощью мыши - щелкнуть правой кнопкой мыши на строке заголовка и перетащить ее. Чтобы изменить размер плавающих окон с помощью клавиатуры, ознакомьтесь с режимом привязки изменения размера, предоставляемым (конфигурацией i3 по умолчанию)(https://github.com/i3/i3/blob/next/etc/config.keycodes). //Плавающие окна всегда располагаются поверх окон с плитками//. ### Перемещение тайловых (плиточных) контейнеров с помощью мыши Начиная с версии i3 4.21, можно перетаскивать контейнеры с плитками с помощью мыши. Перетаскивание может быть инициировано либо перетаскиванием за строку заголовка окна, либо нажатием кнопки [[https://i3wm.org/docs/userguide.html#floating_modifier|floating_modifier]] и последующим перетаскиванием контейнера с одновременным удержанием нажатой левой кнопки мыши. Смотрите параметр [[https://i3wm.org/docs/userguide.html#config_tiling_drag|config_tiling_drag]] для настройки того, какое действие запускает перетаскивание тайлов (плиток). Как только перетаскивание начато и курсор покинул исходный контейнер, в соответствии с положением курсора относительно целевого контейнера создаются индикаторы перетаскивания. Эти индикаторы помогают вам понять, каким будет результирующий макет [[i3wm#дерево|дерева]] после того, как вы отпустите кнопку мыши. Возможны следующие конечные позиции перетаскивания: **Сброс на контейнер**\\ Это происходит, когда мышь находится относительно близко к центру контейнера.\\ Если отпустить мышь, результат будет таким же, как если бы вы выполнили команду **move container to mark**. Смотрите [[https://i3wm.org/docs/userguide.html#move_to_mark|move_to_mark]].\\ Если перед началом перетаскивания нажать модификатор **swap** (по умолчанию для параметра **tiling\_drag swap\_modifier** установлен "Shift"), контейнеры поменяются местами. В этом случае результат будет таким же, как если бы вы запустили команду **swap container with mark**. Смотрите [[https://i3wm.org/docs/userguide.html#swapping_containers|swapping_containers]]. **Сброс как родственника**\\ Это происходит, когда мышь находится относительно близко к краю контейнера.\\ Если отпустить кнопку мыши, перетаскиваемый контейнер станет родственным относительно целевого контейнера и будет размещен слева/справа/вверху/внизу в соответствии с положением индикатора. Это может привести к созданию нового v-split (вертикального) или h-split (горизонтального) разделения в соответствии с предыдущим расположением целевого контейнера. Например, если целевой контейнер имеет h-split разделение и вы сбрасываете перетаскиваемый контейнер под ним, новое расположение должно получиться с v-split разделением. **Сброс к родителю**\\ Это происходит, когда мышь находится относительно близко к краю контейнера (даже ближе к границе по сравнению с описанным выше вариантом) и если этот край также является краем родительского контейнера.\\ Например, если три контейнера расположены горизонтально, то ребра, на которых это может произойти, - это левый край левого контейнера, правый край правого контейнера и все нижние и верхние края всех трех контейнеров. Если отпустить мышь, контейнер сначала перемещается как однотипный с целевым контейнером, как в приведенном выше случае, а затем перемещается по направлению, как с помощью команды "**move left|right|down|up**". Смотрите [[https://i3wm.org/docs/userguide.html#move_direction|move_direction]]. Цвет индикатора соответствует настройкам **client.focused**. Смотрите [[https://i3wm.org/docs/userguide.html#client_colors|client_colors]] . ## Дерево i3 хранит всю информацию о выводах X11, рабочих областях и расположенных на них окнах в виде дерева.\\ Корневой узел - это корневое окно X11, за которым следуют данные выводимые X11, затем области привязки и контейнер содержимого, затем рабочие области и, наконец, сами окна. ### Дерево состоит из контейнеров Строительными блоками дерева являются так называемые //контейнеры//. //Контейнер// может содержать окно (имеется в виду окно X11, которое можно видеть и использовать, как например браузер). В качестве другого варианта, контейнер может содержать один или несколько //контейнеров//.\\ Простым примером является рабочая область: если запустить i3 с одним монитором, одной рабочей областью и открыть два окна терминала, то в итоге получим дерево, подобное этому: {{:linux:i3-tree-shot4.png?direct&200|}} {{:linux:i3-tree-layout2.png?direct&200|}}\\ Рисунок 1. Два терминала в стандартной рабочей области.\\ ### Ориентация и разделенные контейнеры Вполне естественно использовать так называемые "разделенные контейнеры" (split container) для построения макета при использовании дерева в качестве структуры данных. В i3 каждый контейнер имеет ориентацию (горизонтальную, вертикальную или неопределенную), и ориентация зависит от расположения контейнера (вертикальная для splitv и stacking, горизонтальная для splith и размещения tabbed). В нашем примере с рабочей областью макет рабочей области по умолчанию имеет разделение splith (большинство мониторов в настоящее время широкоэкранные). Если вы измените макет на splitv (через $mod+v в конфигурации по умолчанию), а затем откроете два терминала, i3 настроит ваши окна следующим образом: {{:linux:i3-tree-shot2.png?direct&200|}} Рисунок 2. Вертикальная ориентация рабочей области Интересной новой функцией i3, начиная с версии 4, является возможность разделения всего, что угодно:\\ Предположим, что у вас есть два терминала в рабочей области (имеющей splith макет разделения, то есть горизонтальную ориентацию) и фокус на правом терминале. Теперь вы хотите открыть другое окно терминала под текущим. Если бы вы просто открыли новое окно терминала, то оно отображалось бы справа из-за splith макета. Вместо этого нажмите $mod+v, чтобы разделить контейнер с помощью макета splitv (чтобы открыть контейнер с разделением по горизонтали, используйте $mod+h). Теперь вы можете открыть новый терминал, и он откроется ниже текущего: {{:linux:i3-tree-shot1.png?direct&200|}} {{:linux:i3-tree-layout1.png?direct&200|}} Рисунок 3. Контейнер с вертикальным разделением Как наверное уже можно догадаться: нет предела тому, насколько глубокой может быть ваша иерархия разделений. ### Фокусировка родительского контейнера (focus parent) Остановимся на примере, приведенном выше. У нас есть терминал слева и два вертикально разделенных терминала справа, и фокус на нижнем правом терминале. Когда вы откроете новый терминал, он откроется под текущим. Но как вы можете открыть новое окно терминала справа от текущего?\\ Решение заключается в использовании focus parent, который будет фокусировать родительский контейнер текущего контейнера.\\ В конфигурации по умолчанию используйте $mod+a для перемещения по одному контейнеру вверх по дереву (вы можете повторять это несколько раз, пока не дойдете до контейнера рабочей области). В этом случае вы должны получить фокус на контейнере с вертикальным разделением, который находится //внутри// горизонтально ориентированного рабочего пространства.\\ Таким образом, теперь справа от вертикально разделенного контейнера будут открываться новые окна: {{:linux:i3-tree-shot3.png?direct&200|}} Рисунок 4. Фокус на родительском контейнере, затем открытие нового терминала ### Неявные контейнеры В некоторых случаях i3 необходимо неявно создать контейнер для выполнения вашей команды. Одним из примеров является следующий сценарий: вы запускаете i3 с одним монитором и одной рабочей областью, в которой вы открываете три окна терминала. Все эти окна терминала напрямую привязаны к одному узлу внутри дерева макета i3 — узлу рабочей области. По умолчанию ориентация узла рабочей области //горизонтальная//. Теперь вы перемещаете один из этих терминалов вниз (по умолчанию $mod+Shift+k). Ориентация узла рабочей области будет изменена на //вертикальную//. Окно терминала, которое вы переместили вниз, напрямую прикрепляется к рабочей области и появляется в нижней части экрана. Был создан новый (горизонтальный) контейнер для размещения двух других окон терминала. Вы заметите это при переключении в режим вкладок (например). В итоге у вас будет одна вкладка с представлением разделенного контейнера (например, «H[urxvt firefox]»), а другая будет окном терминала, которое вы переместили вниз. ## Настройка i3 Чтобы изменить конфигурацию i3, скопируйте файл `/etc/i3/config` в файл `~/.i3/config` (или `~/.config/i3/config`, если вам нравится схема каталогов XDG) и отредактируйте его с помощью текстового редактора. При первом запуске (и при всех последующих запусках, если у вас нет файла конфигурации) i3 предложит создать файл конфигурации. Вы можете указать мастеру использовать **Alt** (Mod1) или **Meta**(Windows) (Mod4) в качестве модификатора в файле конфигурации. Кроме того, в созданном файле конфигурации будут использоваться ключевые символы вашей текущей раскладки клавиатуры.\\ Чтобы запустить мастер настройки, используйте команду `i3-config-wizard`. Обратите внимание, что у вас не должно быть файла `~/.i3/config`, иначе мастер завершит работу. ### Подключаемые файлы конфигурации (Include directive) В i3 начиная с версии v4.20, можно подключать другие конфигурационные файлы из вашего файла конфигурации i3. Синтаксис: ``` include ``` i3 расширяет pattern, используя shell-подобное расширение слова, специфически используя функцию [[https://manpages.debian.org/trixie/manpages-ru-dev/wordexp.3.ru.html|wordexp(3)]] стандартной библиотеки C. Примеры: ``` # Тильда дополняется путем до домашнего каталога пользователя: include ~/.config/i3/assignments.conf # Дополнение переменными среды: include $HOME/.config/i3/assignments.conf # Дополнение подстановочными знаками: include ~/.config/i3/config.d/*.conf # Замена выводом команды (замена `hostname` на выходные данные соответствующей команды) include ~/.config/i3/`hostname`.conf # i3 загружает каждый путь только один раз, поэтому повторное # подключение файла конфигурации i3 приведет не к бесконечному циклу, а к ошибке: include ~/.config/i3/config # i3 изменяет рабочий каталог при анализе конфигурационного файла таким образом, # что относительные пути интерпретируются относительно каталога конфигурационного файла, # содержащего этот путь: include assignments.conf: ``` Если указанный файл не может быть прочитан, например, из-за отсутствия прав доступа к файлу или из-за висячей (недействующей) символической ссылки, i3 сообщит об ошибке и продолжит обработку оставшейся конфигурации. Чтобы просмотреть все загруженные файлы конфигурации, запустите `i3 --moreversion`: ``` % i3 --moreversion Binary i3 version: 4.19.2-87-gfcae64f7+ © 2009 Michael Stapelberg and contributors Running i3 version: 4.19.2-87-gfcae64f7+ (pid 963940) Loaded i3 config: /tmp/i3.cfg (main) (last modified: 2021-05-13T16:42:31 CEST, 463 seconds ago) /tmp/included.cfg (included) (last modified: 2021-05-13T16:42:43 CEST, 451 seconds ago) /tmp/another.cfg (included) (last modified: 2021-05-13T16:42:46 CEST, 448 seconds ago) ``` Переменные являются общими для всех конфигурационных файлов, но следует учитывать следующее ограничение: * Вы можете определить переменную и использовать ее во включаемом файле. * Вы не можете использовать (в родительском файле) переменную, которая была определена во включаемом файле. Это техническое ограничение: расширение переменной происходит на отдельном этапе перед разбором директив include. По сути, включаемые файлы могут только дополнять конфигурацию, а не отменять эффекты уже обработанной конфигурации. Например, вы можете только добавлять новые привязки клавиш, а не перезаписывать или удалять существующие. Это означает, что: * Директива include подходит для организации больших конфигураций в отдельные файлы, возможно, для выбора файлов на основе условий. * Директива include не подходит для выражения “использовать конфигурацию по умолчанию со следующими изменениями”. В этом случае по-прежнему рекомендуется скопировать и изменить файл конфигурацию по-умолчанию. ### Комментарии Возможно и рекомендуется использовать комментарии в файле конфигурации, чтобы правильно документировать настройку для дальнейшего использования. Комментарии начинаются с **#** и могут использоваться только в начале строки: Пример: ``` # Это комментарий ``` ### Шрифты i3 поддерживает как основные шрифты X, так и шрифты FreeType (с помощью Pango) для отображения оконных заголовков. Для генерации описания шрифта X можно использовать xfontsel(1). Чтобы увидеть специальные символы (Unicode), вам нужно использовать шрифт, который поддерживает кодировку ISO-10646. Описание шрифтов FreeType состоит из семейства шрифтов (font family), стиля (style), толщины (вес, weight), варианта (variant), растяжки (stretch) и размера (size). Шрифты FreeType поддерживают отображение справа налево и чаще всего содержат больше Unicode-символов, нежели основные шрифты X. Если i3 не может открыть заданный в конфигурации шрифт, то он выведет ошибку в log-файл и будет использовать тот, который работает. Синтаксис: ``` font font pango: [