Shifty/ru

Введение
Shifty является расширением для Awesome 3 которая реализует динамические теги.

Он также реализует конфигурацию сравнений клиентов(приложений), что упрощает сравнение тег-клиент.

Вот несколько способов, как shifty делает awesome класнее:


 * Создание и удаление тегов на лету
 * Дополнительное согласование(matching) клиентов
 * Лекгое перемещение клиентов между тегами
 * Добавление/переименование тегов в окончание taglist
 * Изменение порядка тегов и настройка расположения
 * Предположение(guessing) имени тега, автоматическая группировка клиентов не заданная конфигурацией
 * Настраиваемые сочетания клавиш для клиента и тега
 * Простая, но мощная конфигурация

Примечание: Shifty является частью Awesome и отлично нам помогает. Awesome теперь поддерживает динамические теги по умолчанию (с середины цикла 3.4). Если вы использвуте Shifty только для динамических тегов, вы можете использовать непосредственно awful.tag.add и awful.tag.remove. Если вы используете только базовую систему конфигурации Shifty, то Tyrannical более новая (и быстрая) система конфигурации, поддерживающая большую часть Shifty, но без дополнительных возможностей.

Видео
Чтобы посмотреть раннюю версию Shifty в действии проверьте: http://garoth.com/awesome/shifty.ogv

TODO Требуется кто нибудь, чтобы сделать еще видео...

Установка
Очень простой способ начать, это использовать example.rc.lua включающий в себя shifty.

# Для 3.4: git clone git://github.com/masterkorp/awesome-shifty.git # Для 3.5 git clone git://github.com/cdump/awesome-shifty cp shifty/example.rc.lua rc.lua  ВНИМАНИЕ: Если вы уже имеете настроенный rc.lua, сначала переместите куда нибудь его, иначе он затрется. Или воспользуйтесь [Using Xephyr/ru| Xephyr] для запуска в отдельной Х сессии со другим файлом rc.lua
 * 1) Перейти в каталог конфигурации (обычно ~/.config/awesome).
 * 2) Клонируйте репозиторий
 * 1) Переместить пример файла rc.lua в ваш каталог с настройками Awesome
 * 1) Перезапустите awesome и наслаждайтесь.

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

Автор настоятельно рекомендует начинать с изучения примера rc.lua. Это может реально сэкономить ваше время и избавит от головной боли.

Теги
Предопределенные теги настраиваются через переменную shifty.config.tags. Помните, что это не подразумевает что теги будут созданы при запуске. Эти теги могут не сущестовать, пока клиенты, которые в них 'нуждаются' их не вызовут.

shifty.config.tags = { ["1:sys"] = { init    = true, -- Create this tag at startup and be persistent. position = 1, screen  = 1,   -- Only create this tag on screen 1. mwfact  = 0.60 -- Sets the master window size factor to 0.60 (60%) -- in the tag. },   ["2:term"] = { persist = true,  -- Don't delete after last client closes. position = 2, },   ["3:www"] = { position   = 3, spawn      = "firefox" -- Open firefox when created. exclusive  = true, -- Only clients matched from config.apps will -- be allowed here. max_clients = 1,   -- If more than one client is started, then a                            -- new tag is made. },   ["ardour"] = { nopopup    = true, -- Prevents focusing on creation. leave_kills = true, -- Don't destroy after closing the last client -- until switching another tag. },   ["p2p"] = { icon_only = true,              -- only show the icon icon     = "~/.icons/p2p.png", -- path to icon for taglist },   ["gimp"] = { layout = "tile", mwfact = 0.18, icon  = "~/.icons/gimp.png", -- Display an icon, but will also -- have text. },   ["fs"] = { rel_index = 1, -- always open next to the current tag and not at the -- end. (0 would create it before current tag) }, }


 * screen

Совет: screen = math.max(screen.count, 2) создаст тег на втором экране, но только когда он подсоединен.


 * position

Вызов тега sys всегда будет устанавливать его 1м в списке, term 2-м www 3-м.


 * nopopup
 * Не фокусировать при создании.

Допустимые ключи для config.tags и config.defaults: layout       = func   -- a layout from awful.layout.suit (e.g. awful.layout.suit.tile) mwfact       = float  -- how big the master window is    nmaster       = int    -- how many columns for master windows ncol         = int    -- how many columns for non-master windows exclusive    = bool   -- if true, only clients from rules (config.apps) allowed in this tag persist      = bool   -- persist after no apps are in it    nopopup       = bool   -- do not focus on creation leave_kills  = bool   -- if true, tag won't be deleted until unselected position     = int    -- determines position in taglist (then what does index do?) icon         = string -- image file for icon icon_only    = bool   -- if true, no text (just icon) init         = bool   -- if true, create on startup (implies persist) sweep_delay  = int    -- ??? keys         = {}     -- a table of keys, which are associated with the tag overload_keys = {}    -- ??? index        = int    -- ??? rel_index    = int    -- ??? run          = func   -- a lua function which is execute on tag creation spawn        = string -- shell command which is execute on tag creation (ex. a programm) screen       = int    -- which screen to spawn on (see above) max_clients  = int    -- if more than this many clients are started, then a new tag is made

Примечание init подразумевает постоянные

Постоянные теги никогда не удаляются автоматически (они могут быть удалены с помощью shifty.delete).

Теги с установленным значением leave_kills не будут удалены пока с тег не будет unselected.

shifty.init после настройки переменных запускает создание тегов имеющих флаг init.

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

Применение
Пример применения таблицы конфигурации: shifty.config.apps = { {       match  = {"htop", "Wicd", "jackctl"}, tag   = "1:sys", screen = 1, },   {        match = {"Iceweasel.*", "Firefox.*"}, tag  = "3:www", },   {        match  = {"urxvt"}, tag   = "2:term", screen = 1, },   {        match   = {"Ardour.*", "Jamin"}, tag    = "ardour", nopopup = true, },   {        match = {"Gimp","Ufraw"}, tag = {"graph", "gimp"}, -- Both tags will be applied. },   {        match = {"gimp%-image%-window"}, slave = true,                   -- Client is started as a slave. },   {        match = {"gcolor2", "xmag", "MPlayer"}, float = true, intrusive = true,  -- Disregard a tag's exclusive property. },   {        match = {"gcolor2"}, geometry = {100, 100, nil, nil}, },   {        match = {""},   -- Matches all clients to provide button behaviors. buttons = { button({}, 1, function (c) client.focus = c; c:raise end), button({modkey}, 1, function (c) awful.mouse.client.move end), button({modkey}, 3, awful.mouse.client.resize), },   }, }

Допустимые ключи для config.apps: above         = bool below         = bool border_width  = int buttons       = {} dockable      = bool float         = bool fullscreen    = bool geometry      = {x, y, w, h}    hidden         = bool honorsizehints = bool intrusive     = bool keys          = {} kill          = bool minimized     = bool nofocus       = bool nopopup       = bool ontop         = bool opacity       = float props         = {} run           = func screen        = int skip_taskbar  = bool slave         = bool startup       = bool sticky        = bool struts        = {} tag           = string titlebar      = bool urgent        = bool wfact         = float

Сравнение клиентов и тегов
Клиент можно сравнивать с конкретными атрибутами, такими как class, instance, name, role и type. Пример: {    match  = { class= "URxvt", name="root. "  --Notice the dot },    tag    = "5:admin", screen = 1, },

Это позволит хранить все окна urxvt, которые запущены от имени root на 5м теге.

Если вы не определили никаких type будут найдены все варианты: {    match = { class = { "Do", },      "clock%-applet", },    float = true, intrusive = true, },

Паттерн это схема сравнения lua. Для проверки свойств используйте xprop и щелкните на изучаемом окне.

Примечание:

В поле tag в config.apps вы можете даже записать названия тегов, которые не установлены заранее в config.tags, они будут созданы с названиями из config.apps и в соответствии с настройками из config.defaults (если они существуют).

Обратите внимание, что запись { match = "" }, ... в config.apps - вам необходима, если вы хотите иметь кнопки приложений.

Таблица geometry предписывает окну клиента создаваться с определенными координатами и прописанными размерами. Формат этой таблицы {x, y, width, height}.

Стандартные значения
Резервные значения используются когда предустановки не найдены в первых двух таблицах конфигурации. shifty.config.defaults = { layout = "max", mwfact = 0.5, run = function(tag) naughty.notify({text = tag.name}) end, } Здесь для новых тегов, которые предварительно не будут настроены получат layout 'max', и mwfact = 0.5 и отобразят уведомление на рабочем столе.

Клавиатурные сочетания
Пример сочетаний клавиатуры. Это самые основные, их можно считать стартовой точкой в начале изучения.

В 'большой' таблице globalkeys у нас содержатся следующие клавиши: awful.key({}, "XF86Back", awful.tag.viewprev), awful.key({}, "XF86Forward", awful.tag.viewnext), awful.key({modkey}, "XF86Back", shifty.shift_prev), awful.key({modkey}, "XF86Forward", shifty.shift_next), awful.key({modkey}, "t", function shifty.add({ rel_index = 1 }) end), awful.key({modkey, "Control"},           "t",            function shifty.add({ rel_index = 1, nopopup = true }) end            ), awful.key({modkey, "Shift"}, "r", shifty.rename), awful.key({modkey}, "w", shifty.del),

А в качестве замены стандартых числовых сочетаний клавиш: for i=1,9 do   globalkeys = awful.util.table.join(                        globalkeys,                        awful.key({modkey}, i,                            function awful.tag.viewonly(shifty.getpos(i)) end)) globalkeys = awful.util.table.join(                       globalkeys,                        awful.key({modkey, "Control"}, i,                            function local t = shifty.getpos(i) t.selected = not t.selected end)) globalkeys = awful.util.table.join(globalkeys,                               awful.key({modkey, "Control", "Shift"}, i,                function if client.focus then awful.client.toggletag(shifty.getpos(i)) end end)) -- move clients to other tags globalkeys = awful.util.table.join(                   globalkeys,                    awful.key({modkey, "Shift"}, i,                        function if client.focus then local t = shifty.getpos(i) awful.client.movetotag(t) awful.tag.viewonly(t) end end)) end

Примечание: Shifty работает с цифровыми сочетаниями клавиатуры через атрибут position с вызовом функции getpos

Функция shifty.getpos предназначена для обработки сочетания mod+i с помощью сопоставления тегу атрибута position.
 * если тег с position == i существует, переключится на него
 * если более одного тега с position == i, циклически переключаться через все из них
 * если тег с position i не существует, создать новые тег

Globals
config.guess_name = true Если установлено значение true (по умолчанию) shifty будет пытаться угадать название нового тега из class клиента. Это имеет силу только когда клиент unmatched и запускается когда нет тегов или тег имеет метку solitary или exclusive.

config.guess_position = true Если установлено значение true (по умолчанию) shifty будет проверять первые символы названия тега для присваивания номера и установки position тегов в соответсвиии с ним. Явное указание position для какого либо тега, отменяет эту возможность.

config.remember_index = true Если установлено значение true (по умолчанию) shifty If set to true (default) shifty будет отслеживать индекс тегов в taglist и если он будет повторно открыт после закрытия, разместит его в том же месте. Определение position, index or rel_index отменяет эту возможность.

config.layouts = {} Если установлено (в таблице функций layout), позволяет устанавливать layout по короткому имен

config.clientkeys = {} Стандартная таблица клавиш приложений, здесь обычно только ваши clientkeys.

config.globalkeys = nil Стандартная таблица глобальных клавиш, здесь обычно только ваши globalkeys.

config.prompt_sources = { "config_tags", "config_apps", "existing", "history" } Таблица, где клавиши используются в виде строки для быстрого завершения.

config.prompt_matchers = {"^", ":", ""}

Config for prompt completion matching, a table of strings (symbols)

Дополнения
Если вы не хотите начинать с example.rc.lua то здесь приведены несколько шагов, которые помогут вам интегрировать shifty в существующую конфигурацию

1. Удалите:
 * Все упоминания связанные с созданием тегов
 * Вашу управляющую функцию

2. Подключение модуля require('shifty')  -- добавьте строку в начале rc.lua

3. Определите переменные shifty.config (детали описаны выше)

4. После определения taglist в rc.lua, добавьте код (помните, что mytaglist должен быть таблицей taglists, не единственным объектом taglist): shifty.taglist = mytaglist

5. Добавьте некоторые клавиатурные сочетания в rc.lua.

6. Замените mod+i (цифовой) Клавиатурные сочетания цикл на пример указанный выше.

10. Следующие определения таблицы клавиш (globalkeys, clientkeys) говоря shifty что следует использовать: root.keys(globalkeys) shifty.config.globalkeys = globalkeys shifty.config.clientkeys = clientkeys

11. Вы сделали это! Теперь когда вы запустите Awesome у вас не будут создавать теги, кроме тех, которые вы предварительно настроите с флагом init. В этом случае, открытие окна, которое не имее предустановок создаст новый тег названный по class клиента (или "new" если shifty.config.guess = false).

Поддержка
Помощь лучше искать по следующему порядку:

1. Поисковики, например Google ваш друг...

2. Канал #awesome на irc.oftc.net можно исользовать для немедленной помощи, например по вопросам конфигурации или подобным

3. Сообщения через github

4. Письма в [mailto:awesome@naquadah.org awesome mailing list]

5. Письмо [mailto:masterkorp@masterkorp.net автору].

Баги
Please file all bugs and feature requests using the issue tracker on github.

Смотрите также
tyrannical - An alternative dynamic tagging system, which is less intrusive and make use of the builtin tagging features of awesome 3.