Vain/ru

На сегодняшний день существует 2 версии Vain. Версия для 3.5 является портом от copycat-killer, так как автор пользуется 3.4 и пока не произвел обновления.(я думаю, теперь уже и не будет).
 * версия для Awesome <= 3.4 https://github.com/vain/awesome-vain
 * версия для Awesome 3.5 https://github.com/copycat-killer/vain-again

Установка Vain
Awesome 3.4 git clone https://github.com/vain/awesome-vain.git ~/.config/awesome/vain Awesome 3.5 git clone https://github.com/copycat-killer/vain-again.git ~/.config/awesome/vain

Использование
В принципе, все, что вам нужно сделать это подключить модуль: require("vain") vain.widgets.terminal = "xterm" Некоторым виджетам в Vain необходим терминал, поэтому вам необходимо настроить эту возможность. Вызов терминала может быть функцией Lua, которая принимает один параметр. Что то похожее на:

function footerm(cmd) awful.util.spawn("xterm -e " .. cmd) end

vain.widgets.terminal = footerm

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

Каталог vain должен находится в том же месте, что и ваш файл rc.lua $ pwd /home/void/.config/awesome $ tree -l . `-- vain -> ../.awesome-vain/vain |-- init.lua |-- layout |  |-- browse.lua |  |-- gimp.lua |  |-- init.lua |  |-- termfair.lua |  `-- uselessfair.lua |-- util.lua `-- widgets.lua
 * -- rc.lua
 * -- themes -> ../.awesome-themes/

Как вообще работают layouts?
"layout" это просто таблица lua или модуль, которая имеет название и вызываемую функцию arrange. Таким образом, самый простой layout может выглядеть следующим образом:

mylayout = {} mylayout.name = "hurz" mylayout.arrange = function(p) end

Для использования этого layout в теге, вам необходимо написать: awful.layout.set(mylayout, tags[1][7])

(Конечно, вы можете просто добавить его в стандартную таблицу layouts.)

Теперь функция arrange принимает параметр 'p', который является другой таблицей. Наиболее важными элементами этой таблицы являются workarea и clients. Вот как может выглядеть таблица 'p': p = { workarea = { x, y, width, height }, clients = { ... },   ... }

Задачей функции arrange является перебор всех клиентов и установка их геометрии. То есть, для каждого клиента вы вызываете установщик geometry: mylayout.arrange = arrange(p)

local wa = p.workarea local cls = p.clients

for k, c in ipairs(cls) do       local g = {}

g.width = ...       g.height = ...        g.x = wa.x + ...        g.y = wa.y + ...

c:geometry(g) end end

Это все! А обработчик Awesome берет на себя всю остальную (трудоемкую) работу, вроде сворачивания клиента, плавающего режима клиента, порядка расположения клиентов, фокус, отрисовка границ окна, и т.д.

Иконки
Благодарю Nicolas Estibals (https://github.com/nestibal) за создание иконок для стандартной темы Awesome!

Вам необходимо расширить ваш theme.lua следующим образом. Для этого создайте файл, и предположим назовите его ~/.config/awesome/extended_default_theme.lua): dofile("/usr/share/awesome/themes/default/theme.lua")  --здесь мы добавляем данные из стандартной темы ... theme.layout_termfair      = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/termfairw.png" theme.layout_browse        = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/browsew.png" theme.layout_gimp          = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/gimpw.png" theme.layout_cascade       = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/cascadew.png" theme.layout_cascadebrowse = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/cascadebrowsew.png" theme.layout_centerwork    = os.getenv("HOME") .. "/.config/awesome/vain/themes/default/layouts/centerworkw.png" ... return theme Лучше использовать отдельный файл для расширенных layout, т.к. если в дальнейшем вы удалите vain, или что то еще поменяете, то сложно будет вернуть все назад. Затем, необходимо настроить beautiful для использования этой, расширенной темы: beautiful.init(os.getenv("HOME") .. "/.config/awesome/extended_default_theme.lua")

Иконки для стандартной темы доступны в двух цветах: белом и черном. Также доступны иконки для темы "zenburn" theme.

Новые схемы
Скриншоты схем вы можете найти на странице http://www.uninformativ.de/projects/?q=awesome-vain

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 тега.

Следующие настройки устанавливают termfair layout на 7й тег 1го экрана, и устанавливают 3 столбца и как минимум 2 строки: awful.layout.set(vain.layout.termfair, tags[1][7]) awful.tag.setnmaster(3, tags[1][7]) awful.tag.setncol(2, tags[1][7])

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

Схема 'browse' имеет фиксированное количество столбцов, где левый столбец предназначен для браузера. Его размер контролируется mwfact тега. Дополнительные окна будут открываться в другом столбце, справа от вашего браузера. Новые окна будут располагаться над старыми. (1)             (2)              (3)              (4) +-+---+      +-+---+      +-+---+      +-+---+ +-+---+      +-+---+      +-+---+      +-+---+ На своем ноутбуке, я размещаю правую колонку поверх(top) колонки браузера: Дополнительные окна в этом случае перекрывают окно браузера. Это необычно для тайлинговой схемы, но мне это необходимо: При серфинге в интернете, я часто открываю окно терминала (обычно на несколько минут, после чего закрываю их). Как правило, при изменении размера окна браузера, большинство браузеров "съезжают" с текущей позиции. Таким образом, мне приходилось бы прокручивать страницу, чтобы найти место, на котором я открыл терминал. А это раздражает.
 * |  |      |     |   |      |     | 3 |      |     | 4 |
 * 1 |   |  ->  |  1  | 2 |  ->  |  1  +---+  ->  |  1  | 3 |
 * |  |      |     |   |      |     | 2 |      |     +---+
 * |  |      |     |   |      |     |   |      |     | 2 |
 * |  |      |     |   |      |     |   |      |     | 2 |

Будет ли вторичный столбец размещаться поверх окна браузера или нет, управляется значением ncol тега. Значение равное 1 означает, "перекрывание вторичным столбцом"(overlapping slave column), а все прочие значение означают "не перекрывать окна"(don't overlap windows).

Таким образом, следующий код, установит схему browse в теге 7 экрана 1. Главный столбец будет иметь половину ширины экрана, а в другой половине будут размещаться вторичные окна. awful.layout.set(vain.layout.browse, tags[1][7]) awful.tag.setmwfact(0.5, tags[1][2]) awful.tag.setncol(1, tags[1][7]) vain.layout.browse.extra_padding = 5

extra_padding уменьшает размер главного окна, если активировано "overlapping slave column". Это позволяет вам видеть, если есть какие то окна во вторичном столбце.

gimp
''Обратите внимание: С версии Gimp 2.8, эта схема устарела и больше не поддерживается. Может быть она и будет работать, но я ее больше не использую. В Gimp 2.8 есть "single window mode", который делает все что нужно.''

Gimp это нечто особенное. Многие люди не используют Gimp, потому что в нем "слишком много окон". Используя специальную схему для Awesome, вы можете решить эту "проблему". (на самом деле я не считаю это проблемой.)

В схема gimp используется один большой слот для окна изображения Gimp'а. Справа, одни слот для каждого toolbox или dock. Окнам не являющимся окнами Gimp устанавливается плавающий(floating) режим. +---+---+---+ +---+---+---+ По умолчанию (т.е., если ncol = 1), при открытии еще одного изображения, его окно будет размещено поверх первого изображения, перекрывая его. Так обычно, вы видете только одно изображение, потому что работаете только ним. Вы можете использовать переключатель приложения или горячие клавиши, чтобы переключится на другое изображение (смотрите menu_clients_current_tags в секции "Utility functions").
 * Image | T | D |
 * Image | T | D |

Иногда вам может понадобится получить лучшее представление от открытых изображениях. Установив значение ncol = 2, вы можете переключиться в "каскадный режим": +-+---+---+ +-+---+---| Вы можете управлять смещением каждого окна установив глобальную переменную vain.layout.gimp.cascade_offset. По умолчанию значение равно 16 пикселям.
 * +-| Img | |  |   |
 * +-| +-+ | T | D |
 * +-| Img | |  |   |
 * +-| +-+ | T | D |
 * +-| +-+ | T | D |

Если значение ncol равно 2, все изображения будут сложены в стопку в главном слоте: +---+---+---+ +---+  |   | +---+   |   | +---+---+---+ Опять же,mwfact контролирует ширину главного слота. Следующий пример демонстрирует использование схемы 'gimp' в 7-м теге 1-го экрана, по умолчанию в "stacking mode" и главным слотом имеющим ширину 75% от экрана: awful.layout.set(vain.layout.gimp, tags[1][7]) awful.tag.setmwfact(0.75, tags[1][2]) awful.tag.setncol(3, tags[1][7]) Однако, этого не достаточно. Стандатные правила(rules) в Awesome устанавливают плавающий режим(floating) для toolboxes и docks, так как они являются служебными окнами. Но: Схема не может управлять плавающими окнами. Так что вам понадобится установить rules которые устанавливают toolboxes обратно в нормальный режим. Вы должны добавить эти правила к вашему разделу rules: awful.rules.rules = awful.util.table.join(   awful.rules.rules,    vain.layout.gimp.rules ) Вы также можете использовать свои собственные rules, например, чтобы перемещать окна Gimp на определенный тег.
 * Image |  |   |
 * Image | T | D |
 * Image |  |   |

cascade
Размещает все окна каскадом (смотрит схему 'gimp' в теге.

Вы можете управлять смещением изменяя значения двух переменных: vain.layout.cascade.cascade_offset_x = 64 vain.layout.cascade.cascade_offset_y = 16 Следующий пример резервирует место под 5 окон: awful.tag.setnmaster(5, tags[s][1]) До тех пор пока не будет создано 5 окон, их размеры не будут изменяться.

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

vain.layout.cascadebrowse.cascade_offset_x = 2 vain.layout.cascadebrowse.cascade_offset_y = 32 vain.layout.cascadebrowse.extra_padding = 5 awful.tag.setnmaster(5, tags[s][1]) awful.tag.setncol(1, tags[s][1])

Я рекомендую устанавливать cascade_offset_x на малое значение или даже 0, чтобы избежать потери места.

Смотрите схему 'browse' для разъяснения значений extra_padding и ncol.

uselessfair
Это схема является дубликатом стоковой схемы fair. Но, дополнительно я добавил "бесполезные пробелы"(useless gaps) (подробнее смотри ниже) к этой схеме. Использование будет выглядеть следующим образом: awful.layout.set(vain.layout.uselessfair, tags[1][7])

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

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

Установите схему на одном из ваших тегов: awful.layout.set(vain.layout.centerwork, tags[s][t]) Вы можете определить порядок четырех дополнительных окон. Это стандартная конфигурация: vain.layout.centerwork.top_left = 0 vain.layout.centerwork.top_right = 1 vain.layout.centerwork.bottom_left = 2 vain.layout.centerwork.bottom_right = 3 Это означает: Нижний левый слот будет присвоен третьему окну (не считаю главного окна). Предположим, вы хотите, чтобы ваши окна располагались в следующем порядке: +--+ +--+ Для этого вам потребуется использовать следующие настройки: vain.layout.centerwork.top_left = 3 vain.layout.centerwork.top_right = 0 vain.layout.centerwork.bottom_left = 2 vain.layout.centerwork.bottom_right = 1 Примечание: Если вы используете стандартую конфигурацию Awesome, навигация в этой схеме может быть весьма запутанной. Как перейти из главного окна на нижнее левое окно? Это зависит от порядка в котором эти окна были открыты! Таким образом, я предлагаю вам использовать функцию awful.client.focus.bydirection: 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 | |

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

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

Виджеты
Каждая функция возвращает виджет, который может быть использован в wiboxes. Большинство виджетов периодически обновляются; смотри код, чтобы узнать значение таймера.

systemload
Отображает текущий уровень нагрузки системы в textbox. Данные считываются непосредственно /proc/loadavg. mysysload = vain.widgets.systemload Нажатие на виджет откроет терминал с htop.

Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout=: По умолчанию 10 секунд
 * .show_all: Отображать все три значения (true) или только первое значение (false)? По умолчанию значение равно false.

cpuusage
Отображает среднюю загрузку процессора в данный момент времени. Это то, что делает htop. mycpuusage = vain.widgets.cpuusage Нажатие на виджет откроет терминал с htop.

Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout: По умолчанию 10 секунд.

memusage
Отображает использование памяти и общую память в MiB. Данные считываются из /proc/meminfo.

mymemusage = vain.widgets.memusage

Нажатие на виджет откроет терминал с htop.

Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout: По умолчанию 10 секунд.
 * .show_swap: Отображать использование swap? По умолчанию равно false.

mailcheck
Проверяет каталог Maildirs и отображает результат в textbox. Например, у меня Maildirs расположен ~/Mail: $ pwd /home/void/Mail $ tree -ad . . . . Виджет mailcheck проверяет имеются ли файлы в каталогах new. Для выполнения вызывается find. Если есть новые письма, textbox отобразит, что то вроде этого "mail: bugs(3), system(1)", в противном случае "no mail". mymailcheck = vain.widgets.mailcheck Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:
 * -- bugs
 * |-- cur
 * |-- new
 * `-- tmp
 * -- lists
 * |-- cur
 * |-- new
 * `-- tmp
 * -- system
 * |-- cur
 * |-- new
 * `-- tmp


 * .refresh_timeout: По умолчанию каждые 30 секунд.
 * .mailpath: Путь к каталогу с почтой, по умолчанию ~/Mail.
 * .ignore_boxes: Другая таблица, которая содержит список ящиков (just the last part, like lists) для пропуска. По умолчанию нет значений.
 * .initial_update: Проверять почту при старте Awesome (true) или ожидать первого периода обновления (false)? По умолчанию равно true.

При щелчке на виджете, вызывается bash alias с названием smail. Это оболочка скрипта для mutt который я использую: он автоматически отсылает(commits) в репозиторий git, после прочтения почты.

beautiful.mailcheck_new может исполользовать цвета. new-mail-message отображается с использованием этого цвета. По умолчанию используется красный, если не определен.

battery
Отображает оставшееся время и емкость батареи вашего ноутбука, а также текущую мощьность(wattage). Используется файловая система /sys.

mybattery = vain.widgets.battery

Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout: По умолчанию 30 секунд.
 * .battery: Идентификатор батареи, за которой ведется наблюдение, по умолчанию BAT0.

volume
Отображает и контролирует текущий уровень громности в textbox. Периодически вызывается скрипт control_volume для получения текущего значения громкости. Похожий скрипт используется и для установки громкости. Смотри ниже.

myvolume = vain.widgets.volume Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:
 * Щелчок левой кнопки: Включить/выключить звук.
 * Щелчок правой кнопки: Включить/выключить звук.
 * Щелчок средней кнопки: Запускает alsamixer в вашем терминале.
 * Колесо мыши: Увеличение/Уменьшение громкости.


 * .refresh_timeout: По умолчанию 2 секунды.
 * .mixer_channel: По умолчанию канал Master.

Я в настоящее время использую скрипт похожий на control_volume: channel=${2:-Master} case $1 in   up)        mpc volume +2        ;;    down) mpc volume -2 ;;   toggle)        amixer set $channel toggle        ;;    get) mpc volume | sed -r 's/^volume: ?([^%]+)%.*/\1/'
 * 1) !/bin/bash

echo -n ' '

amixer get $channel | sed -rn 's/.*\[([a-z]+)\]/\1/p' | head -1 ;; esac То есть, я узнаю и устанавливаю громкость через mpd. Раньше я использовал все эти возможности через amixer, но этоа программа все больше и больше ломается и частенько работает не как надо. Например, когда громкость уменьшается до 0%, amixer не может получить значение обратно.

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

mpd
Предоставляет набор imageboxes для контроля запущенного экземпляра mpd на вашем локальном компьютере. Также обеспечивается контроль похожий на виджет громкости. Для контроля mpd используется mpc.


 * Щелчок правой кнопкой на любой иконке: Включение/выключение звука через control_volume. Описание смотри выше.
 * Щелчок средней кнопкой на любой иконке: Открывает ncmpcpp в терминале.

Эта функция возвращает не один виджет, а таблицу виджетов. В настоящее время, если вы захотите добавить их, нужно добавить только эту таблицу в wibox: mpdtable = vain.widgets.mpd ... mywibox[s].widgets = { ...   mpdtable[1], mpdtable[2], mpdtable[3], mpdtable[4], mpdtable[5], mpdtable[6], ... } Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .mixer_channel: По умолчанию Master.
 * .show_label: Определяет, является ли mpd: отображается перед иконками управления. По умолчанию равно true.

net
Мониторит сетевые интерфейсы и отображает текущий трафик в виде textbox. Если сетевого интерфейса не существует или если еще не достоточно данный, вы увидите, что то похожее на wlan0: -. В противном случае, текущий трафик отображается в килобайтах в секунду, следующим образом eth0: ↑(00,010.2), ↓(01,037.8). neteth0 = vain.widgets.net Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout: По умолчанию 2 секунды.
 * .iface: По умолчанию eth0.

gitodo
Это интеграция gitodo в Awesome. todolist = vain.widgets.gitodo Функция принимает таблицу в качестве дополнительного аргумента. Эта таблица может содержать:


 * .refresh_timeout: По умолчанию 120 секунд
 * .initial_update: Проверяет список todo при запуске Awesome (true) или ожидает первого интервала обновления (false)? По умолчанию равно true.

beautiful.gitodo_normal используемый цвет для не просроченных задач, beautiful.gitodo_warning для элементов близких к завершению и beautiful.gitodo_outdated цвет для просроченных задач.

borderbox
Создает тонкий wibox в позиции относительно другого wibox. Это позволяет вам создавать "separators" или "borders" для ваших wibox. Например, представьте себе, что это wibox: [======================] Если args.position = 'above', то вы получите дополнительный wibox ниже существующего wibox: ________________________ [======================] Он будет соответсвовать позиции и размеру существующего wibox.

Если ваши основные wiboxes находятся в таблице которая называется mywibox (один wibox для каждого экрана) и располагается в нижней части вашего экрана, то следующий код добавит borderbox поверх него: for s = 1, screen.count do -- Most likely, you'll want to do this as well: awful.screen.padding(screen[s], { bottom = 1 })

-- Создаем box и размещаем ее над существующим box. vain.widgets.borderbox(mywibox[s], s, { position = 'above' } ) end borderbox определена следующим образом: function borderbox(relbox, s, args) relbox и s (число) необходимые аргументы, args не является обязательным. args может содеражать:


 * .position: Один из вариантов above, below, left and right. По умолчанию above.
 * .color: Цвет дополнительного box. По умолчанию равно #FFFFFF.
 * .size: Размер дополнительного box, измеряется в пикселях. По умолчанию 1.

Служебные функции
Здесь я объясню только наиболее сложные функции из файла init.lua. Смотрите исходный код для изучения остальных.

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

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

Цвет границы окон в зависимости от значения приоритета
'''Для установки приоритета используется утилита nice. Для ознакомления с ней и ее возможностями читайте руководство.'''

По умолчанию ваш rc.lua содержит что то похожее на: client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) Вы можете изменить это на: client.add_signal("focus", vain.util.niceborder_focus) client.add_signal("unfocus", vain.util.niceborder_unfocus) Теперь, при фокусировке или потере фокуса клиентом, 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"

tag_view{next,prev}_nonempty
Возможно вы используете taglist, который отображает только не пустые теги: mytaglist = awful.widget.taglist(s, awful.widget.taglist.label.noempty, mytaglist.buttons) --                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ В таком случае, настройка по умолчанию будет выглядеть так: globalkeys = awful.util.table.join(   -- Стандартная навигация    awful.key({ modkey }, "Left",   awful.tag.viewprev),    awful.key({ modkey }, "Right",  awful.tag.viewnext),    ... Так при нажатии modkey + right, вы переходите на следующий тег. Однако, при отображении только не пустых тегов, целевой(намеченный) тег может быть пуст! Мне это не нравится. Я всегда хочу переходить на следующий не пустой тег, пропуская пустые.

tag_viewnext_nonempty и tag_viewprev_nonempty делают именно это. Для их использования, заменить указанный выше код на следующий: globalkeys = awful.util.table.join(   -- Standard navigation    awful.key({ modkey }, "Left",   vain.util.tag_viewprev_nonempty),    awful.key({ modkey }, "Right",  vain.util.tag_viewnext_nonempty),    ... Note: Для перехода на пустой тег, вы должны вызывать непосредственно его. То есть, используйте modkey + 4 или аналогичное.