Spec-Zone.ru › i3

Руководство пользователя i3

Michael Stapelberg
<michael@i3wm.org>
Оглавление

В этом документе вы найдете всю необходимую информацию для настройки и использования менеджера окон i3. Если этого окажется недостаточно, вы можете связаться с нами на сайте, в обсуждениях GitHub, в IRC или на почтовой рассылке.

1. По умолчанию сочетания клавиш

Для тех, кому лень читать всё, вот обзор сочетаний клавиш по умолчанию (нажмите, чтобы посмотреть изображение в полном размере):

Клавиши для использования с $mod (Alt):

Keys to use with $mod (Alt)

Клавиши для использования со Shift+$mod:

Keys to use with Shift+$mod

Красные клавиши — это модификаторы, которые вам нужно нажать (по умолчанию), синие клавиши — это клавиши на домашнем ряду.

Обратите внимание, что при запуске i3 без файла конфигурации i3-config-wizard предложит вам создать файл конфигурации, в котором расположение клавиш (!) будет соответствовать тому, что вы видите на изображении выше, независимо от раскладки вашей клавиатуры. Если вы предпочитаете использовать файл конфигурации, где буквы клавиш соответствуют тому, что вы видите выше, просто отклоните предложение i3-config-wizard и используйте конфигурацию из /etc/i3/config.

2. Использование i3

В этом руководстве ключевое слово $mod будет использоваться для обозначения настроенного модификатора. По умолчанию это клавиша Alt (Mod1), популярная альтернатива — клавиша Windows (Mod4), которая в значительной степени предотвращает конфликты с определенными приложениями ярлыками.

2.1. Открытие терминалов и перемещение

Очень простой операцией является открытие нового терминала. По умолчанию для этого используется сочетание клавиш $mod+Enter, то есть Alt+Enter (Mod1+Enter) в стандартной конфигурации. Нажав $mod+Enter, будет открыт новый терминал, который заполнит всё доступное пространство на экране.

Single terminal

Если теперь открыть другой терминал, i3 разместит его рядом с текущим, разделив размер экрана пополам. В зависимости от вашего монитора, i3 расположит созданное окно рядом с существующим окном (на широких дисплеях) или под существующим окном (на повернутых дисплеях).

Two terminals

Для переключения фокуса между двумя терминалами можно использовать клавиши со стрелками. Для удобства стрелки также доступны непосредственно на числовой части клавиатуры под правой рукой:

$mod+j

влево

$mod+k

вниз

$mod+l

вверх

$mod+;

вправо

Обратите внимание, что это отличается от популярного текстового редактора vi, который был разработан на терминале ADM-3A и поэтому использует hjkl вместо jkl; — по умолчанию i3 предназначен для минимального перемещения пальцев, но некоторые пользователи vi изменяют свою конфигурацию i3 для согласованности.

В данный момент ваше рабочее пространство разделено (содержит два терминала) в определенном направлении (по горизонтали по умолчанию). Каждое окно можно снова разделить по горизонтали или вертикали, как и рабочее пространство. Термины «окно» для контейнера, фактически содержащего окно X11 (например, терминал или браузер), и «разделенный контейнер» для контейнеров, состоящих из одного или нескольких окон.

Чтобы разделить окно по вертикали, нажмите $mod+v перед созданием нового окна. Чтобы разделить его по горизонтали, нажмите $mod+h.

2.2. Изменение макета контейнера

Разделенный контейнер может иметь один из следующих макетов:

splith/splitv

Окна масштабируются так, что каждое окно занимает равное количество места в контейнере. splith распределяет окна по горизонтали (окна находятся рядом друг с другом), splitv распределяет их по вертикали (окна находятся друг над другом).

stacking

Отображается только активное окно в контейнере. Вы получаете список окон в верхней части контейнера.

tabbed

Такой же принцип, как и stacking, но список окон вверху — это всего одна строка, которая разделена по вертикали.

Для переключения режимов нажмите $mod+e для splith/splitv (переключает), $mod+s для stacking и $mod+w для tabbed.

Container modes

2.3. Переключение полноэкранного режима для окна

Чтобы отобразить окно в полноэкранном режиме или выйти из полноэкранного режима, нажмите $mod+f.

В i3 также есть глобальный полноэкранный режим, в котором клиент будет занимать все доступные выходы (команда — fullscreen toggle global).

2.4. Открытие других приложений

Помимо открытия приложений из терминала, вы также можете использовать удобную утилиту dmenu, которая открывается нажатием $mod+d по умолчанию. Просто введите имя (или часть имени) приложения, которое вы хотите открыть. Соответствующее приложение должно быть в вашей переменной среды $PATH, чтобы это работало.

Кроме того, если у вас есть приложения, которые вы открываете очень часто, вы можете создать сочетание клавиш для их прямого запуска. Подробности см. в разделе [настройка].

2.5. Закрытие окон

Если приложение не предоставляет механизма для закрытия (большинство приложений предоставляют меню, клавишу Esc или сочетание клавиш, например, Control+w, для закрытия), вы можете нажать $mod+Shift+q для закрытия окна. Для приложений, которые поддерживают протокол WM_DELETE, это позволит корректно закрыть приложение (сохранив любые изменения или выполнив другие действия по очистке). Если приложение не поддерживает протокол WM_DELETE, ваш сервер X закроет окно, а поведение зависит от приложения.

2.6. Использование рабочих пространств

Рабочие пространства — это простой способ группировать набор окон. По умолчанию вы находитесь на первом рабочем пространстве, как указывает панель в левом нижнем углу. Чтобы переключиться на другое рабочее пространство, нажмите $mod+num, где num — номер рабочего пространства, которое вы хотите использовать. Если рабочего пространства еще нет, оно будет создано.

Общим подходом является размещение веб-браузера на одном рабочем пространстве, приложений для связи (mutt, irssi, …) на другом, а приложений, с которыми вы работаете, на третьем. Конечно, нет необходимости следовать этому подходу.

Если у вас несколько экранов, при запуске будет создано рабочее пространство на каждом экране. Если вы открываете новое рабочее пространство, оно будет привязано к экрану, на котором вы его создали. При переключении на рабочее пространство на другом экране i3 переключит фокус на этот экран.

2.7. Перемещение окон в рабочие пространства

Чтобы переместить окно в другое рабочее пространство, просто нажмите $mod+Shift+num, где num (как при переключении рабочих пространств) — номер целевого рабочего пространства. Аналогично переключению рабочих пространств, целевое рабочее пространство будет создано, если оно еще не существует.

2.8. Изменение размера

Самый простой способ изменить размер контейнера — использование мыши: перетащите границу до нужного размера.

Вы также можете использовать [режимы привязки] для определения режима изменения размера с помощью клавиатуры. Для примера см. стандартную конфигурацию, предоставленную i3.

2.9. Перезапуск i3 на месте

Для перезапуска i3 на месте (и, таким образом, получения чистого состояния, если есть ошибка, или для обновления до более новой версии i3) вы можете использовать $mod+Shift+r.

2.10. Выход из i3

Для чистого выхода из i3 без завершения работы вашего сервера X вы можете использовать $mod+Shift+e. По умолчанию появится диалог, который попросит вас подтвердить, действительно ли вы хотите выйти.

2.11. Плавающие окна

Режим плавающих окон — это противоположность режима разбиения по углам. Положение и размер окна не управляются автоматически i3, а вручную вами. Использование этого режима нарушает парадигму разбиения по углам, но может быть полезным в некоторых особых случаях, например, для окон «Сохранить как» или окон панели инструментов (GIMP или аналогичных). Эти окна обычно устанавливают соответствующую подсказку и по умолчанию открываются в режиме плавающих окон.

Вы можете переключить режим плавающего окна для окна, нажав $mod+Shift+Space. Перетаскивая заголовок окна с помощью мыши, вы можете перемещать окно. Перетаскивая границы, вы можете изменить размер окна. Вы также можете сделать это, используя [модификатор плавающего окна]. Другой способ изменения размера плавающих окон с помощью мыши — щелкнуть правой кнопкой мыши по заголовку и перетащить.

Для изменения размера плавающих окон с помощью клавиатуры см. режим привязки к изменению размера, предоставленный стандартной конфигурацией i3 .

Плавающие окна всегда находятся поверх окон, разделённых по углам.

2.12. Перемещение контейнеров с помощью мыши

Начиная с i3 4.21, можно перетаскивать контейнеры с помощью мыши. Перетаскивание можно инициировать, перетаскивая заголовок окна или нажав клавишу [floating_modifier] и перетаскивая контейнер, удерживая левую кнопку мыши. См. параметр [config_tiling_drag] для настройки действия, вызывающего перетаскивание контейнеров.

После начала перетаскивания и перемещения курсора за пределы исходного контейнера создаются индикаторы опускания, соответствующие положению курсора относительно целевого контейнера. Эти индикаторы помогают понять, каким будет результирующее расположение [tree] после отпускания кнопки мыши.

Возможные позиции опускания:

Опускание на контейнер

Это происходит, когда курсор находится относительно близко к центру контейнера. При отпускании кнопки мыши результат будет таким же, как при выполнении команды move container to mark. См. [move_to_mark]. Если перед началом перетаскивания нажата клавиша переключения (tiling_drag swap_modifier по умолчанию установлено как Shift), контейнеры будут поменяны местами. В этом случае результат будет таким же, как при выполнении команды swap container with mark. См. [swapping_containers].

Опускание в качестве брата

Это происходит, когда курсор находится относительно близко к краю контейнера. При отпускании кнопки мыши перетаскиваемый контейнер станет братом целевого контейнера, расположенного слева/справа/вверх/вниз в соответствии с положением индикатора. Это может или не может создать новую вертикальную или горизонтальную разделительную линию в зависимости от предыдущей компоновки целевого контейнера. Например, если целевой контейнер находится в горизонтальном разделении, и вы опустите перетаскиваемый контейнер под ним, новая компоновка должна быть вертикальным разделением.

Опускание к родителю

Это происходит, когда курсор находится относительно близко к краю контейнера (но ещё ближе к границе по сравнению с случаем брата, описанным выше) и если этот край также является краем родительского контейнера. Например, если три контейнера расположены в горизонтальном расположении, то краями, где это может произойти, являются левый край левого контейнера, правый край правого контейнера и все нижние и верхние края всех трёх контейнеров. При отпускании кнопки мыши контейнер сначала опускается в качестве брата целевого контейнера, как в случае выше, а затем перемещается в нужном направлении, как с командой move left|right|down|up. См. [move_direction].

Цвет индикатора соответствует настройке client.focused. См. [client_colors].

3. Дерево

i3 хранит всю информацию о выводах X11, рабочих пространствах и компоновке окон на них в виде дерева. Корневой узел — это корневое окно X11, за которым следуют выводы X11, затем области док-станций и контейнер контента, затем рабочие пространства и, наконец, сами окна. В предыдущих версиях i3 у нас были несколько списков (выводов, рабочих пространств) и таблица для каждого рабочего пространства. Этот подход оказался сложным в использовании (привязка), понимании и реализации.

3.1. Дерево состоит из контейнеров

Структурными блоками нашего дерева являются так называемые Контейнеры. Контейнер может содержать окно (что означает окно X11, которое вы можете фактически видеть и использовать, например, браузер). В качестве альтернативы, он может содержать один или несколько Контейнеров. Простой пример — рабочее пространство: при запуске i3 с одним монитором, одним рабочим пространством и открытии двух окон терминала вы получите дерево такого вида:

layout2
shot4
Рисунок 1. Два терминала на стандартном рабочем пространстве

3.2. Ориентация и разделение контейнеров

Естественно использовать так называемые Разделенные контейнеры для построения макета при использовании дерева в качестве структуры данных. В i3 каждый Контейнер имеет ориентацию (горизонтальную, вертикальную или неопределенную), и ориентация зависит от макета, в котором находится контейнер (вертикальная для splitv и stacking, горизонтальная для splith и tabbed). Итак, в нашем примере с рабочим пространством, стандартная компоновка контейнера рабочего пространства — splith (большинство мониторов сегодня широкоформатные). Если вы измените макет на splitv ($mod+v в стандартной конфигурации) и затем откроете два терминала, i3 настроит ваши окна так:

shot2
Рисунок 2. Вертикальная ориентация рабочего пространства

Интересной новой функцией i3 с версии 4 является возможность разделять всё: Предположим, у вас есть два терминала на рабочем пространстве (с горизонтальной компоновкой splith), и фокус на правом терминале. Теперь вы хотите открыть другое окно терминала под текущим. Если вы просто откроете новое окно терминала, оно отобразится справа из-за макета splith. Вместо этого нажмите $mod+v, чтобы разделить контейнер с помощью splitv макета (чтобы открыть Горизонтальный контейнер раздела, используйте $mod+h). Теперь вы можете открыть новый терминал, и он откроется под текущим:

Layout
shot
Рисунок 3. Вертикальный контейнер раздела

Вы, вероятно, уже догадались: нет ограничений на то, насколько глубокой может быть ваша иерархия разделения.

3.3. Фокус родителя

Давайте останемся с нашим примером из вышеизложенного. У нас есть терминал слева и два вертикально разделенных терминала справа, фокус на нижнем правом. Когда вы откроете новый терминал, он откроется под текущим.

Итак, как вы можете открыть новое окно терминала справа от текущего? Решение состоит в использовании focus parent, которое переместит фокус на Родительский контейнер текущего Контейнера. В стандартной конфигурации используйте $mod+a для навигации по одному Контейнеру вверх по дереву (вы можете повторить это несколько раз, пока не дойдете до Контейнера рабочего пространства). В этом случае вы сфокусируетесь на Вертикальном контейнере раздела, который внутри горизонтально ориентированного рабочего пространства. Таким образом, теперь новые окна будут открываться справа от Вертикального контейнера раздела:

shot3
Рисунок 4. Фокус родителя, затем открытие нового терминала

3.4. Неявные контейнеры

В некоторых случаях i3 необходимо неявно создать контейнер для выполнения вашей команды.

Один пример — следующий сценарий: вы запускаете i3 с одним монитором и одним рабочим пространством, на котором вы открываете три окна терминала. Все эти окна терминала напрямую подключены к одному узлу в дереве компоновки i3, узлу рабочего пространства. По умолчанию ориентация узла рабочего пространства — горизонтальная.

Теперь вы перемещаете одно из этих окон терминала вниз ($mod+Shift+k по умолчанию). Ориентация узла рабочего пространства будет изменена на вертикальную. Окно терминала, которое вы переместили вниз, напрямую подключено к рабочему пространству и отображается в нижней части экрана. Был создан новый (горизонтальный) контейнер для размещения двух других окон терминала. Вы заметите это при переключении в режим вкладок (например). В результате у вас будет одна вкладка с представлением контейнера раздела (например, «H[urxvt firefox]»), а другая — окно терминала, которое вы переместили вниз.

4. Настройка i3

Здесь начинается самое интересное ;-). Большинство настроек сильно зависят от идеальной рабочей среды, поэтому мы не можем установить разумные значения по умолчанию.

Хотя для настройки не используется язык программирования, i3 остается достаточно гибким в отношении действий, которые вы обычно хотите выполнять с менеджером окон.

Например, вы можете настроить сочетания клавиш для перехода к определенным окнам, назначить определенным приложениям запуск на конкретных рабочих пространствах, автоматически запускать приложения, изменять цвета i3 и назначать сочетания клавиш для выполнения полезных действий.

Для изменения конфигурации i3 скопируйте /etc/i3/config в ~/.i3/config (или ~/.config/i3/config, если вам нравится схема каталогов XDG) и отредактируйте ее с помощью текстового редактора.

При первом запуске (и при всех последующих запусках, если у вас нет файла конфигурации) i3 предложит вам создать файл конфигурации. Вы можете указать помощнику использовать клавишу Alt (Mod1) или Windows (Mod4) в качестве модификатора в файле конфигурации. Кроме того, созданный файл конфигурации будет использовать символы клавиш вашей текущей раскладки клавиатуры. Для запуска помощника используйте команду i3-config-wizard. Обратите внимание, что у вас не должно быть файла ~/.i3/config, иначе помощник завершит работу.

4.1. Директива include

С версии i3 v4.20 стало возможным включать другие файлы конфигурации из вашей конфигурации i3.

Синтаксис:

include <pattern>

i3 расширяет pattern с помощью подобного оболочке расширения слов, используя функцию стандартной библиотеки C wordexp(3).

Примеры:

# Tilde expands to the user’s home directory:
include ~/.config/i3/assignments.conf

# Environment variables are expanded:
include $HOME/.config/i3/assignments.conf

# Wildcards are expanded:
include ~/.config/i3/config.d/*.conf

# Command substitution:
include ~/.config/i3/`hostname`.conf

# i3 loads each path only once, so including the i3 config will not result
# in an endless loop, but in an error:
include ~/.config/i3/config

# i3 changes the working directory while parsing a config file
# so that relative paths are interpreted relative to the directory
# of the config file that contains the path:
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 в настоящее время не создает один большой файл конфигурации из всех директив include. Вместо этого анализатор файла конфигурации i3 интерпретирует все директивы конфигурации в своей функции parse_file(). При обработке директивы конфигурации include анализатор рекурсивно вызывает parse_file().

Это означает, что порядок оценки файлов образует дерево, или можно сказать, что i3 использует обход в глубину.

4.2. Комментарии

Использование комментариев в файле конфигурации для правильной документации вашей настройки для последующего использования рекомендуется. Комментарии начинаются с символа # и могут использоваться только в начале строки:

Примеры:

# This is a comment

4.3. Шрифты

i3 поддерживает как шрифты ядра X, так и шрифты FreeType (через Pango) для рендеринга заголовков окон.

Для генерации описания шрифта ядра X можно использовать xfontsel(1). Для отображения специальных символов (Unicode) необходимо использовать шрифт, поддерживающий кодировку ISO-10646.

Описание шрифта FreeType состоит из семейства шрифтов, стиля, веса, варианта, растяжения и размера. Шрифты FreeType поддерживают рендеринг справа налево и часто содержат больше символов Unicode, чем шрифты ядра X.

Если i3 не может открыть настроенный шрифт, он выведет ошибку в лог-файле и переключится на рабочий шрифт.

Синтаксис:

font <X core font description>
font pango:<family list> [<style options>] <size>

Примеры:

font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
font pango:DejaVu Sans Mono 10
font pango:DejaVu Sans Mono, Terminus Bold Semi-Condensed 11
font pango:Terminus 11px

4.4. Сочетания клавиш

Сочетание клавиш заставляет i3 выполнять команду (см. ниже) при нажатии определенной клавиши. i3 позволяет назначать сочетания клавиш как на кодах клавиш, так и на символах клавиш (вы также можете смешивать сочетания, хотя i3 не защитит вас от перекрывающихся).

  • Символ клавиши (keysym) — это описание конкретного символа, например, «a» или «b», но также и более странных, таких как «подчеркивание» вместо «_». Их вы используете в Xmodmap для переназначения клавиш. Чтобы получить текущую раскладку ваших клавиш, используйте xmodmap -pke. Для интерактивного ввода клавиши и просмотра назначенного ей символа клавиши используйте xev.

  • Коды клавиш не обязательно должны иметь назначенный символ (полезно для пользовательских горячих клавиш некоторых ноутбуков) и не будут изменять свое значение при переключении на другую раскладку клавиатуры (при использовании xmodmap).

Моя рекомендация: Если вы часто переключаете раскладки клавиатуры, но хотите сохранить свои сочетания в том же физическом расположении на клавиатуре, используйте коды клавиш. Если вы не переключаете раскладки и хотите чистый и простой файл конфигурации, используйте символы клавиш.

Некоторые инструменты (такие как xdotool) могут не работать при событии нажатия клавиши, потому что клавиатура все еще захвачена. В этих ситуациях можно использовать флаг --release, который выполнит команду после отпускания клавиш.

Синтаксис:

bindsym [--release] [<Group>+][<Modifiers>+]<keysym> command
bindcode [--release] [<Group>+][<Modifiers>+]<keycode> command

Примеры:

# Fullscreen
bindsym $mod+f fullscreen toggle

# Restart
bindsym $mod+Shift+r restart

# Notebook-specific hotkeys
bindcode 214 exec --no-startup-id /home/michael/toggle_beamer.sh

# Simulate ctrl+v upon pressing $mod+x
bindsym --release $mod+x exec --no-startup-id xdotool key --clearmodifiers ctrl+v

# Take a screenshot upon pressing $mod+x (select an area)
bindsym --release $mod+x exec --no-startup-id import /tmp/latest-screenshot.png

Доступные модификаторы:

Mod1-Mod5, Shift, Control

Стандартные модификаторы, см. xmodmap(1)

Group1, Group2, Group3, Group4

При использовании нескольких раскладок клавиатуры (например, с setxkbmap -layout us,ru), вы можете указать, в какой группе XKB (также называемой «раскладкой») должно быть активным сочетание клавиш. По умолчанию сочетания клавиш переводятся в Group1 и активны во всех группах. Если вы хотите переопределить сочетания клавиш в одной из ваших раскладок, укажите соответствующую группу. Для обратной совместимости группа «Mode_switch» является псевдонимом для Group2.

4.5. Сочетания мыши

Сочетание мыши заставляет i3 выполнять команду при нажатии определенной кнопки мыши в пределах нажатого контейнера (см. [command_criteria]). Настроить сочетания мыши можно аналогично сочетаниям клавиш.

Синтаксис:

bindsym [--release] [--border] [--whole-window] [--exclude-titlebar] [<Modifiers>+]button<n> command

По умолчанию сочетание выполняется только при щелчке по заголовку окна. Если задан флаг --release, оно выполнится при отпускании кнопки мыши.

Если задан флаг --whole-window, сочетание также выполнится при щелчке любой части окна, за исключением рамки. Чтобы сочетание выполнилось при щелчке по рамке, укажите флаг --border.

Если задан флаг --exclude-titlebar, заголовок не будет учитываться для сочетания клавиш.

Примеры:

# The middle button over a titlebar kills the window
bindsym --release button2 kill

# The middle button and a modifier over any part of the window kills the window
bindsym --whole-window $mod+button2 kill

# The right button toggles floating
bindsym button3 floating toggle
bindsym $mod+button3 floating toggle

# The side buttons move the window around
bindsym button9 move left
bindsym button8 move right

4.6. Режимы сочетаний

Вы можете иметь несколько наборов сочетаний, используя разные режимы сочетаний. При переключении на другой режим сочетаний все сочетания из текущего режима отменяются, и только сочетания, определенные в новом режиме, действительны до тех пор, пока вы остаетесь в этом режиме. Единственный предопределенный режим сочетаний — default, в котором i3 начинает работу и которому принадлежат все сочетания, не определенные в определенном режиме сочетаний.

Работа с режимами сочетаний состоит из двух частей: определения режима сочетаний и переключения на него. Для этих целей существует одна директива конфигурации и одна команда, обе называемые mode. Директива используется для определения сочетаний, принадлежащих определенному режиму сочетаний, а команда — для переключения на указанный режим.

Рекомендуется использовать режимы сочетаний в сочетании с [переменными] для облегчения обслуживания. Ниже приведен пример использования режима сочетаний.

Обратите внимание, что рекомендуется определять сочетания для возврата в режим по умолчанию.

Обратите внимание, что можно использовать [разметку pango] для режимов сочетаний, но вам нужно явно включить ее, передав флаг --pango_markup в определение режима.

Синтаксис:

# config directive
mode [--pango_markup] <name>

# command
mode <name>

Пример:

# Press $mod+o followed by either f, t, Escape or Return to launch firefox,
# thunderbird or return to the default mode, respectively.
set $mode_launcher Launch: [f]irefox [t]hunderbird
bindsym $mod+o mode "$mode_launcher"

mode "$mode_launcher" {
    bindsym f exec firefox
    bindsym t exec thunderbird

    bindsym Escape mode "default"
    bindsym Return mode "default"
}

4.7. Плавающая модификатор

Для перемещения плавающего окна с помощью мыши, вы можете либо взять за его заголовок, либо настроить так называемый плавающий модификатор, который затем вы можете нажать и щелкнуть где угодно в окне, чтобы переместить его. Наиболее распространенная настройка — использовать ту же клавишу, что и для управления окнами (например, Mod1). Затем вы можете нажать Mod1, щелкнуть по окну левой кнопкой мыши и перетащить его в нужное положение.

При удерживании плавающего модификатора вы можете изменить размер плавающего окна, нажав правой кнопкой мыши и перемещая его, удерживая нажатой. Если вы также удерживаете клавишу Shift, изменение размера будет пропорциональным (сохранится соотношение сторон).

Синтаксис:

floating_modifier <Modifier>

Пример:

floating_modifier Mod1

4.8. Ограничение размера плавающего окна

Можно указать максимальные и минимальные размеры плавающих окон. Если любой размер floating_maximum_size задан как -1, этот размер не будет ограничен максимальным значением. Если любой размер floating_maximum_size не определён или задан как 0, i3 будет использовать значение по умолчанию для ограничения максимального размера. floating_minimum_size обрабатывается аналогично floating_maximum_size.

Синтаксис:

floating_minimum_size <width> x <height>
floating_maximum_size <width> x <height>

Пример:

floating_minimum_size 75 x 50
floating_maximum_size -1 x -1

4.9. Ориентация новых рабочих пространств

Новые рабочие пространства получают разумную ориентацию по умолчанию: широкоформатные мониторы (любые шире, чем выше) получают горизонтальную ориентацию, повернутые мониторы (любые выше, чем шире) — вертикальную.

С помощью директивы конфигурации default_orientation вы можете переопределить это поведение.

Синтаксис:

default_orientation horizontal|vertical|auto

Пример:

default_orientation vertical

4.10. Режим компоновки для новых контейнеров

Этот параметр определяет, в каком режиме будут запускаться новые контейнеры на уровне рабочего пространства.

Синтаксис:

workspace_layout default|stacking|tabbed

Пример:

workspace_layout tabbed

4.11. Выравнивание заголовка окна

Этот параметр определяет выравнивание текста заголовка окна. По умолчанию left

Синтаксис:

title_align left|center|right

4.12. Стиль рамки по умолчанию для новых окон

Этот параметр определяет стиль рамки, который будет иметь новое окно. По умолчанию normal. Обратите внимание, что default_floating_border применяется только к окнам, которые изначально являются плавающими окнами, например, диалоговым окнам, но не к окнам, которые позже стали плавающими.

Установка стиля рамки на pixel удаляет панели заголовков в разбиениях. Стиль рамки normal позволяет настраивать ширину границы края, сохраняя панель заголовка.

Панель заголовка всегда отображается в стековом и вкладках, и это нельзя изменить через конфигурацию.

Синтаксис:

default_border normal|none|pixel
default_border normal|pixel <px>
default_floating_border normal|none|pixel
default_floating_border normal|pixel <px>

Обратите внимание, что new_window и new_float устарели и будут удалены в будущей версии. Мы настоятельно рекомендуем использовать новые параметры вместо них.

Пример:

default_border pixel

Стиль границ "normal" и "pixel" поддерживают необязательную ширину границы в пикселях:

Пример:

# The same as default_border none
default_border pixel 0

# A 3 px border
default_border pixel 3

4.13. Скрытие границ, прилегающих к краям экрана

Вы можете скрыть границы контейнера, прилегающие к краям экрана, используя hide_edge_borders (по умолчанию none). Скрытие границ полезно, если вы используете полосы прокрутки или не хотите тратить даже два пикселя на отображаемом пространстве.

Настройка «smart» скрывает границы на рабочих пространствах с только одним видимым окном, но сохраняет их на рабочих пространствах с несколькими видимыми окнами.

Настройка «smart_no_gaps» скрывает специфичные для края границы контейнера, если контейнер является единственным контейнером на рабочем пространстве, а зазоры до края экрана равны 0.

hide_edge_borders заменила старый синтаксис smart_borders. Используйте первый вместо последнего.

Синтаксис:

hide_edge_borders none|vertical|horizontal|both|smart|smart_no_gaps

Пример:

hide_edge_borders vertical

4.14. Произвольные команды для определенных окон (for_window)

С помощью директивы for_window вы можете позволить i3 выполнить любую команду при обнаружении определенного окна. Это может быть использовано, например, для задания окон в плавающем режиме или для изменения их стиля рамки.

Синтаксис:

for_window <criteria> <command>

Примеры:

# enable floating mode for all XTerm windows
for_window [class="XTerm"] floating enable

# Make all urxvts use a 1-pixel border:
for_window [class="urxvt"] border pixel 1

# A less useful, but rather funny example:
# makes the window floating as soon as I change
# directory to ~/work
for_window [title="x200: ~/work"] floating enable

Допустимые критерии такие же, как и для команд, см. [command_criteria]. Только команды могут выполняться во время выполнения, а не директивы конфигурации, см. [list_of_commands].

4.15. Не фокусировать окно при открытии

При появлении нового окна оно будет сфокусировано. Директива no_focus позволяет предотвратить это и должна использоваться в сочетании с [command_criteria].

Обратите внимание, что это не относится ко всем случаям, например, при вводе данных в работающее приложение, заставляющее его запросить фокус. Чтобы настроить поведение в таких случаях, обратитесь к [focus_on_window_activation].

no_focus также будет проигнорирован для первого окна на рабочем пространстве, так как нет причины не фокусировать окно в этом случае. Это позволяет улучшить удобство использования в сочетании с workspace_layout.

Синтаксис:

no_focus <criteria>

Пример:

no_focus [window_role="pop-up"]

4.16. Переменные

Как вы узнали в разделе о привязках к клавиатуре, вам придется настроить множество привязок, содержащих модификаторы. Если вы хотите сэкономить на вводе и иметь возможность изменить используемый модификатор позже, переменные могут быть полезны.

Синтаксис:

set $<name> <value>

Пример:

set $m Mod1
bindsym $m+Shift+r restart

Переменные непосредственно заменяются в файле при парсинге. Расширение переменных не рекурсивное, поэтому невозможно определить переменную со значением, содержащим другую переменную. Нет сложной обработки, и абсолютно нет планов по изменению этого. Если вам нужна более динамичная конфигурация, вы должны создать небольшой скрипт, который генерирует файл конфигурации и запустить его перед запуском i3 (например, в файле ~/.xsession).

См. также [xresources], чтобы узнать, как создавать переменные на основе ресурсов, загруженных из базы данных ресурсов X.

4.17. Ресурсы X

[переменные] также могут быть созданы, используя значение, настроенное в базе данных ресурсов X. Это полезно, например, для того, чтобы избежать настройки значений цвета в конфигурации i3. Вместо этого значения можно настроить один раз в базе данных ресурсов X, чтобы добиться легко поддерживаемой, согласованной цветовой темы во многих приложениях X.

Определение ресурса загрузит этот ресурс из базы данных ресурсов и присвоит его значение указанной переменной. Это делается дословно, и поэтому значение должно быть в формате, используемом i3. Должен быть указан запасной вариант на случай, если ресурс не может быть загружен из базы данных.

Синтаксис:

set_from_resource $<name> <resource_name> <fallback>

Пример:

# The ~/.Xresources should contain a line such as
#     *color0: #121212
# and must be loaded properly, e.g., by using
#     xrdb ~/.Xresources
# This value is picked up on by other applications (e.g., the URxvt terminal
# emulator) and can be used in i3 like this:
set_from_resource $black i3wm.color0 #000000

4.18. Автоматическое размещение клиентов на определённых рабочих пространствах

Для автоматического отображения определённого окна на конкретном рабочем пространстве можно использовать привязку. Окна можно сопоставлять по любым критериям, см. [command_criteria]. Разница между assign и for_window <criteria> move to workspace заключается в том, что первая команда выполняется только при отображении приложения (отображение означает фактическое отображение на экране), а вторая — каждый раз, когда свойства окна изменяются так, что соответствуют заданным критериям.

Поэтому рекомендуется сопоставлять окна по классам (и экземплярам, если это уместно) вместо названий окон, когда это возможно, поскольку некоторые приложения сначала создают своё окно, а затем заботятся о настройке правильного заголовка. Например, Firefox с Vimperator. Окно запускается под названием Firefox, и только когда загружается Vimperator, заголовок меняется. Поскольку i3 получит заголовок, как только приложение отобразит окно, вам придётся в этом случае сопоставлять Firefox. Ещё одна известная проблема связана со Spotify, который не устанавливает подсказки класса при отображении окна, что означает, что для привязки Spotify к определённому рабочему пространству вам нужно использовать правило for_window. Наконец, использование assign [tiling] и assign [floating] не поддерживается.

Также можно привязать окно к определённому выводу. Вы можете использовать имена RandR, такие как VGA1, или имена, относящиеся к выводу с текущим фокусным рабочим пространством, такие как left и down.

Привязки обрабатываются i3 в том порядке, в котором они появляются в файле конфигурации. Первая соответствующая привязка побеждает, и последующие привязки не рассматриваются.

Синтаксис:

assign <criteria> [→] [workspace] [number] <workspace>
assign <criteria> [→] output left|right|up|down|primary|nonprimary|<output>

Примеры:

# Assign URxvt terminals to workspace 2
assign [class="URxvt"] 2

# Same thing, but more precise (exact match instead of substring)
assign [class="^URxvt$"] 2

# Same thing, but with a beautiful arrow :)
assign [class="^URxvt$"] → 2

# Assignment to a named workspace
assign [class="^URxvt$"] → work

# Assign to the workspace with number 2, regardless of name
assign [class="^URxvt$"] → number 2

# You can also specify a number + name. If the workspace with number 2 exists,
# assign will skip the text part.
assign [class="^URxvt$"] → number "2: work"

# Start urxvt -name irssi
assign [class="^URxvt$" instance="^irssi$"] → 3

# Assign urxvt to the output right of the current one
assign [class="^URxvt$"] → output right

# Assign urxvt to the primary output
assign [class="^URxvt$"] → output primary

# Assign urxvt to the first non-primary output
assign [class="^URxvt$"] → output nonprimary

Обратите внимание, что у вас может ещё не быть настроено основное устройство вывода. Для этого выполните:

xrandr --output <output> --primary

Также стрелка не требуется, она просто выглядит хорошо :-). Если вы решите её использовать, она должна быть стрелкой в кодировке UTF-8, а не -> или чем-то подобным.

Чтобы получить класс и экземпляр, можно использовать xprop. После щелчка по окну вы увидите следующий вывод:

xprop:

WM_CLASS(STRING) = "irssi", "URxvt"

Первая часть WM_CLASS — это экземпляр («irssi» в данном примере), вторая — класс («URxvt» в данном примере).

Если у вас возникнут проблемы с привязками, сначала проверьте журнал i3 (см. https://i3wm.org/docs/debugging.html). Он содержит более подробную информацию о процессе сопоставления и фактическом классе, экземпляре и заголовке окна при запуске.

Обратите внимание, что если вы хотите запустить приложение только один раз на определённом рабочем пространстве, но не хотите постоянно привязывать все его экземпляры, вы можете использовать поддержку i3 по уведомлениям об открытии (см. [exec]) в файле конфигурации следующим образом:

Запуск iceweasel на рабочем пространстве 3 (один раз):

# Start iceweasel on workspace 3, then switch back to workspace 1
# (Being a command-line utility, i3-msg does not support startup notifications,
#  hence the exec --no-startup-id.)
# (Starting iceweasel with i3’s exec command is important in order to make i3
#  create a startup notification context, without which the iceweasel window(s)
#  cannot be matched onto the workspace on which the command was started.)
exec --no-startup-id i3-msg 'workspace 3; exec iceweasel; workspace 1'

4.19. Автоматический запуск приложений при запуске i3

Используя ключевое слово exec вне привязки клавиш, можно настроить команды, которые i3 будет выполнять при первоначальном запуске. Команды exec не будут выполняться при перезапуске i3; если вам нужна команда, которая будет выполняться и при перезапуске i3, используйте ключевое слово exec_always. Эти команды будут выполняться в порядке их следования.

См. [command_chaining] для получения подробной информации о специальном значении ; (точка с запятой) и , (запятая): они объединяют команды в i3, поэтому необходимо использовать строковые значения (как показано в [exec_quoting]), если эти символы встречаются в вашей команде.

Синтаксис:

exec [--no-startup-id] <command>
exec_always [--no-startup-id] <command>

Примеры:

exec chromium
exec_always ~/my_script.sh

# Execute the terminal emulator urxvt, which is not yet startup-notification aware.
exec --no-startup-id urxvt

Флаг --no-startup-id объяснён в [exec].

4.20. Автоматическое размещение рабочих пространств на определённых экранах

Если вы привязываете клиентов к рабочим пространствам, может быть полезно размещать рабочие пространства на определённых экранах. Кроме того, размещение рабочих пространств на экранах определяет, какое рабочее пространство i3 использует для нового экрана при добавлении экранов или запуске (например, по умолчанию он будет использовать 1 для первого экрана, 2 для второго и так далее).

Синтаксис:

workspace <workspace> output <output1> [output2]…

output — это имя объекта RandR вывода, к которому вы прикрепляете свой экран. На ноутбуке у вас могут быть выводы VGA1 и LVDS1. Вы можете увидеть доступные выводы, выполнив команду xrandr --current.

Если ваш сервер X поддерживает RandR 1.5 или более позднюю версию, i3 будет использовать объекты мониторов RandR вместо объектов вывода. Выведите список с помощью xrandr --listmonitors. Как правило, объект монитора содержит ровно один вывод и имеет то же имя, что и вывод; но если это не так, вы можете указать имя монитора или вывода в конфигурации i3. Например, Dell UP2414Q использует два внутренних преобразователя, поэтому его имена вывода могут быть «DP1» и «DP2», но имя монитора — «Dell UP2414Q».

(Обратите внимание, что даже если вы укажете имя вывода, которое не охватывает весь монитор, i3 всё равно будет использовать всю область содержащего монитора, а не только область вывода.)

Вы можете указать несколько выводов. Будет использован первый доступный.

Если вы используете именованные рабочие пространства, их нужно заключить в кавычки.

Примеры:

workspace 1 output LVDS1
workspace 2 output primary
workspace 5 output VGA1 LVDS1
workspace "2: vim" output VGA1

4.21. Изменение цветов

Можно изменить все цвета, которые i3 использует для рисования декораций окна.

Синтаксис:

<colorclass> <border> <background> <text> <indicator> <child_border>

Где colorclass может быть одним из следующих:

client.focused

Клиент, который в данный момент имеет фокус.

client.focused_inactive

Клиент, который является фокусным для своего контейнера, но в данный момент не имеет фокуса.

client.focused_tab_title

Заголовок вкладки или контейнера стека, который является родителем фокусного контейнера, но не имеет фокуса непосредственно. По умолчанию устанавливается focused_inactive, если не указано иное, и не использует цвета индикатора и границы подконтейнера.

client.unfocused

Клиент, который не является фокусным для своего контейнера.

client.urgent

Клиент, у которого включена подсказка срочности.

client.placeholder

Используются цвета фона и текста для рисования содержимого плацехолдера окна (при восстановлении макетов). Граница и индикатор игнорируются.

client.background

Цвет фона, который будет использоваться для отрисовки фона окна клиента поверх которого будет отрисован клиент. Только клиенты, которые не покрывают всю область этого окна, отображают цвет. Обратите внимание, что этот colorclass принимает только один цвет.

Цвета в формате HTML (шестнадцатеричном формате #rrggbb, необязательно #rrggbbaa), см. пример ниже:

Примеры (значения по умолчанию):

# class                 border  backgr. text    indicator child_border
client.focused          #4c7899 #285577 #ffffff #2e9ef4   #285577
client.focused_inactive #333333 #5f676a #ffffff #484e50   #5f676a
client.unfocused        #333333 #222222 #888888 #292d2e   #222222
client.urgent           #2f343a #900000 #ffffff #900000   #900000
client.placeholder      #000000 #0c0c0c #ffffff #000000   #0c0c0c

client.background       #ffffff

Обратите внимание, что для декораций окна цвет вокруг дочернего окна — это «child_border», а цвет «border» — только две тонкие линии вокруг заголовка.

Цвет индикатора используется для обозначения места открытия нового окна. Для горизонтальных контейнеров разделения по горизонтали правая граница будет окрашиваться в цвет индикатора, для вертикальных контейнеров — нижняя граница. Это относится только к отдельным окнам внутри контейнера разделения, которые в противном случае неотличимы от отдельных окон вне контейнера разделения.

4.22. Межпроцессное взаимодействие

i3 использует сокеты Unix для предоставления интерфейса IPC. Это позволяет сторонним программам получать информацию от i3, такую как текущие рабочие пространства (для отображения панели рабочих пространств) и управлять i3.

По умолчанию сокет IPC будет создан в $XDG_RUNTIME_DIR/i3/ipc-socket.%p, если каталог доступен, в противном случае по умолчанию в /tmp/i3-%u.XXXXXX/ipc-socket.%p, где %u — ваш имя пользователя в Unix, %p — PID i3, а XXXXXX — строка случайных символов из набора допустимых символов для имён файлов (см. mkdtemp(3)).

Вы можете переопределить путь по умолчанию через переменную среды I3SOCK или путём указания директивы ipc-socket. Это не рекомендуется, так как i3 делает правильный выбор по умолчанию. Если вы всё же решите его изменить, настоятельно рекомендуется установить его в расположении в вашей домашней директории, чтобы другие пользователи не могли создать этот каталог.

Примеры:

ipc-socket ~/.i3/i3-ipc.sock

Затем вы можете использовать приложение i3-msg для выполнения любой команды, перечисленной в [list_of_commands].

4.23. Фокус следует за мышью

По умолчанию, фокус окна следует за перемещениями мыши, когда курсор пересекает границы окна. Однако, если у вас есть конфигурация, где ваша мышь часто находится на пути (например, тачпад на вашем ноутбуке, который вы не хотите полностью отключать), вы можете отключить слежение фокуса за мышью и управлять фокусом только с помощью клавиатуры. Мышь по-прежнему будет полезна внутри активного окна (например, для нажатия на ссылки в окне браузера).

Синтаксис:

focus_follows_mouse yes|no

Пример:

focus_follows_mouse no

4.24. Изменение положения курсора мыши

По умолчанию, при переключении фокуса на окно на другом выводе (например, фокусировка окна на рабочем столе 3 на выводе VGA-1, приходящем с рабочего стола 2 на LVDS-1), курсор мыши перемещается в центр этого окна.

С помощью параметра mouse_warping вы можете управлять, когда следует перемещать курсор мыши. none полностью отключает перемещение, в то время как output — это стандартное поведение, описанное выше.

Синтаксис:

mouse_warping output|none

Пример:

mouse_warping none

4.25. Появление всплывающих окон в полноэкранном режиме

Когда вы находитесь в полноэкранном режиме, некоторые приложения всё ещё открывают всплывающие окна (например, Xpdf). Это связано с тем, что эти приложения могут не знать, что они находятся в полноэкранном режиме (они не проверяют соответствующий признак). i3 поддерживает четыре варианта для этой ситуации:

  1. smart: Отобразить всплывающее окно, если оно принадлежит только приложению в полноэкранном режиме. Это значение по умолчанию и должно быть разумным поведением для большинства пользователей.

  2. ignore: Просто игнорировать всплывающее окно (не отображать его). Это не будет прерывать вас, когда вы находитесь в полноэкранном режиме. Однако некоторые приложения могут плохо на это реагировать (тупик, пока вы не выйдите из полноэкранного режима).

  3. leave_fullscreen: Выйти из полноэкранного режима.

  4. all: Начиная с i3 4.24: Отобразить все плавающие окна независимо от приложения, к которому они относятся.

Синтаксис:

popup_during_fullscreen smart|ignore|leave_fullscreen|all

Пример:

popup_during_fullscreen smart

4.26. Переключение фокуса

По умолчанию, при работе в контейнере с несколькими окнами или дочерними контейнерами, фокус переключается на противоположное окно при попытке переместить фокус за край контейнера (если в этом направлении нет других контейнеров) — фокус переносится.

При необходимости, можно отключить это поведение, установив директиву конфигурации focus_wrapping в значение no.

Если включено, переключение фокуса не происходит по умолчанию, если в указанном направлении есть другое окно или контейнер, вместо этого фокус будет установлен на это окно или контейнер. Это стандартное поведение, так что вы можете перемещаться по всем вашим окнам, не прибегая к использованию focus parent.

Если вы хотите, чтобы фокус всегда переключался и знаете, что используете focus parent для переключения между различными контейнерами, вы можете установить focus_wrapping в значение force.

Чтобы ограничить фокус текущим рабочим столом, установите focus_wrapping в значение workspace. Вам нужно будет использовать focus parent, пока рабочий стол не будет выбран, чтобы переключаться на другой рабочий стол с помощью команд фокуса (команда workspace всё ещё будет работать как ожидается).

Синтаксис:

focus_wrapping yes|no|force|workspace

# Legacy syntax, equivalent to "focus_wrapping force"
force_focus_wrapping yes

Примеры:

# Disable focus wrapping
focus_wrapping no

# Force focus wrapping
focus_wrapping force

4.27. Принудительное использование Xinerama

Как подробно описано в https://i3wm.org/docs/multi-monitor.html, некоторые драйверы видео X11 (особенно двоичный драйвер nVidia) поддерживают только Xinerama, а не RandR. В такой ситуации i3 необходимо явно указать использовать менее совершенный API Xinerama, и поэтому не предоставляет поддержку переконфигурации экранов на лету (они считываются только один раз при запуске и всё).

Для пользователей, которые не могут изменить ~/.xsession для добавления параметра командной строки --force-xinerama, предоставляется параметр конфигурации:

Синтаксис:

force_xinerama yes|no

Пример:

force_xinerama yes

Также обратите внимание, что имена ваших выводов не являются описательными (например, HDMI1) при использовании Xinerama, а вместо этого нумеруются, начиная с 0: xinerama-0, xinerama-1, …

4.28. Автоматическое возвращение при переключении на текущий рабочий стол

Эта директива конфигурации включает автоматическое workspace back_and_forth (см. [back_and_forth]) при переключении на рабочий стол, который в данный момент активен.

Например: Предположим, вы находитесь на рабочем столе "1: www" и переключаетесь на "2: IM" с помощью mod+2, потому что вам пришло сообщение. Вам не нужно помнить, откуда вы пришли, теперь вы можете просто нажать $mod+2 снова, чтобы вернуться на "1: www".

Синтаксис:

workspace_auto_back_and_forth yes|no

Пример:

workspace_auto_back_and_forth yes

4.29. Задержка сброса подсказки срочности при изменении рабочего стола

Если приложение на другом рабочем столе устанавливает подсказку срочности, переход на этот рабочий стол может привести к немедленному фокусированию приложения, что также означает, что цвет декорации окна будет немедленно сброшен на client.focused. Это может сделать необоснованно сложным определить, какое окно первоначально вызвало событие.

Для предотвращения этого, вы можете указать i3 задерживать сброс состояния срочности на определённое время, используя директиву force_display_urgency_hint. Установка значения 0 отключает эту функцию.

Значение по умолчанию — 500 миллисекунд.

Синтаксис:

force_display_urgency_hint <timeout> ms

Пример:

force_display_urgency_hint 500 ms

4.30. Фокус при активации окна

Если окно активируется, например, с помощью google-chrome www.google.com, оно может запросить фокус. Поскольку это может быть нежелательным, можно настроить различные реакции.

Обратите внимание, что это может не повлиять на окна, которые открываются. Чтобы предотвратить фокусировку новых окон, см. [no_focus].

Синтаксис:

focus_on_window_activation smart|urgent|focus|none

Различные режимы будут действовать следующим образом:

smart

Это стандартное поведение. Если окно, запрашивающее фокус, находится на активном рабочем столе, оно получит фокус. В противном случае будет установлена подсказка срочности.

urgent

Окно всегда будет помечено как срочное, но фокус не будет украден.

focus

Окно всегда будет фокусировано и не будет помечено как срочное.

none

Окно не будет ни фокусировано, ни помечено как срочное.

4.31. Отображение меток на декоре окна

Если активировано, метки (см. [vim_like_marks]) на окнах отображаются в их декоре. Однако любая метка, начинающаяся с нижнего подчеркивания (_) в своём имени, не будет отображаться, даже если этот параметр активирован.

Значение по умолчанию для этого параметра — yes.

Синтаксис:

show_marks yes|no

Пример:

show_marks yes

4.32. Продолжение строк

Файлы конфигурации поддерживают продолжение строк, означающее, что при окончании строки символом обратного слэша (\), перевод строки будет проигнорирован парсером. Эта функция может быть использована для создания более читаемых файлов конфигурации. Комментируемые строки не продолжаются.

Примеры:

bindsym Mod1+f \
fullscreen toggle

# this line is not continued \
bindsym Mod1+F fullscreen toggle

4.33. Перетаскивание в режиме укладки

Вы можете настроить, как инициировать функцию перетаскивания в режиме укладки (см. [tiling_drag]).

По умолчанию — modifier.

Начиная с i3 4.24, вы можете настроить модификаторную клавишу, которая при нажатии будет переключать, а не перемещать контейнеры при непосредственном опускании на другой контейнер. По умолчанию — Shift. Обратите внимание, что вы должны удерживать и клавишу плавающего режима, и клавишу переключения перед началом перетаскивания.

Синтаксис:

tiling_drag off
tiling_drag modifier|titlebar [modifier|titlebar]
tiling_drag swap_modifier <modifier>

Примеры:

# Only initiate a tiling drag when the modifier is held:
tiling_drag modifier

# Initiate a tiling drag on either titlebar click or held modifier:
tiling_drag modifier titlebar

# Disable tiling drag altogether
tiling_drag off

# Use Control to swap containers
tiling_drag swap_modifier Control

# Setting the swap_modifier to be the same key as the floating modifier will
# always swap without the need to hold two keys
floating_modifier Mod4
tiling_drag swap_modifier Mod4

4.34. Промежутки

Начиная с i3 4.22, вы можете настроить промежутки между окнами. «Промежутки» — это добавленное расстояние между окнами (или разделительными контейнерами) и краями экрана:

Screenshot of i3 with gaps enabled (10 px inner gaps, 20 px outer gaps)
Рисунок 5. Промежутки включены (внутренние промежутки 10 пикселей, внешние промежутки 20 пикселей)

Вы можете настроить два типа промежутков:

  1. Внутренние промежутки — это расстояние между двумя смежными окнами (или разделительными контейнерами).

  2. Внешние промежутки — это расстояние по краям экрана. Вы можете настроить каждое направление (слева, справа, сверху, снизу) отдельно.

Если вы знакомы с HTML и CSS, вы можете представить внутренние промежутки как padding, а внешние промежутки как margin, применённые к <div> вокруг вашего окна или разделительного контейнера.

Обратите внимание, что внешние промежутки добавляются к внутренним, то есть общий размер промежутка между краем экрана и окном (или разделительным контейнером) будет суммой внешних и внутренних промежутков.

Вы можете определить промежутки глобально или на рабочем пространстве, используя следующий синтаксис.

Синтаксис:

# Inner gaps for all windows: space between two adjacent windows (or split containers).
gaps inner <gap_size>[px]

# Outer gaps for all windows: space along the screen edges.
gaps outer|horizontal|vertical|top|left|bottom|right <gap_size>[px]

# Inner and outer gaps for all windows on a specific workspace.
# <ws> can be a workspace number or name.
workspace <ws> gaps inner <gap_size>[px]
workspace <ws> gaps outer|horizontal|vertical|top|left|bottom|right <gap_size>[px]

# Enabling “Smart Gaps” means no gaps will be shown when there is
# precisely one window or split container on the workspace.
#
# inverse_outer only enables outer gaps when there is exactly one
# window or split container on the workspace.
smart_gaps on|off|inverse_outer

Внешние промежутки можно настроить для каждого направления индивидуально с помощью директив top, left, bottom и right. horizontal и vertical — это сокращения для left/right и top/bottom соответственно.

Пример:

# Configure 5px of space between windows and to the screen edges.
gaps inner 5px

# Configure an additional 5px of extra space to the screen edges,
# for a total gap of 10px to the screen edges, and 5px between windows.
gaps outer 5px

# Overwrite gaps to 0, I need all the space I can get on workspace 3.
workspace 3 gaps inner 0
workspace 3 gaps outer 0

# Only enable outer gaps when there is exactly one window or split container on the workspace.
smart_gaps inverse_outer

Подсказка: Промежутки можно дополнительно изменить во время выполнения с помощью команды gaps, см. [changing_gaps].

Подсказка: Вы можете найти пример конфигурации здесь, которая использует режимы для демонстрации различных конфигураций промежутков.

5. Настройка i3bar

Панель в нижней части вашего монитора отрисовывается отдельным процессом, называемым i3bar. Использование отдельного процесса для этой части «пользовательского интерфейса i3» имеет несколько преимуществ:

  1. Это модульный подход. Если вам вообще не нужна панель рабочего стола или вы предпочитаете другую (dzen2, xmobar, возможно, даже gnome-panel?), вы можете просто удалить конфигурацию i3bar и запустить вашу любимую панель вместо нее.

  2. Это следует философии UNIX «Пусть каждая программа делает одну вещь хорошо». В то время как i3 хорошо управляет вашими окнами, i3bar хорошо отображает панель на каждом мониторе (если вы не настроите его иначе).

  3. Это приводит к двум отдельным, чистым кодовым базам. Если вы хотите понять i3, вам не нужно углубляться в детали i3bar и наоборот.

При этом i3bar настраивается в том же файле конфигурации, что и i3. Это связано с тем, что он тесно связан с i3 (в отличие от i3lock или i3status, которые полезны для людей, использующих другие менеджеры окон). Поэтому нет смысла использовать другое место для конфигурации, когда у нас уже есть хорошая инфраструктура конфигурации.

Настройка вашей панели рабочего стола начинается с открытия блока bar. Вы можете иметь несколько блоков bar, чтобы использовать разные настройки для разных выходов (мониторов):

Пример:

bar {
    status_command i3status
}

5.1. Команда i3bar

По умолчанию i3 просто передаст i3bar и позволит вашей оболочке обработать выполнение, выполнив поиск правильной версии в $PATH. Если у вас где-то другой i3bar или бинарный файл отсутствует в $PATH, вы можете указать i3, что нужно выполнить.

Указанная команда будет передана sh -c, поэтому вы можете использовать подстановку шаблонов и должны правильно указывать кавычки и т. д.

Синтаксис:

i3bar_command <command>

Пример:

bar {
    i3bar_command /home/user/bin/i3bar
}

5.2. Команда строки состояния

i3bar может запускать программу и отображать каждую строку ее вывода stdout в правой части панели. Это полезно для отображения системной информации, такой как ваш текущий IP-адрес, состояние батареи или дата/время.

Указанная команда будет передана sh -c, поэтому вы можете использовать подстановку шаблонов и должны правильно указывать кавычки и т. д. Обратите внимание, что для обработки сигналов, в зависимости от вашей оболочки (пользователи оболочки dash(1) известны тем, что подвержены влиянию), вы должны использовать команду exec оболочки, чтобы сигналы передавались вашей программе, а не оболочке.

Синтаксис:

status_command <command>

Пример:

bar {
    status_command i3status --config ~/.i3status.conf

    # For dash(1) users who want signal handling to work:
    status_command exec ~/.bin/my_status_command
}

5.3. Команда кнопок рабочих пространств

Начиная с i3 4.23, i3bar может запускать программу и использовать ее вывод stdout для определения кнопок рабочих пространств, отображаемых в левой части панели. С помощью этой функции, например, вы можете переименовать кнопки рабочих пространств, скрыть определенные рабочие пространства, всегда показывать кнопку рабочего пространства, даже если рабочее пространство не существует, или изменить порядок кнопок.

Также см. [status_command] для параметра statusline и https://i3wm.org/docs/i3bar-workspace-protocol.html для подробного протокола.

Синтаксис:

workspace_command <command>

Пример:

bar {
    workspace_command /path/to/script.sh
}

5.4. Режим отображения

Вы можете либо постоянно отображать i3bar на одном краю экрана (режим «панель»), либо делать его видимым при нажатии клавиши модификатора (режим «скрывать»). Также можно заставить i3bar всегда оставаться скрытым (режим «невидимый»). Клавиша модификатора может быть настроена с помощью параметра modifier.

Параметр режима может быть изменён во время выполнения с помощью команды bar mode. При перезагрузке режим будет возвращён к своему настроенному значению.

Режим «скрывать» максимизирует пространство экрана, которое может быть использовано для фактических окон. Когда панель скрыта, i3bar отправляет сигналы SIGSTOP и SIGCONT процессу status_command для экономии заряда батареи. Эта функция может быть отключена процессом status_command путём установки соответствующих значений в его сообщении заголовка JSON.

Режим «невидимый» позволяет постоянно максимизировать пространство экрана, так как панель никогда не отображается. Таким образом, вы можете настроить i3bar так, чтобы он не беспокоил вас, появляясь из-за подсказки срочности или из-за нажатия клавиши модификатора.

Для управления скрытием или отображением i3bar в режиме «скрывать» существует параметр hidden_state, который не имеет эффекта в режиме «панель» или «невидимый». Он указывает текущее состояние скрытия панели: (1) Панель ведет себя как в обычном режиме «скрывать», она скрыта и отображается только в случае подсказок срочности или при нажатии клавиши модификатора (состояние «hide»), или (2) она отображается поверх текущего видимого рабочего пространства (состояние «show»).

Как и режим, состояние hidden_state также может быть контролировано через i3, это можно сделать с помощью команды bar hidden_state.

По умолчанию используется режим «панель»; в режиме «скрывать» клавишей модификатора по умолчанию является Mod4 (обычно клавиша Windows). Значение по умолчанию для hidden_state — hide.

Синтаксис:

mode dock|hide|invisible
hidden_state hide|show
modifier <Modifier>|none

Пример:

bar {
    mode hide
    hidden_state hide
    modifier Mod1
}

Доступные модификаторы — Mod1-Mod5, Shift, Control (см. xmodmap(1)). Вы также можете использовать «none», если не хотите, чтобы какое-либо действие модификатора вызывало это поведение.

5.5. Команды кнопок мыши

Указывает команду для выполнения при нажатии кнопки на i3bar, чтобы переопределить стандартное поведение. Это полезно, например, для отключения действия колесика мыши или запуска скриптов, которые реализуют пользовательское поведение для этих кнопок.

Кнопка всегда называется button<n>, где 1-5 — это стандартные кнопки, как указано ниже, а более высокие числа могут быть специальными кнопками на устройствах с большим количеством кнопок:

button1

Левая кнопка мыши.

button2

Средняя кнопка мыши.

button3

Правая кнопка мыши.

button4

Прокрутка колесика мыши вверх.

button5

Прокрутка колесика мыши вниз.

button6

Прокрутка колесика мыши вправо.

button7

Прокрутка колесика мыши влево.

Обратите внимание, что старые команды wheel_up_cmd и wheel_down_cmd устарели и будут удалены в будущей версии. Мы настоятельно рекомендуем использовать более универсальную команду bindsym с button4 и button5 вместо этого.

Синтаксис:

bindsym [--release] button<n> <command>

Пример:

bar {
    # disable clicking on workspace buttons
    bindsym button1 nop
    # Take a screenshot by right clicking on the bar
    bindsym --release button3 exec --no-startup-id import /tmp/latest-screenshot.png
    # execute custom script when scrolling downwards
    bindsym button5 exec ~/.i3/scripts/custom_wheel_down
}

5.6. ID панели

Указывает ID панели для настроенного экземпляра панели. Если этот параметр отсутствует, ID устанавливается в bar-x, где x соответствует позиции встраиваемого блока панели в файле конфигурации (bar-0, bar-1, …).

Синтаксис:

id <bar_id>

Пример:

bar {
    id bar-1
}

5.7. Позиция

Этот параметр определяет, на каком краю экрана i3bar должен отображаться.

По умолчанию — снизу.

Синтаксис:

position top|bottom

Пример:

bar {
    position top
}

5.8. Выход(ы)

Вы можете ограничить i3bar одним или несколькими выходами (мониторами). По умолчанию обрабатываются все выходы. Ограничение выходов полезно для использования разных параметров для разных выходов, используя несколько блоков bar.

Чтобы сделать определённый экземпляр i3bar обработчиком нескольких выходов, укажите директиву output несколько раз.

Эти имена выходов имеют специальное значение:

primary

Выбирает выход, который настроен как основной в сервере X.

nonprimary

Выбирает все выходы, которые не настроены как основные в сервере X.

Синтаксис:

output primary|nonprimary|<output>

Пример:

# big monitor: everything
bar {
    # The display is connected either via HDMI or via DisplayPort
    output HDMI2
    output DP2
    status_command i3status
}

# laptop monitor: bright colors and i3status with less modules.
bar {
    output LVDS1
    status_command i3status --config ~/.i3status-small.conf
    colors {
        background #000000
        statusline #ffffff
    }
}

# show bar on the primary monitor and on HDMI2
bar {
    output primary
    output HDMI2
    status_command i3status
}

Обратите внимание, что у вас может ещё не быть основного выхода. Чтобы его создать, выполните:

xrandr --output <output> --primary

5.9. Вывод трея

i3bar по умолчанию предоставляет область системного трея, где программы, такие как NetworkManager, VLC, Pidgin и т. д., могут размещать маленькие значки.

Вы можете настроить, на каком выводе (мониторе) должны отображаться значки, или полностью отключить эту функцию.

Вы можете использовать несколько директив tray_output в своей конфигурации, чтобы указать список выводов, на которых должен отображаться трей. Первый доступный вывод в этом списке, как определено порядком директив, будет использован для вывода трея.

Синтаксис:

tray_output none|primary|<output>

Пример:

# disable system tray
bar {
    tray_output none
}

# show tray icons on the primary monitor
bar {
    tray_output primary
}

# show tray icons on the big monitor
bar {
    tray_output HDMI2
}

Обратите внимание, что у вас может еще не быть основного вывода. Для его настройки выполните:

xrandr --output <output> --primary

Обратите внимание, что при использовании нескольких блоков конфигурации панели, необходимо указать tray_output primary во всех из них или явно указать tray_output none в панелях, которые не должны отображать трей, в противном случае разные экземпляры могут конкурировать друг с другом при попытке отобразить значки трея.

5.10. Отступ трея

Трей отображается справа от панели. По умолчанию используются отступы в 2 пикселя для верхней, нижней и правой стороны области трея и между отдельными значками.

Синтаксис:

tray_padding <px> [px]

Пример:

# Obey Fitts's law
tray_padding 0

5.11. Шрифт

Указывает шрифт, который будет использоваться в панели. См. [шрифты].

Синтаксис:

font <font>

Пример:

bar {
    font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
    font pango:DejaVu Sans Mono 10
}

5.12. Пользовательский символ разделителя

Указывает пользовательский символ, который будет использоваться для разделителя, в отличие от вертикального разделителя толщиной один пиксель.

Синтаксис:

separator_symbol <symbol>

Пример:

bar {
    separator_symbol ":|:"
}

5.13. Кнопки рабочих пространств

Указывает, должны ли отображаться кнопки рабочих пространств или нет. Это полезно, если вы хотите отобразить только панель состояния, содержащую дополнительную информацию.

По умолчанию кнопки рабочих пространств отображаются.

Синтаксис:

workspace_buttons yes|no

Пример:

bar {
    workspace_buttons no
}

5.14. Минимальная ширина для кнопок рабочих пространств

По умолчанию ширина кнопки рабочего пространства определяется шириной текста, отображающего имя рабочего пространства. Если имя слишком короткое (например, одна буква), то кнопка рабочего пространства может выглядеть слишком маленькой.

Этот параметр задает минимальную ширину для кнопок рабочих пространств. Если имя рабочего пространства слишком короткое, чтобы покрыть кнопку, с обеих сторон кнопки добавляется дополнительный отступ, чтобы текст был центрирован.

Значение по умолчанию ноль означает, что дополнительный отступ не добавляется.

Настройка также применяется к индикатору текущего режима связывания.

Обратите внимание, что указанные пиксели относятся к логическим пикселям, которые могут переводиться в большее количество пикселей на дисплеях с высокой плотностью пикселей.

Синтаксис:

workspace_min_width <px> [px]

Пример:

bar {
    workspace_min_width 40
}

5.15. Удаление номеров/имен рабочих пространств

Указывает, должны ли отображаться номера рабочих пространств в кнопках рабочих пространств. Это полезно, если вы хотите иметь именованное рабочее пространство, которое сохраняется в порядке на панели в соответствии с его номером без отображения префикса номера.

Когда strip_workspace_numbers установлено в yes, любое рабочее пространство, имеющее имя в формате "[n][:][NAME]", будет отображать только имя. Например, вы можете использовать это, чтобы отобразить римские цифры вместо цифр, присвоив своим рабочим пространствам имена "1:I", "2:II", "3:III", "4:IV" и т. д.

Когда strip_workspace_name установлено в yes, любое рабочее пространство, имеющее имя в формате "[n][:][NAME]", будет отображать только номер.

По умолчанию отображается полное имя в кнопке рабочего пространства. Обратите внимание, что двоеточие в имени рабочего пространства является необязательным, поэтому [n][NAME] также будет корректно удалять имя и номер рабочего пространства.

Синтаксис:

strip_workspace_numbers yes|no
strip_workspace_name yes|no

Пример:

bar {
    strip_workspace_numbers yes
}

5.16. Индикатор режима связывания

Указывает, должен ли отображаться индикатор текущего режима связывания. Это полезно, если вы хотите скрыть кнопки рабочих пространств, но по-прежнему иметь возможность видеть индикатор текущего режима связывания. См. [режимы_связывания], чтобы узнать, что такое режимы и как их использовать.

По умолчанию индикатор режима отображается.

Синтаксис:

binding_mode_indicator yes|no

Пример:

bar {
    binding_mode_indicator no
}

5.17. Цвета

Как и в i3, цвета указаны в формате HTML (шестнадцатеричном формате #rrggbb, необязательно #rrggbbaa). На данный момент можно настроить следующие цвета:

background

Цвет фона панели.

statusline

Цвет текста, используемый для строки состояния.

separator

Цвет текста, используемый для разделителя.

focused_background

Цвет фона панели на выводе текущего фокусированного монитора. Если не используется, цвет будет взят из background.

focused_statusline

Цвет текста, используемый для строки состояния на выводе текущего фокусированного монитора. Если не используется, цвет будет взят из statusline.

focused_separator

Цвет текста, используемый для разделителя на выводе текущего фокусированного монитора. Если не используется, цвет будет взят из separator.

focused_workspace

Цвет границы, фона и текста для кнопки рабочего пространства, когда рабочее пространство имеет фокус.

active_workspace

Цвет границы, фона и текста для кнопки рабочего пространства, когда рабочее пространство активно (видимо) на каком-либо выводе, но фокус находится на другом. Вы можете отличить его от фокусированного рабочего пространства только при использовании нескольких мониторов.

inactive_workspace

Цвет границы, фона и текста для кнопки рабочего пространства, когда рабочее пространство не имеет фокуса и не активно (невидимо) ни на одном выводе. Это будет характерно для большинства рабочих пространств.

urgent_workspace

Цвет границы, фона и текста для кнопки рабочего пространства, когда рабочее пространство содержит окно с установленным атрибутом срочности.

binding_mode

Цвет границы, фона и текста для индикатора режима связывания. Если не используется, цвета будут взяты из urgent_workspace.

Синтаксис:

colors {
    background <color>
    statusline <color>
    separator <color>

    <colorclass> <border> <background> <text>
}

Пример (стандартные цвета):

bar {
    colors {
        background #000000
        statusline #ffffff
        separator #666666

        focused_workspace  #4c7899 #285577 #ffffff
        active_workspace   #333333 #5f676a #ffffff
        inactive_workspace #333333 #222222 #888888
        urgent_workspace   #2f343a #900000 #ffffff
        binding_mode       #2f343a #900000 #ffffff
    }
}

5.18. Прозрачность

i3bar может поддерживать прозрачность, передавая флаг --transparency в конфигурации:

Синтаксис:

bar {
    i3bar_command i3bar --transparency
}

В конфигурации цветов i3bar и атрибуте цвета блока состояния i3bar вы можете затем использовать цвета в формате RGBA, т. е. последние две (шестнадцатеричные) цифры указывают на непрозрачность. Например, #00000000 будет полностью прозрачным, а #000000FF — полностью непрозрачным черным (так же, как #000000).

Обратите внимание, что из-за того, как работает спецификация трея, включение этого флага приведет к тому, что все значки трея будут иметь прозрачный фон.

5.19. Отступы

Чтобы сделать i3bar выше (не увеличивая размер шрифта) и/или добавить отступы слева и справа от i3bar, можно использовать директиву padding:

Синтаксис:

bar {
    # 2px left/right and 2px top/bottom padding
    padding 2px

    # 2px top/bottom padding, no left/right padding
    padding 2px 0

    # 2px top padding, no left/right padding, 4px bottom padding
    padding 2px 0 4px

    # four value syntax
    padding top[px] right[px] bottom[px] left[px]
}

Примеры:

bar {
    # 2px left/right and 2px top/bottom padding
    padding 2px

    # 2px top/bottom padding, no left/right padding
    padding 2px 0

    # 2px top padding, no left/right padding, 4px bottom padding
    padding 2px 0 4px

    # 2px top padding, 6px right padding, 4px bottom padding, 1px left padding
    padding 2px 6px 4px 1px
}

Примечание: для удобства пользователей, мигрирующих из i3-gaps в i3, директива height из i3-gaps поддерживается i3, но должна быть изменена на padding.

6. Список команд

Команды — это то, к чему вы привязываете определённые нажатия клавиш. Вы также можете выполнять команды во время работы, не нажимая клавиши, используя интерфейс IPC. Легкий способ сделать это — использовать утилиту i3-msg:

Пример:

# execute this on your shell to make the current container borderless
i3-msg border none

Команды могут быть объединены с помощью ; (точка с запятой). Таким образом, чтобы переместить окно на определённый рабочий стол и немедленно переключиться на него, вы можете настроить следующее сочетание клавиш:

Пример:

bindsym $mod+x move container to workspace 3; workspace 3

Кроме того, вы можете изменить область действия команды — то есть, какие контейнеры должны быть затронуты этой командой, используя различные критерии. Критерии указываются перед любой командой в паре квадратных скобок и отделяются друг от друга пробелом.

При использовании нескольких команд разделяйте их запятой , (запятая) вместо точки с запятой. Критерии действуют только до следующей точки с запятой, поэтому если вы используете точку с запятой для разделения команд, только первая из них будет выполнена для соответствующих окон.

Пример:

# if you want to kill all windows which have the class Firefox, use:
bindsym $mod+x [class="Firefox"] kill

# same thing, but case-insensitive
bindsym $mod+x [class="(?i)firefox"] kill

# kill only the About dialog from Firefox
bindsym $mod+x [class="Firefox" window_role="About"] kill

# kill all windows except for Firefox and Gnome Terminal.
# case-insensitive and uses negative lookaheads, supported by PCRE
bindsym $mod+x [class="^(?i)(?!firefox)(?!gnome-terminal).*"] kill

# enable floating mode and move container to workspace 4
for_window [class="^evil-app$"] floating enable, move container to workspace 4

# enable window icons for all windows with extra horizontal padding of 1px
for_window [all] title_window_icon padding 1px

# move all floating windows to the scratchpad
bindsym $mod+x [floating] move scratchpad

В настоящее время реализованы следующие критерии:

all

Соответствует всем окнам. Этот критерий не требует значения.

class

Сравнивает класс окна (вторая часть WM_CLASS). Используйте специальное значение __focused__ для соответствия всем окнам, имеющим тот же класс окна, что и текущее активное окно.

instance

Сравнивает экземпляр окна (первая часть WM_CLASS). Используйте специальное значение __focused__ для соответствия всем окнам, имеющим тот же экземпляр окна, что и текущее активное окно.

window_role

Сравнивает роль окна (WM_WINDOW_ROLE). Используйте специальное значение __focused__ для соответствия всем окнам, имеющим ту же роль окна, что и текущее активное окно.

window_type

Сравните тип окна (_NET_WM_WINDOW_TYPE). Возможные значения: normal, dialog, utility, toolbar, splash, menu, dropdown_menu, popup_menu, tooltip и notification.

machine

Сравнивает имя машины, на которой выполняется клиентское окно (WM_CLIENT_MACHINE). Обычно оно равно имени хоста локальной машины, но может отличаться при использовании удалённых приложений X11.

id

Сравнивает идентификатор окна X11, который можно получить, например, с помощью xwininfo.

title

Сравнивает заголовок окна X11 (_NET_WM_NAME или WM_NAME в качестве резервного варианта). Используйте специальное значение __focused__ для соответствия всем окнам, имеющим тот же заголовок окна, что и текущее активное окно.

urgent

Сравнивает состояние окна в режиме ожидания. Может быть "latest" или "oldest". Соответствует последнему или самому старому окну в режиме ожидания соответственно. (Также доступны следующие псевдонимы: newest, last, recent, first)

workspace

Сравнивает имя рабочего стола, к которому принадлежит окно. Используйте специальное значение __focused__ для соответствия всем окнам на текущем рабочем столе.

con_mark

Сравнивает метки, установленные для этого контейнера, см. [vim_like_marks]. Соответствие происходит, если хотя бы одна из меток контейнера соответствует заданной метке.

con_id

Сравнивает внутренний идентификатор контейнера i3, который можно получить через интерфейс IPC. Удобно для скриптов. Используйте специальное значение __focused__ для соответствия только текущему активному окну.

floating

Соответствует только плавающим окнам. Этот критерий не требует значения.

floating_from

Как floating, но этот критерий принимает два возможных значения: "auto" и "user". При "auto" соответствуют только окна, которые были автоматически открыты как плавающие. При "user" — только окна, которые пользователь сделал плавающими.

tiling

Соответствует только окнам с размещением. Этот критерий не требует значения.

tiling_from

Как tiling, но этот критерий принимает два возможных значения: "auto" и "user". При "auto" соответствуют только окна, которые были автоматически открыты с размещением. При "user" — только окна, которые пользователь сделал с размещением.

Критерии class, instance, role, title, workspace, machine и mark фактически являются регулярными выражениями (PCRE). Для получения информации о способе их использования см. pcresyntax(3) или perldoc perlre.

6.1. Запуск приложений (exec)

Что толку от менеджера окон, если вы не можете запускать приложения? Команда exec запускает приложение, передавая команду, которую вы указали, в оболочку. Это означает, что вы можете использовать подстановку (метасимволы), и программы будут искать в переменной среды $PATH.

См. [command_chaining] для получения дополнительной информации о специальном значении ; (точка с запятой) и , (запятая): они объединяют команды в i3, поэтому вам необходимо использовать строковые значения в кавычках (как показано в [exec_quoting]), если они встречаются в вашей команде.

Синтаксис:

exec [--no-startup-id] <command>

Пример:

# Start the GIMP
bindsym $mod+g exec gimp

# Start the terminal emulator urxvt which is not yet startup-notification-aware
bindsym $mod+Return exec --no-startup-id urxvt

Параметр --no-startup-id отключает поддержку уведомлений о запуске для этой конкретной команды exec. С помощью уведомлений о запуске i3 может убедиться, что окно появляется на том рабочем столе, на котором вы выполнили команду exec. Кроме того, он изменит курсор X11 на watch (часы) во время запуска приложения. Таким образом, если приложение не поддерживает уведомления о запуске (хотя большинство приложений, использующих GTK и Qt, кажутся такими), вы получите курсор часов на 60 секунд.

Если выполняемая команда содержит ; (точку с запятой) и/или , (запятую), вся команда должна быть заключена в кавычки. Например, чтобы создать сочетание клавиш для команды оболочки notify-send Hello, i3, вы бы добавили запись в свой конфигурационный файл следующим образом:

Пример:

# Execute a command with a comma in it
bindsym $mod+p exec "notify-send Hello, i3"

Однако, если сама команда с запятой и/или точкой с запятой требует кавычек, внутренние кавычки необходимо экранировать двойными обратными слешами, как в этом примере:

Пример:

# Execute a command with a comma, semicolon and internal quotes
bindsym $mod+p exec "notify-send \\"Hello, i3; from $USER\\""

6.2. Разделение контейнеров

Команда split делает текущее окно контейнером с разделением. Контейнеры с разделением могут содержать несколько окон. В зависимости от макета контейнера с разделением новые окна размещаются справа от текущего (splith) или под текущим (splitv).

Если вы применяете эту команду к контейнеру с разделением с той же ориентацией, ничего не произойдёт. Если вы используете другую ориентацию, ориентация контейнера с разделением будет изменена (если в нём не более одного окна). Опция toggle переключает ориентацию контейнера с разделением, если он содержит одно окно. В противном случае она делает текущее окно контейнером с разделением с ориентацией, противоположной ориентации родительского контейнера. Используйте layout toggle split для изменения макета любого контейнера с разделением с splitv на splith или наоборот. Вы также можете определить собственную последовательность макетов для циклического перехода с помощью layout toggle, см. [manipulating_layout].

Синтаксис:

split vertical|horizontal|toggle

Пример:

bindsym $mod+v split vertical
bindsym $mod+h split horizontal
bindsym $mod+t split toggle

6.3. Изменение макета

Используйте layout toggle split, layout stacking, layout tabbed, layout splitv или layout splith для изменения текущего макета контейнера на splith/splitv, stacking, tabbed, splitv или splith соответственно.

Укажите до четырёх макетов после layout toggle для циклического перехода по ним. При каждом выполнении команды будет применяться макет, указанный после текущего активного. Если текущий активный макет не в списке, будет активирован первый макет в списке.

Чтобы сделать текущее окно (!) полноэкранным, используйте fullscreen enable (или fullscreen enable global для глобального режима), чтобы выйти из полноэкранного режима, используйте fullscreen disable, и чтобы переключаться между этими состояниями, используйте fullscreen toggle (или fullscreen toggle global).

Аналогично, чтобы сделать текущее окно плавающим (или снова с размещением), используйте floating enable соответственно floating disable (или floating toggle):

Синтаксис:

layout default|tabbed|stacking|splitv|splith
layout toggle [split|all]
layout toggle [split|tabbed|stacking|splitv|splith] [split|tabbed|stacking|splitv|splith]…

Примеры:

bindsym $mod+s layout stacking
bindsym $mod+l layout toggle split
bindsym $mod+w layout tabbed

# Toggle between stacking/tabbed/split:
bindsym $mod+x layout toggle

# Toggle between stacking/tabbed/splith/splitv:
bindsym $mod+x layout toggle all

# Toggle between stacking/tabbed/splith:
bindsym $mod+x layout toggle stacking tabbed splith

# Toggle between splitv/tabbed
bindsym $mod+x layout toggle splitv tabbed

# Toggle between last split layout/tabbed/stacking
bindsym $mod+x layout toggle split tabbed stacking

# Toggle fullscreen
bindsym $mod+f fullscreen toggle

# Toggle floating/tiling
bindsym $mod+t floating toggle

6.4. Контейнеры фокусировки

Для изменения фокуса вы можете использовать команду focus. Доступны следующие опции:

<criteria>

Устанавливает фокус на контейнер, соответствующий заданным критериям. См. [command_criteria].

workspace

Устанавливает фокус на рабочий стол, содержащий контейнер, соответствующий заданным критериям.

left|right|up|down

Устанавливает фокус на ближайший контейнер в заданном направлении.

parent

Устанавливает фокус на родительский контейнер текущего контейнера.

child

Обратная команда focus parent, устанавливает фокус на последний сфокусированный дочерний контейнер.

next|prev

Автоматически устанавливает фокус на смежный контейнер. Если указано sibling, команда сфокусирует точный смежный контейнер, включая нелистовые контейнеры, такие как контейнеры разделения. В противном случае это автоматический вариант focus left|right|up|down в ориентации родительского контейнера.

floating

Устанавливает фокус на последний сфокусированный плавающий контейнер.

tiling

Устанавливает фокус на последний сфокусированный контейнер в режиме разбиения.

mode_toggle

Переключает режим между плавающими/разбитыми контейнерами.

output

Последовательность направления или имени вывода, устанавливающая фокус на соответствующий вывод.

Синтаксис:

<criteria> focus
<criteria> focus workspace
focus left|right|down|up
focus parent|child|floating|tiling|mode_toggle
focus next|prev [sibling]
focus output left|right|down|up|current|primary|nonprimary|next|<output1> [output2]…

Примеры:

# Focus firefox
bindsym $mod+F1 [class="Firefox"] focus

# Focus the workspace where firefox is, without necessarily focusing firefox
# itself.
bindsym $mod+x [class="Firefox"] focus workspace

# Focus container on the left, bottom, top, right
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right

# Focus parent container
bindsym $mod+u focus parent

# Focus last floating/tiling container
bindsym $mod+g focus mode_toggle

# Focus the next output (effectively toggles when you only have two outputs)
bindsym $mod+x focus output next

# Focus the output right to the current one
bindsym $mod+x focus output right

# Focus the big output
bindsym $mod+x focus output HDMI-2

# Focus the primary output
bindsym $mod+x focus output primary

# Cycle focus through non-primary outputs
bindsym $mod+x focus output nonprimary

# Cycle focus between outputs VGA1 and LVDS1 but not DVI0
bindsym $mod+x focus output VGA1 LVDS1

Обратите внимание, что у вас может ещё не быть основного вывода. Для его настройки выполните:

xrandr --output <output> --primary

6.5. Перемещение контейнеров

Используйте команду move для перемещения контейнера.

Синтаксис:

# Moves the container into the given direction.
# The optional pixel argument specifies how far the
# container should be moved if it is floating and
# defaults to 10 pixels. The optional ppt argument
# means "percentage points", and if specified it indicates
# how many points the container should be moved if it is
# floating rather than by a pixel value.
move <left|right|down|up> [<amount> [px|ppt]]

# Moves the container to the specified pos_x and pos_y
# coordinates on the screen.
move position <pos_x> [px|ppt] <pos_y> [px|ppt]

# Moves the container to the center of the screen.
# If 'absolute' is used, it is moved to the center of
# all outputs.
move [absolute] position center

# Moves the container to the current position of the
# mouse cursor. Only affects floating containers.
move position mouse

Примеры:

# Move container to the left, bottom, top, right
bindsym $mod+j move left
bindsym $mod+k move down
bindsym $mod+l move up
bindsym $mod+semicolon move right

# Move container, but make floating containers
# move more than the default
bindsym $mod+j move left 20 px

# Move floating container to the center of all outputs
bindsym $mod+c move absolute position center

# Move container to the current position of the cursor
bindsym $mod+m move position mouse

6.6. Перемещение контейнеров

Два контейнера можно поменять местами (т.е. переместить их в позицию друг друга) с помощью команды swap. Они примут позицию и геометрию контейнера, с которым произошла замена.

Первый контейнер для обмена можно выбрать, используя стандартный процесс критериев команды, а если нет критериев, то по умолчанию используется сфокусированное окно. Второй контейнер можно выбрать одним из следующих способов:

id

Идентификатор окна X11 клиентского окна.

con_id

Идентификатор контейнера i3.

mark

Контейнер с указанной меткой, см. [vim_like_marks].

Обратите внимание, что обмен не работает со всеми контейнерами. В частности, обмен контейнеров, имеющих родительско-дочерние отношения, невозможен.

Синтаксис:

swap container with id|con_id|mark <arg>

Примеры:

# Swaps the focused container with the container marked »swapee«.
swap container with mark swapee

# Swaps container marked »A« and »B«
[con_mark="^A$"] swap container with mark B

6.7. Прилипающие плавающие окна

Если вы хотите, чтобы окно прилипало к экрану, т.е. оставалось на экране, даже если вы переключаетесь на другой рабочий стол, вы можете использовать команду sticky. Например, это может быть полезно для заметок, медиаплеера или окна видеочата.

Обратите внимание, что, хотя любое окно можно сделать прилипающим с помощью этой команды, это произойдёт только если окно плавающее.

Синтаксис:

sticky enable|disable|toggle

Примеры:

# make a terminal sticky that was started as a notepad
for_window [instance=notepad] sticky enable

6.8. Изменение (именованных) рабочих столов/переход на рабочие столы

Для перехода на определённый рабочий стол используйте команду workspace и номер или имя рабочего стола. Передайте необязательный флаг --no-auto-back-and-forth для отключения [workspace_auto_back_and_forth] только для этого вызова.

Для перемещения контейнеров на определённые рабочие столы используйте move container to workspace.

Вы также можете переключаться на следующий и предыдущий рабочий стол с помощью команд workspace next и workspace prev, что удобно, например, если у вас рабочие столы 1, 3, 4 и 9, и вы хотите прокручивать их с помощью одной комбинации клавиш. Чтобы ограничить их текущим выводом, используйте workspace next_on_output и workspace prev_on_output. Аналогично, вы можете использовать move container to workspace next, move container to workspace prev для перемещения контейнера на следующий/предыдущий рабочий стол и move container to workspace current (последняя команда имеет смысл только при использовании с критериями).

workspace next циклически перебирает пронумерованные или именованные рабочие столы. Но когда он достигает последнего пронумерованного/именованного рабочего стола, он ищет именованные рабочие столы после исчерпания пронумерованных и ищет пронумерованные после исчерпания именованных.

См. [move_to_outputs] для перемещения контейнера/рабочего стола на другой экран RandR.

Имена рабочих столов анализируются как Pango разметка i3bar.

Чтобы вернуться к ранее сфокусированному рабочему столу, используйте workspace back_and_forth, аналогично, вы можете переместить контейнеры на ранее сфокусированный рабочий стол с помощью move container to workspace back_and_forth.

Синтаксис:

workspace next|prev|next_on_output|prev_on_output
workspace back_and_forth
workspace [--no-auto-back-and-forth] <name>
workspace [--no-auto-back-and-forth] number <name>

move [--no-auto-back-and-forth] [window|container] [to] workspace <name>
move [--no-auto-back-and-forth] [window|container] [to] workspace number <name>
move [window|container] [to] workspace prev|next|current

Примеры:

bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3:<span foreground="red">vim</span>
...

bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
...

# switch between the current and the previously focused one
bindsym $mod+b workspace back_and_forth
bindsym $mod+Shift+b move container to workspace back_and_forth

# move the whole workspace to the next output
bindsym $mod+x move workspace to output right

# move firefox to current workspace
bindsym $mod+F1 [class="Firefox"] move workspace current

6.8.1. Именованные рабочие столы

Рабочие столы идентифицируются по имени. Таким образом, вместо использования чисел в команде рабочего стола, вы можете использовать произвольное имя:

Пример:

bindsym $mod+1 workspace mail
...

Если вы хотите, чтобы рабочий стол имел номер и имя, просто добавьте префикс к номеру, например:

Пример:

bindsym $mod+1 workspace 1: mail
bindsym $mod+2 workspace 2: www
...

Обратите внимание, что рабочий стол фактически будет называться «1: почта». i3 обрабатывает имена рабочих столов, начинающиеся с цифры, немного особым образом. Обычно именованные рабочие столы упорядочиваются в том порядке, в котором они появились. Когда они начинаются с числа, i3 упорядочит их по числовому значению. Кроме того, вы сможете использовать workspace number 1, чтобы перейти на рабочий стол, начинающийся с цифры 1, независимо от его имени. Это полезно в случае, если вы динамически изменяете имя рабочего стола. Чтобы объединить обе команды, вы можете использовать workspace number 1: почта, чтобы указать имя по умолчанию, если в данный момент нет рабочего стола, начинающегося с «1».

6.8.2. Переименование рабочих столов

Вы можете переименовывать рабочие столы. Это может быть полезно, если вы начинаете с пронумерованных рабочих столов, выполняете свою работу и затем переименовываете рабочие столы, чтобы они отражали то, что на них фактически находится. Вы также можете опустить старое имя, чтобы переименовать текущий сфокусированный рабочий стол. Это удобно, если вы хотите использовать команду переименования с i3-input.

Синтаксис:

rename workspace <old_name> to <new_name>
rename workspace to <new_name>

Примеры:

i3-msg 'rename workspace 5 to 6'
i3-msg 'rename workspace 1 to "1: www"'
i3-msg 'rename workspace "1: www" to "10: www"'
i3-msg 'rename workspace to "2: mail"'
bindsym $mod+r exec i3-input -F 'rename workspace to "%s"' -P 'New name: '

Если вы хотите переименовывать рабочие столы по мере необходимости, сохраняя стабильность навигации, вы можете использовать такую настройку:

Пример:

bindsym $mod+1 workspace number "1: www"
bindsym $mod+2 workspace number "2: mail"
...

Если рабочий стол не существует, команда workspace number "1: почта" создаст рабочий стол «1: почта».

Если рабочий стол с номером 1 уже существует, команда переключит на него и проигнорирует текстовую часть. Таким образом, даже если рабочий стол был переименован в «1: веб», вышеприведённая команда всё равно переключится на него. Команда workspace 1, однако, создаст и переместит на новый рабочий стол «1» наряду с существующим «1: почта».

6.9. Перемещение рабочих столов на другой экран

См. [move_to_outputs] для перемещения контейнера/рабочего стола на другой экран RandR.

6.10. Перемещение контейнеров/рабочих пространств на выходы RandR

Для перемещения контейнера на другой выход RandR (адресуемый именами, такими как LVDS1 или VGA1), или на выход RandR, определяемый конкретным направлением (таким как left, right, up или down), существуют две команды:

Синтаксис:

move container to output left|right|down|up|current|primary|nonprimary|next|<output1> [output2]…
move workspace to output left|right|down|up|current|primary|nonprimary|next|<output1> [output2]…

Примеры:

# Move the current workspace to the next output
# (effectively toggles when you only have two outputs)
bindsym $mod+x move workspace to output next

# Cycle this workspace between outputs VGA1 and LVDS1 but not DVI0
bindsym $mod+x move workspace to output VGA1 LVDS1

# Put this window on the presentation output.
bindsym $mod+x move container to output VGA1

# Put this window on the primary output.
bindsym $mod+x move container to output primary

Если вы указываете более одного выхода, контейнер/рабочее пространство циклически переключается между ними: если оно уже находится на одном из выходов в списке, оно переместится на следующий выход в списке. Если оно находится на выходе, не указанном в списке, оно переместится на первый указанный выход. Несуществующие выходы пропускаются.

Обратите внимание, что у вас может пока не быть настроенного первичного выхода. Для этого выполните:

xrandr --output <output> --primary

6.11. Перемещение контейнеров/окон в метки

Для перемещения контейнера в другой контейнер с определённой меткой (см. [vim_like_marks]), можно использовать следующую команду.

Окно будет перемещено сразу после помеченного контейнера в дереве, т.е. оно окажется в том же положении, как если бы вы открыли новое окно, когда помеченный контейнер был фокусирован. Если метка находится на разделительном контейнере, окно появится как новый дочерний элемент после текущего фокусированного дочернего элемента в этом контейнере.

Синтаксис:

move window|container to mark <mark>

Пример:

for_window [instance="tabme"] move window to mark target

6.12. Изменение размера контейнеров/окон

Если вы хотите изменить размер контейнеров/окон с помощью клавиатуры, вы можете использовать команду resize:

Синтаксис:

resize grow|shrink <direction> [<px> px [or <ppt> ppt]]
resize set [width] <width> [px | ppt]
resize set height <height> [px | ppt]
resize set [width] <width> [px | ppt] [height] <height> [px | ppt]

Направление может быть одним из up, down, left или right. Или вы можете быть менее конкретны и использовать width или height, в этом случае i3 возьмёт/отдаст место у других контейнеров. Необязательный аргумент пикселей указывает, на сколько пикселей контейнер должен быть увеличен или уменьшен (по умолчанию 10 пикселей). Необязательный аргумент ppt означает «процентные пункты», и если он указан, он указывает, что контейнер с выкладкой должен быть увеличен или уменьшен на это количество пунктов, а не на значение px.

Примечание по resize set: значение 0 для <width> или <height> означает «не изменять размер в этом направлении».

Рекомендуется определить привязки для изменения размера в отдельном режиме привязки. См. [binding_modes] и пример в стандартной конфигурации i3 для получения дополнительной информации.

Пример:

for_window [class="urxvt"] resize set 640 480

6.13. Переход к определённым окнам

Часто в многомониторной среде вам нужно быстро перейти к определённому окну. Например, работая на рабочем пространстве 3, вы можете захотеть перейти к своему почтовому клиенту, чтобы написать своему боссу, что вы достигли важной цели. Вместо того, чтобы разбираться, как перейти к вашему почтовому клиенту, было бы удобнее иметь ярлык. Вы можете использовать команду focus с критериями для этого.

Синтаксис:

[class="class"] focus
[title="title"] focus

Примеры:

# Get me to the next open VIM instance
bindsym $mod+a [class="urxvt" title="VIM"] focus

6.14. Метки в стиле VIM (пометить/перейти)

Эта функция похожа на функцию перехода: она позволяет вам напрямую перейти к определённому окну (это означает переключение на соответствующее рабочее пространство и установка фокуса на окна). Однако вы можете напрямую отметить определённое окно произвольным ярлыком и использовать его в дальнейшем. Вы можете удалить ярлык аналогичным образом, используя команду unmark. Если вы не указываете ярлык, unmark удаляет все метки. Вам не нужно гарантировать, что ваши окна имеют уникальные классы или заголовки, и вам не нужно изменять файл конфигурации.

Поскольку команда должна включать ярлык, с помощью которого вы хотите отметить окно, вы не можете просто привязать её к клавише. i3-input — это инструмент, созданный для этой цели: он позволяет ввести команду и отправляет её в i3. Он также может префикс этой команды и отобразить пользовательский запрос для диалога ввода.

Дополнительный параметр --toggle удалит метку, если окно уже имеет эту метку, или добавит её в противном случае. Обратите внимание, что вам может потребоваться использовать его в сочетании с --add (см. ниже), так как любые другие метки в противном случае будут удалены.

Флаг --replace заставляет i3 удалить все существующие метки, что также является стандартным поведением. Вы можете использовать флаг --add, чтобы добавить на окно более одной метки.

См. [show_marks], если вы не хотите отображать метки в декоре окна.

Синтаксис:

mark [--add|--replace] [--toggle] <identifier>
[con_mark="identifier"] focus
unmark <identifier>

Вы можете использовать i3-input для запроса имени метки, а затем использовать команды mark и focus для создания и перехода к пользовательским меткам:

Примеры:

# read 1 character and mark the current window with this character
bindsym $mod+m exec i3-input -F 'mark %s' -l 1 -P 'Mark: '

# read 1 character and go to the window with the character
bindsym $mod+g exec i3-input -F '[con_mark="%s"] focus' -l 1 -P 'Goto: '

В качестве альтернативы, если вы не хотите работать с i3-input, вы можете создать отдельные привязки для определённого набора ярлыков и использовать только эти ярлыки:

Пример (в терминале):

# marks the focused container
mark irssi

# focus the container with the mark "irssi"
'[con_mark="irssi"] focus'

# remove the mark "irssi" from whichever container has it
unmark irssi

# remove all marks on all firefox windows
[class="(?i)firefox"] unmark

6.15. Формат заголовка окна

По умолчанию i3 просто выведет заголовок окна X11. С помощью title_format это можно настроить, установив формат в соответствии с желаемым выводом. Эта директива поддерживает разметку Pango и следующие плейсхолдеры, которые будут заменены:

%title

Для обычных окон это заголовок окна X11 (_NET_WM_NAME или WM_NAME в качестве резервного варианта). При использовании на контейнерах без окна (например, разделительный контейнер внутри табулированного/слоистого макета), это будет представление дерева контейнера (например, «H[xterm xterm]»).

%class

Класс окна X11 (вторая часть WM_CLASS). Это соответствует критерию class, см. [command_criteria].

%instance

Инстанс окна X11 (первая часть WM_CLASS). Это соответствует критерию instance, см. [command_criteria].

%machine

Имя машины X11 (WM_CLIENT_MACHINE). Это соответствует критерию machine, см. [command_criteria].

Используя директиву [for_window], вы можете установить формат заголовка для любого окна на основе [command_criteria].

Синтаксис:

title_format <format>

Примеры:

# give the focused window a prefix
bindsym $mod+p title_format "Important | %title"

# print all window titles bold
for_window [class=".*"] title_format "<b>%title</b>"

# print window titles of firefox windows red
for_window [class="(?i)firefox"] title_format "<span foreground='red'>%title</span>"

6.16. Иконка заголовка окна

По умолчанию i3 не отображает значок окна в строке заголовка.

Начиная с i3 v4.20, вы можете по желанию включить значки окон либо для определённых окон, либо для всех окон (используя директиву [for_window]).

Синтаксис:

title_window_icon <yes|no|toggle>
title_window_icon <padding|toggle> <px>

Примеры:

# show the window icon for the focused window to make it stand out
bindsym $mod+p title_window_icon on

# enable window icons for all windows
for_window [all] title_window_icon on

# enable window icons for all windows with extra horizontal padding
for_window [all] title_window_icon padding 3px

6.17. Изменение стиля рамки

Чтобы изменить рамку текущего клиента, вы можете использовать border normal для использования обычной рамки (включая заголовок окна), border pixel 1 для использования рамки толщиной 1 пиксель (без заголовка окна) и border none для того, чтобы сделать клиент безрамочным.

Также есть border toggle, который будет переключать различные стили рамок. Необязательный аргумент пикселей можно использовать для указания ширины рамки при переключении на обычные и пиксельные стили.

Обратите внимание, что «пиксель» относится к логическому пикселю. На HiDPI-дисплеях логический пиксель представлен несколькими физическими пикселями, поэтому pixel 1 может не обязательно переводиться в рамку толщиной в один физический пиксель.

Синтаксис:

border normal|pixel|toggle [<n>]
border none

# legacy syntax, equivalent to "border pixel 1"
border 1pixel

Примеры:

# use window title, but no border
bindsym $mod+t border normal 0
# use no window title and a thick border
bindsym $mod+y border pixel 3
# use window title *and* a thick border
bindsym $mod+y border normal 3
# use neither window title nor border
bindsym $mod+u border none
# no border on VLC
for_window [class="vlc"] border none

Чтобы изменить значение по умолчанию для всех окон, см. директиву [default_border].

6.18. Включение ведения журнала в общей памяти

Как описано в https://i3wm.org/docs/debugging.html, i3 может вести журнал в буфере общей памяти, который вы можете выгрузить с помощью i3-dump-log. Команда shmlog позволяет включать или отключать ведение журнала в общей памяти во время выполнения.

Обратите внимание, что при использовании shmlog <size_in_bytes> текущий журнал будет удалён, и будет начат новый.

Синтаксис:

shmlog <size_in_bytes>
shmlog on|off|toggle

Примеры:

# Enable/disable logging
bindsym $mod+x shmlog toggle

# or, from a terminal:
# increase the shared memory log buffer to 50 MiB
i3-msg shmlog $((50*1024*1024))

6.19. Включение отладки логирования

Команда debuglog позволяет включить или отключить отладку логирования во время выполнения. Отладка логирования гораздо более подробна, чем обычное логирование. Эта команда не активирует логирование с общей памятью (shmlog), и поэтому, скорее всего, полезна в сочетании с описанной выше командой [shmlog].

Синтаксис:

debuglog on|off|toggle

Примеры:

# Enable/disable logging
bindsym $mod+x debuglog toggle

6.20. Перезагрузка/Перезапуск/Выход

Вы можете перегрузить файл конфигурации i3 с помощью команды reload. Также вы можете перезапустить i3 на месте с помощью команды restart, чтобы вывести его из какого-то странного состояния (если такое случится) или выполнить обновление без перезагрузки вашей сессии X. Для правильного выхода из i3 можно использовать команду exit, но это не обязательно (достаточно просто убить вашу сессию X).

Примеры:

bindsym $mod+Shift+r restart
bindsym $mod+Shift+w reload
bindsym $mod+Shift+e exit

6.21. Блокнот

Есть две команды для использования любого существующего окна как окна блокнота. move scratchpad переместит окно на рабочее пространство блокнота. Это сделает его невидимым до тех пор, пока вы его снова не покажете. Нет способа открыть это рабочее пространство. Вместо этого, при использовании scratchpad show, окно будет показано снова как плавающее окно, центрированное на текущем рабочем пространстве (использование scratchpad show с видимым окном блокнота сделает его невидимым снова, поэтому у вас может быть сочетание клавиш для переключения). Обратите внимание, что это просто обычное плавающее окно, поэтому, если вы хотите «убрать его из блокнота», вы можете просто сделать его снова прикрепленным к рабочему пространству (floating toggle).

Как следует из названия, это полезно для того, чтобы окно с вашим любимым редактором всегда было под рукой. Однако вы также можете использовать это для других постоянно работающих приложений, которые вы не хотите видеть всё время: ваш музыкальный проигрыватель, alsamixer, возможно, даже ваш почтовый клиент…?

Синтаксис:

move scratchpad

scratchpad show

Примеры:

# Make the currently focused window a scratchpad
bindsym $mod+Shift+minus move scratchpad

# Show the first scratchpad window
bindsym $mod+minus scratchpad show

# Show the sup-mail scratchpad window, if any.
bindsym mod4+s [title="^Sup ::"] scratchpad show

6.22. Nop

Есть команда без операции nop, которая позволяет переопределить стандартное поведение. Это может быть полезно, например, для отключения изменения фокуса при щелчке средней кнопкой мыши.

Необязательный аргумент comment игнорируется, но будет напечатан в файл журнала для отладки.

Синтаксис:

nop [<comment>]

Пример:

# Disable focus change for clicks on titlebars
# with the middle mouse button
bindsym button2 nop

6.23. Управление i3bar

Есть две опции в конфигурации каждого экземпляра i3bar, которые можно изменить во время выполнения, вызвав команду через i3. Команды bar hidden_state и bar mode позволяют установить текущие значения опций hidden_state соответственно mode каждого бара. Также возможно переключаться между состоянием скрытия и отображения, а также между режимом док-станции и скрытым режимом. Каждый экземпляр i3bar можно контролировать индивидуально, указав идентификатор бара; если он не указан, команда выполняется для всех экземпляров баров.

Синтаксис:

bar hidden_state hide|show|toggle [<bar_id>]

bar mode dock|hide|invisible|toggle [<bar_id>]

Примеры:

# Toggle between hide state and show state
bindsym $mod+m bar hidden_state toggle

# Toggle between dock mode and hide mode
bindsym $mod+n bar mode toggle

# Set the bar instance with id 'bar-1' to switch to hide mode
bindsym $mod+b bar mode hide bar-1

# Set the bar instance with id 'bar-1' to always stay hidden
bindsym $mod+Shift+b bar mode invisible bar-1

6.24. Изменение отступов

Отступы можно изменить во время выполнения с помощью следующего синтаксиса команды:

Синтаксис:

# Inner gaps: space between two adjacent windows (or split containers).
gaps inner current|all set|plus|minus|toggle <gap_size_in_px>
# Outer gaps: space along the screen edges.
gaps outer|horizontal|vertical|top|right|bottom|left current|all set|plus|minus|toggle <gap_size_in_px>

С помощью current или all вы можете изменить отступы либо только для текущего фокусированного, либо для всех существующих рабочих пространств (обратите внимание, что это не влияет на глобальную конфигурацию).

Примеры:

gaps inner all set 20
gaps outer current plus 5
gaps horizontal current plus 40
gaps outer current toggle 60

for_window [class="vlc"] gaps inner 0, gaps outer 0

Чтобы изменить отступы для всех окон, см. директиву конфигурации [gaps].

7. Несколько мониторов

Как вы можете видеть в списке целей на веб-сайте, i3 был специально разработан с учетом поддержки нескольких мониторов. Этот раздел объяснит, как обращаться с несколькими мониторами.

Когда у вас только один монитор, всё просто. Обычно вы начинаете с рабочего пространства 1 на вашем мониторе и открываете новые по мере необходимости.

Когда у вас более одного монитора, каждый монитор получит начальное рабочее пространство. Первый монитор получит 1, второй — 2, а возможный третий — 3. Когда вы переключаетесь на рабочее пространство на другом мониторе, i3 переключится на этот монитор, а затем на рабочее пространство. Таким образом, вам не нужны ярлыки для переключения на определённый монитор, и вам не нужно запоминать, где вы разместили какое рабочее пространство. Новые рабочие пространства будут открываться на текущем активном мониторе. Невозможно иметь монитор без рабочего пространства.

Идея сделать рабочие пространства глобальными основана на наблюдении, что у большинства пользователей ограниченное количество рабочих пространств на дополнительных мониторах. Они часто используются для конкретной задачи (браузер, оболочка) или для мониторинга нескольких вещей (почта, IRC, syslog и т. д.). Таким образом, использование одного рабочего пространства на одном мониторе и «остальных» на других мониторах часто имеет смысл. Однако, поскольку вы можете создать неограниченное количество рабочих пространств в i3 и привязать их к определённым экранам, вы можете использовать «традиционный» подход с X рабочими пространствами на экране, изменив свою конфигурацию (например, используя режимы).

7.1. Настройка ваших мониторов

Чтобы помочь вам начать работу, если вы раньше не использовали несколько мониторов, вот краткий обзор опций xrandr, которые, вероятно, вам будут интересны. Всегда полезно получить обзор текущей конфигурации экрана. Просто запустите «xrandr», и вы получите вывод, похожий на следующий:

$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
VGA1 disconnected (normal left inverted right x axis y axis)
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
   1280x800       60.0*+   50.0
   1024x768       85.0     75.0     70.1     60.0
   832x624        74.6
   800x600        85.1     72.2     75.0     60.3     56.2
   640x480        85.0     72.8     75.0     59.9
   720x400        85.0
   640x400        85.1
   640x350        85.1

Несколько моментов важны здесь: вы можете видеть, что LVDS1 подключён (конечно, это внутренний плоский дисплей), но VGA1 — нет. Если у вас подключён монитор к одному из портов, но xrandr всё ещё говорит «отключён», проверьте кабель, монитор или графический драйвер.

Максимальное разрешение, которое вы видите в конце первой строки, — это максимальное объединённое разрешение ваших мониторов. По умолчанию оно обычно слишком низкое и должно быть увеличено путём редактирования /etc/X11/xorg.conf.

Итак, допустим, вы подключили VGA1 и хотите использовать его как дополнительный экран:

xrandr --output VGA1 --auto --left-of LVDS1

Эта команда заставляет xrandr попытаться найти родное разрешение устройства, подключенного к VGA1, и настроить его слева от вашего внутреннего плоского дисплея. При повторном запуске «xrandr» вывод выглядит так:

$ xrandr
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
   1280x1024      60.0*+   75.0
   1280x960       60.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3     56.2
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1
LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm
   1280x800       60.0*+   50.0
   1024x768       85.0     75.0     70.1     60.0
   832x624        74.6
   800x600        85.1     72.2     75.0     60.3     56.2
   640x480        85.0     72.8     75.0     59.9
   720x400        85.0
   640x400        85.1
   640x350        85.1

Обратите внимание, что i3 использует точно такой же API, что и xrandr, поэтому он увидит только то, что вы можете увидеть в xrandr.

См. также [presentations] для получения дополнительных примеров конфигураций для нескольких мониторов.

7.2. Интересные конфигурации для многомониторных сред

Есть несколько вещей, которые можно настроить в i3, которые могут быть интересны, если у вас более одного монитора:

  1. Вы можете указать, какое рабочее пространство должно быть расположено на каком экране. Это позволяет иметь разный набор рабочих пространств при запуске, а не просто 1 для первого монитора, 2 для второго и так далее. См. [workspace_screen].

  2. Если вы хотите, чтобы некоторые приложения обычно открывались на большем экране (MPlayer, Firefox и т. д.), вы можете назначить их конкретному рабочему пространству, см. [assign_workspace].

  3. Если у вас много рабочих пространств на многих мониторах, может быть сложно отслеживать, какое окно вы куда поместили. Таким образом, вы можете использовать метки, подобные vim, для быстрого переключения между окнами. См. [vim_like_marks].

  4. Для получения информации о том, как перемещать существующие рабочие пространства между мониторами, см. [move_to_outputs].

8. i3 и остальной ваш мир программного обеспечения

8.1. Отображение строки состояния

Очень распространённой вещью среди пользователей экзотических менеджеров окон является строка состояния в каком-нибудь углу экрана. Она часто является лучшей заменой подходу с виджетами, который используется в панели задач традиционной настольной среды.

Если у вас уже есть любимый способ создания такой строки состояния (самописные скрипты, conky, …), то i3status — рекомендуемый инструмент для этой задачи. Он написан на языке C с целью использования как можно меньшего количества системных вызовов, чтобы минимизировать время пробуждения процессора из спящего состояния. Поскольку i3status выводит только текст, вам необходимо объединить его с другим инструментом, например, i3bar. Обратитесь к [status_command], чтобы узнать, как отобразить i3status в i3bar.

Независимо от того, какое приложение вы используете для отображения строки состояния, необходимо убедиться, что оно регистрируется как окно док-станции с помощью подсказок EWMH. i3 расположит окно либо в верхней, либо в нижней части экрана, в зависимости от подсказки, установленной приложением. С i3bar можно настроить его положение, см. [i3bar_position].

8.2. Проведение презентаций (многомониторная настройка)

При проведении презентации обычно требуется, чтобы аудитория видела то, что видите вы на экране, а затем последовательно просматривала слайды (если презентация простая). Для более сложных презентаций могут потребоваться заметки, которые видны только вам, а аудитория видит только слайды.

8.2.1. Случай 1: все получают один и тот же вывод

Это простой случай. Подключите компьютер к проектору, включите оба устройства и настройте сервер X для клонирования внутреннего плоского дисплея вашего компьютера на видеовыход:

xrandr --output VGA1 --mode 1024x768 --same-as LVDS1

i3 затем будет использовать наименьший общий знаменатель разрешений экрана, остальная часть экрана останется нетронутой (будет отображен фон X). Таким образом, в нашем примере это будет 1024x768 (мой ноутбук имеет разрешение 1280x800).

8.2.2. Случай 2: вы видите больше, чем ваша аудитория

Этот случай немного сложнее. Во-первых, настройте VGA-выход где-нибудь рядом с внутренним плоским дисплеем, например, справа от него:

xrandr --output VGA1 --mode 1024x768 --right-of LVDS1

Теперь i3 создаст новую рабочую область (в зависимости от ваших настроек) на новом экране, и вы окажетесь в многомониторном режиме (см. [multi_monitor]).

Поскольку i3 не является композирующим менеджером окон, нет возможности отображать окно на двух экранах одновременно. Вместо этого это должен сделать ваш программный пакет для презентаций (то есть, открыть окно на каждом экране).

8.3. Дисплей высокого разрешения (также известен как HIDPI-дисплей)

См. https://wiki.archlinux.org/index.php/HiDPI, чтобы узнать, как включить масштабирование в различных частях Linux-настольной среды. i3 будет считывать требуемую DPI из свойства Xft.dpi. По умолчанию свойство равно 96 DPI, поэтому для достижения масштабирования 200% необходимо установить Xft.dpi: 192 в ~/.Xresources.

Если вы опытный пользователь i3, который только что приобрел новый монитор, проверьте:

  • Вы используете масштабируемый шрифт (начинающийся с «pango:») в вашей конфигурации i3.

  • Вы используете терминальный эмулятор, который поддерживает масштабирование. Вы можете временно переключиться на gnome-terminal, который, как известно, поддерживает масштабирование «из коробки», до тех пор, пока не разберётесь, как настроить размер шрифта в вашем любимом терминальном эмуляторе.

© 2009, Michael Stapelberg and contributors
https://i3wm.org/docs/userguide.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API