Lain/ru

Оригинальная ссылка на Lain

Является наследником Vain. Данный модуль добавляет новые layouts (включая useless gaps), виджеты и утилиты, повышающие удобство и настраиваемость Awesome.

Разработано для версии Awesome 3.5

Lain является модульным, как и Vicious, разрабатываемый сообществом, как и Obvious, работающий со скриптами, как и Bashets, творческий, как Vain.

Какие еще есть подмодули виджетов?
Добавлены новые типы виджетов, такие как: IMAP mail checker, Taskwarrior prompt, Yahoo! Weather, ThinkPad batteries и прочие.

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

Установка и документация
wiki git submodule - оригинальная документация на английском.

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

Arch Linux
Lain доступен через AUR

Прочие дистрибутивы
git clone https://github.com/copycat-killer/lain.git ~/.config/awesome/lain

Использование
Для начала необходимо добавить в ваш rc.lua: local lain = require("lain")

А затем изучите и добавьте подмодули, которые вам нужны.

Layout
В настоящее время существует 8 схем (layout): lain/layout . `-- uselesstile Для их использования просто добавьте нужные вам в таблицу layouts в rc.lua: lain/layout layouts = {   ...    lain.layout.termfair, lain.layout.uselesstile, ... } Или установите какой либо на определенный тег: awful.layout.set(lain.layout.uselessfair, tags[1][7])
 * -- termfair
 * -- centerfair
 * -- cascade
 * -- cascadetile
 * -- centerwork
 * -- uselessfair
 * -- uselesspiral

termfair
Я очень много работаю в терминале. Стандартные тайлинговые алгоритмы обычно разворачивают окно на весь экран, так, что вы получаете терминал с количеством столбцов около 200 или даже более. Это слишком много. Вы пробовали читать страницы руководства(manpage) в терминале такого размера?

Данный layout ограничивает размер каждого окна. Каждое окно будет иметь одинаковую ширину, но может изменяться по высоте. Кроме того, окна выровнены по левому краю. Основная рабочая схема следующая (число над экраном это число открытых окон, число в клетке, это фиксированный номер клиента): (1)               (2)                (3) +---+---+---+      +---+---+---+      +---+---+---+ +---+---+---+      +---+---+---+      +---+---+---+
 * 1 |  |   |  ->  | 2 | 1 |   |  ->  | 3 | 2 | 1 |  ->
 * 1 |  |   |  ->  | 2 | 1 |   |  ->  | 3 | 2 | 1 |  ->

(4)               (5)                (6) +---+---+---+      +---+---+---+      +---+---+---+ +---+---+---+  ->  +---+---+---+  ->  +---+---+---+ +---+---+---+      +---+---+---+      +---+---+---+ Первый клиент будет размещен в левом столбце. При открытии нового окна, это новое окно будет размещено в левом столбце, а предыдущее, первое окно будет перемещено в средний столбец. После заполнения ряда, новый ряд будет создан над ним.
 * 4 |  |   |      | 5 | 4 |   |      | 6 | 5 | 4 |
 * 3 | 2 | 1 |     | 3 | 2 | 1 |      | 3 | 2 | 1 |

Стандартное число строк и столбцов берется из значений nmaster и ncol из awful.tag, но вы можете установить собственные значения.

Например, для установки в termfair 3х столбцов и как минимум 1 строки исползуйте: lain.layout.termfair.nmaster = 3 lain.layout.termfair.ncol = 1

centerfair
Похож на termfair, но с фиксированным числом вертикальных столбцов. Перввые 3 клиента располагаются по центру, пока не достигнут значения столбцов из nmaster, затем окна начинают stacked как вторичные, до достижения числа ncol на колонку. (1)               (2)                (3)   +---+---+---+      +-+---+---+-+      +---+---+---+   |   |   |   |      | |   |   | |      |   |   |   |   |   | 1 |   |  ->  | | 1 | 2 | | ->   | 1 | 2 | 3 |  ->   |   |   |   |      | |   |   | |      |   |   |   |   +---+---+---+      +-+---+---+-+      +---+---+---+

(4)               (5)   +---+---+---+      +---+---+---+   |   |   | 3 |      |   | 2 | 4 |   + 1 + 2 +---+  ->  + 1 +---+---+   |   |   | 4 |      |   | 3 | 5 |   +---+---+---+      +---+---+---+ Как и в схеме termfair, стандартное число столбцов и строк берется из значений nmaster и ncol values из awful.tag, но вы можете установить эти значения сами.

Например: lain.layout.centerfair.nmaster = 3 lain.layout.centerfair.ncol = 1

cascade
Размещает все окна в теге каскадом.

Вы можете управлять смещением изменяя значения двух переменных:

lain.layout.cascade.cascade_offset_x = 64 lain.layout.cascade.cascade_offset_y = 16 Следующий пример резервирует место под 5 окон: lain.layout.cascade.nmaster = 5 До тех пор пока не будет создано 5 окон, их размеры не будут изменяться.

cascadetile
Похожа на схему awful.layout.suit.tile, однако клиенты во вторичных колонках размещаются каскадом, а не tiled.

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

Будут ли вторичные столбцы размещены поверх (on top) или нет, контролируется значением ncol. Значение 1 означает "перекрытие вторичных столбцов", а любое другое значение будет означать "не перекрывать окна".

Пример использования: lain.layout.cascadetile.cascade_offset_x = 2 lain.layout.cascadetile.cascade_offset_y = 32 lain.layout.cascadetile.extra_padding = 5 lain.layout.cascadetile.nmaster = 5 lain.layout.ncol = 1 extra_padding уменьшает размер главного окна, если активно "перекрытие вторичных столбцов". Это позволяет видеть, если ли какие либо окна во вторичном столбце.

Устанавливайте cascade_offset_x на очень маленькое значение или даже 0, чтобы не терять место.

centerwork
Вы начинаете с одним окном, расположенным по центру горизонтально: +--+ +--+
 * |  MAIN   |       |
 * |  MAIN   |       |
 * |  MAIN   |       |
 * |  MAIN   |       |
 * |  MAIN   |       |

Это главное рабочее окно. Большую часть работы вы делаете здесь. Иногда, вы можете открывать дополнительные окна. Они будут располагаться в следующих четырех слотах: +--+ +--+ Да, число "четыре" фиксировано. В общей сложности, вы можете открыть пять окон с этой схемой. Дополнительные окна не поддерживаются и им устанавливается плавающий режим(floating). Это сделано намерено.
 * | 0 | |         | | 1 | |
 * +---+ |  MAIN   | +---+ |
 * | 2 | |         | | 3 | |
 * +---+ |  MAIN   | +---+ |
 * | 2 | |         | | 3 | |
 * | 2 | |         | | 3 | |
 * | 2 | |         | | 3 | |
 * | 2 | |         | | 3 | |

Вы можете определить порядок четырех дополнительных окон. Это стандартная конфигурация: lain.layout.centerwork.top_left = 0 lain.layout.centerwork.top_right = 1 lain.layout.centerwork.bottom_left = 2 lain.layout.centerwork.bottom_right = 3 Это означает: Нижний левый слот будет присвоен третьему окну (не считаю главного окна). Предположим, вы хотите, чтобы ваши окна располагались в следующем порядке: +--+ +--+ Для этого вам потребуется использовать следующие настройки: lain.layout.centerwork.top_left = 3 lain.layout.centerwork.top_right = 0 lain.layout.centerwork.bottom_left = 2 lain.layout.centerwork.bottom_right = 1 Примечание: Если вы используете стандартую конфигурацию Awesome, навигация в этой схеме может быть весьма запутанной. Как перейти из главного окна на нижнее левое окно? Это зависит от порядка в котором эти окна были открыты! Таким образом, я предлагаю вам использовать функцию  : globalkeys = awful.util.table.join(   ...    awful.key({ modkey }, "j", function awful.client.focus.bydirection("down") if client.focus then client.focus:raise end end),   awful.key({ modkey }, "k", function awful.client.focus.bydirection("up") if client.focus then client.focus:raise end end),   awful.key({ modkey }, "h", function awful.client.focus.bydirection("left") if client.focus then client.focus:raise end end),   awful.key({ modkey }, "l", function awful.client.focus.bydirection("right") if client.focus then client.focus:raise end end),   ... )
 * | 3 | |         | | 0 | |
 * +---+ |  MAIN   | +---+ |
 * | 2 | |         | | 1 | |
 * +---+ |  MAIN   | +---+ |
 * | 2 | |         | | 1 | |
 * | 2 | |         | | 1 | |
 * | 2 | |         | | 1 | |
 * | 2 | |         | | 1 | |

uselessfair, uselesspiral & uselesstile
Они дублируют стоковые схемы fair, spiral и tile. Однако с добавлением "useless gaps" (смотрите ниже).

Промежутки между окнами
"Useless gaps" это промежуток между окнами. Они "бесполезны" потому что не имеют специального назначения, несмотря на улучшение обзора. Я обнаружил, что проще обнаружить границы окон, если они располагаются немного раздельно.

Схема uselessfair например, выглядит следующим образом: +================+ +================+ Все мои схемы поддерживают "useless gaps". Для настройки ширины разрывов, вам необходимо расширить вашу тему beautiful. Она должна содержать пункт под названием useless_gap_width в таблице темы. Если этот параметр отсутсвует, ширина по умолчиню становится равной 0. theme.useless_gap_width = "5"
 * | 1 | |   |  #
 * 1)         | 3 |  #
 * | 2 | |   |  #
 * 1)         | 3 |  #
 * | 2 | |   |  #
 * | 2 | |   |  #
 * | 2 | |   |  #

Иконки
Они расположены в lain/icons/layout.

Для их использования, добавьте следующие строки в ваш theme.lua: theme.lain_icons        = os.getenv("HOME") .. "/.config/awesome/lain/icons/layout/default/" theme.layout_termfair   = theme.lain_icons .. "termfairw.png" theme.layout_cascade    = theme.lain_icons .. "cascadew.png" theme.layout_cascadetile = theme.lain_icons .. "cascadetilew.png" theme.layout_centerwork = theme.lain_icons .. "centerworkw.png" Благодарим Nicolas Estibals за создание иконок для схем для стандартной темы.

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

Основы использования
Каждый виджет выводится функцией.

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

Каждый виджет может принимать другие таблицы или список переменных в качестве аргументов.

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

Для разметки textbox, вызовите widget:set_markup(...) в настройках.

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

Виджеты являются объектами textbox, поэтому вы можете управлять ими, так же как и другими виджетами wibox.widget.textbox.

Ниже приведен пример: mycpu = lain.widgets.cpu({   timeout = 4,    settings = function        widget:set_markup("Cpu " .. cpu_now.usage)   end }) Если вы хотите увидеть более сложные приложения, смотрите на сайте awesome-copycats.

Список виджетов
Ниже приведен список виджетов, входящих в состав Lain.


 * alsa - Отображает и контролирует громкость alsa с помощью textbox
 * alsabar - Отображает и контролирует громкость alsa с прогрессбаром; поддерживает подсказки, уведомления и изменения цветов при включении/выключение звука.
 * base - Это простой виджет-шаблон. В своей основе, все что он делает исполняет входящие команды, и выводит вывод в его textbox.
 * bat - Отображает textbox оставшееся время и процент мощности батареи ноутбука. Выводит уведомление при низком или критическом заряде батареи.
 * borderbox - Создает тонкий wibox в позиции относительно другого wibox. Это позволяет создать "границы" для вашего wiboxes.
 * calendar - Прикрепляет календарь в виде уведомления к виджету.
 * cpu - Отображает в textbox средний процент использования процессора.
 * fs - Отображает использование диска для данного раздела. Выводит уведомление при переполнении раздела или малом количестве места.
 * imap - Отображает количество писем в textbox с полученных по IMAP.
 * maildir - Отображает статус maildirs в textbox.
 * mem - Отображает использование памяти (в MiB) в textbox.
 * mpd - Отображает статус MPD в textbox.
 * net - Мониторит сетевой интерфейс и отображает текущий трафик в textbox.
 * sysload - Отображает текущую загрузку системы.
 * temp - Отображает температуру ядра в textbox.
 * yawn - отображает краткую и компактную погоду из YAhoo.

Вклад пользователей You will need dkjson library. A simple way of installing is to download the dksjon.lua file and place it in your ~/.config/awesome directory.
 * task - Прикрепляет уведомление taskwarrior к виджету и позволяет добавить возможность добавить/найти задачу через promptbox.
 * tpbat - Виджет батареи, который работает с ноутбуками Lenovo ThinkPad с исползованием tp_smapi.
 * ccurr - Отображает в textbox текущих цен для Bitcoin/USD и Dogecoin/USD.
 * redshift - Redshift это приложение, которое позволяет регулировать цветовую температуру экрана на основе видимого положения солнца в местонахождении пользователя.

markup
Облегчает разметку! Для начала необходимо настроить использование: local markup = lain.util.markup затем вы можете вызывать его функции: +-- markup | |`-- bold       Set bold. |`-- italic     Set italicized text. |`-- strike     Set strikethrough text. |`-- underline  Set underlined text. |`-- monospace  Set monospaced text. |`-- big        Set bigger text. |`-- small      Set smaller text. |`-- font       Set the font of the text. | |`--+ bg |  | |  |`-- color   Set background color. |  |`-- focus   Set focus  background color. |  |`-- normal  Set normal background color. |   `-- urgent  Set urgent background color. | |`--+ fg |  | |  |`-- color   Set foreground color. |  |`-- focus   Set focus  foreground color. |  |`-- normal  Set normal foreground color. |   `-- urgent  Set urgent foreground color. | |`-- focus      Set both foreground and background focus  colors. |`-- normal     Set both foreground and background normal colors. `-- urgent     Set both foreground and background urgent colors. Все они принимают один аргумент, которым является текст предназначенный для разметки, за исключением font, fg.color и bg.color: markup.font(font, text) markup.fg.color(text, color) markup.bg.color(text, color) focus, normal и urgent использует переменные beautiful.

dynamic tagging
Позволяет:
 * Добавлять новые теги;
 * Переименовать существующие теги;
 * Перемещать существующие теги;
 * Удалять существующие теги.

Если вы удаляете тег, любые установленные для него правила(rule) ломаются, поэтому будьте осторожны.

Используйте с клавиатурными привязками, например: awful.key({ modkey, "Shift" }, "n", function lain.util.add_tag(mypromptbox) end), awful.key({ modkey, "Shift" }, "r", function lain.util.rename_tag(mypromptbox) end), awful.key({ modkey, "Shift" }, "Left", function lain.util.move_tag(1) end),  -- move to next tag awful.key({ modkey, "Shift" }, "Right", function lain.util.move_tag(-1) end), -- move to previous tag awful.key({ modkey, "Shift" }, "d", function lain.util.remove_tag end), Помните, что эти функции не будут нормально работать с темой Copland или любыми другими конфигурациями, которые уже используют модули динамических тегов, такие как Eminent (русская перевод Eminent).

useless_gaps_resize
Изменение beautiful.useless_gaps_width на лету. Функция принимает целочисленный аргумент, который является числом пикселей и добавляет/удаляет разрывы(gaps).

Вы можете использовать его со следующими клавиатурными сочетаниями: -- On the fly useless gaps change awful.key({ altkey, "Control" }, "+", function lain.util.useless_gaps_resize(1) end), awful.key({ altkey, "Control" }, "-", function lain.util.useless_gaps_resize(-1) end), где altkey=Mod1, или вы можете использовать по вашему выбору: mywidget:buttons(awful.util.table.join ( awful.button({}, 4, function lain.util.useless_gaps_resize(-1) end), awful.button({}, 5, function lain.util.useless_gaps_resize(1) end) end) )) Используя код приведенный выше, вы можете создав виджет mywidget, навести на него мышь и прокруткой колеса изменять размеры "useless gaps".

tag_view_nonempty
Эта функция позволяет переходить на следующий/предыдущий не пустой тег. Она принимает два аргумента:


 * direction: 1 для следующего не пустого тега, -1 для предыдущего.
 * sc: Экран на котором находится список тегов(taglist). По умолчанию равен mouse.screen или 1. Это необязательный аргумент.

Вы можете использовать ее используя клавиши: -- Non-empty tag browsing awful.key({ altkey }, "Left", function lain.util.tag_view_nonempty(-1) end), awful.key({ altkey }, "Right", function lain.util.tag_view_nonempty(1) end), Где altkey = "Mod1".

menu_clients_current_tags
Эта функция подобна awful.menu.clients, но отображает клиентов только для текущего тега. Используйте следующим образом: awful.key({ "Mod1" }, "Tab", function   awful.menu.menu_keys.down = { "Down", "Alt_L", "Tab", "j" }    awful.menu.menu_keys.up = { "Up", "k" }    lain.util.menu_clients_current_tags({ width = 350 }, { keygrabber = true }) end),

magnify_client
Устанавливает клиенту плавающий режим(floating) и изменяет его размеры так же, как это сделано в схеме "magnifier". Размещает клиент на "текущем" экране (зависит от положения мыши). Это позволяет вам увеличить любой клиент, независимо от используемой схемы. Используйте функцию клавиатурной привязки клиента следующим образом: clientkeys = awful.util.table.join(   ...    awful.key({ modkey, "Control" }, "m", lain.util.magnify_client),    ... ) Если вы хотите "de-magnify" клиента, просто наберите команду еще раз.

niceborder_{focus, unfocus}
По умолчанию ваш rc.lua содержит что то, похожее на: client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) Вы можете изменить этот код на: client.connect_signal("focus", lain.util.niceborder_focus(c)) client.connect_signal("unfocus", lain.util.niceborder_unfocus(c)) Теперь, при фокусировке или потере фокуса клиентом, Awesome будет искать его значение nice в /proc/ /stat. Если значение меньше 0, это окно классифицируется как имеющее "high priority"; если оно больше 0, окно классифицируется как имеющее "low priority". Если оно равно 0, ничего особенного не происходит.

Это требует определить дополнительные цвета в theme.lua. Вот те, которые использую я: theme.border_focus_highprio = "#FF0000" theme.border_normal_highprio = "#A03333"

theme.border_focus_lowprio  = "#3333FF" theme.border_normal_lowprio = "#333366"