четверг, 27 сентября 2012 г.

Qtile


Qtile is a full-featured, hackable tiling window manager written in Python.

Начнем с азов, или почему я люблю Gentoo Linux?

    В последнее время с выходом "гладкошерстной" убунты, и прочих дистрибутивов заточенных, грубо говоря под мелкомягких, сеть переполнена людьми, которые установив в "три тычка" какой либо дистрибутив - гордо именуют себя не иначе как "Линуксоидами". При этом, понятия не имея как работает система и где настраивается мышка, и любой мелкий баг в случае если не работают окошки, превращается в нерешаемую проблему и обсуждение на форуме в cтопиццотый раз одного и того же вопроса не менее чем 50 постов...
    То ли дело "Гента". Установка сложна и этот природный барьер отсеивает как раз вышеописанную категорию юзеров. Поэтому факи и хелпы по генте по сравнению с другими дистрами настолько хороши и подробны. Большинство пользователей Gentoo это категория людей, которые хорошо разбираются в *nix системах и которых достали тяжеловесные, глючные и попросту ненужные в работе окошки, няшки, рамки, красивые нештяки и прочая поебень включая таких гигантов как гном, кеды или крыса...
    Вот как раз эти люди, ставят чистую систему и сугубо под себя настраивают маленькие, функциональные и очень шустрые и стабильные графические оболочки такие как IceWM, FVWM, OpenBOX и так далее. Для сравнения - гномы, кеды, крысы и так далее это всего лишь табуретка, с какой стороны не сядь - все равно жопе не удобно. Да, для настройки перечисленных мелких ВМ необходимо время что бы разобраться с конфигами, но на выходе вы получаете удобное кресло со спикой и подлокотниками....
    Но все выше перечисленное имеет все же, на мой взгляд, один дефект - много лишних графических обьектов на экране, которые расчитаны делать работу за ПК более приятной, но на самом деле - просто отвлекающих пользователя. И тут, для самых требовательных задротов (пример Автор), приходят на помощь Тайловые менеджеры. Читать
    На данный момент выбор достаточно широк и существует как минимум несколько стабильных продуктов обладающих своими плюсами и минусами. Основные продукты это DWM, Xmonad, wmii, Ion3, awesome - из которых можно выделить лишь последних
два, как достаточно юзабельных. В свое время окончательно устав от всей этой лишней шушеры я принял решение перейти на тайловый ВМ и перепробовал их все, остановив в конце концов свой выбор на awesome. Он не был идеален, но количество моментов которые запросто могу повесить компьютер пентагона своей логикой значительно меньше по сравнению с конкурентами.
    Поработав некоторое время напильником, я привел его к желаемому виду, с нужными мне виджетами, хоткеями и так далее.  И реально работать за ПК стало действительно приятно и удобно. На экране всегда тольно нужная вам информация, в нужном вам месте, в нужное время и в нужном виде. Все управление и перемещение осуществляется посредством клавиатурных комбинаций, по сему дебильная мышка нужна в редких случаях - а следоватьльно обе ваши руки постоянно находятся на клавиатуре, что опять же облегчает набор текста  и так далее... Но великий Awesome обладал, на мой взгляд, весьма
ощутимым недостатком. Его конфиг написан на Lua. В целом - конечно не очень страшно если вам нужно парочка написанных кем-то виджетов, но для того что бы максимально натсроить все как вам хоетлось бы - нужно таки его учить. И тут у меня встал вопрос. По сути я занимаюсь системным администрированием, и у меня даже было время заняться изучением языка, но размышления в направлении "Учить язык программирования для того что бы настроить конфиг тайлового ВМ и все?" навели меня на мысль положить на рагульный Луа сильно и навеки... Ведь по сути, применения LUa для администрирования гибридной сети (windaus, *nix, Mac) я не нашел, и потому забил. И тут,
блуждая необьятными просторами нашей вселенной я наткнулся на Qtile  - тайловый ВМ написанный на Python и имеющий конфиг на нем же. И о чудо - питон идеально подходит для системного администрирования. Ну что же засучим рукава и посмотрим на что способен этот зверь...

    Описывать установку Qtile я не буду, потому как данное рукодство можно найти как на сайте  Home Page
    так и на его форуме Forum

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


mkdir -p ~/.config/qtile[/code]
далее, скопируем конфиг из папки которую мы стянул с гита для установки
cp build/lib/libqtile/resources/default_config.py ~/.config/qtile/config.py

Далее, я приведу свой конфиг и постараюсь максимально прокомментировать его.
(Те кто не знаком с питоном - пробелы и табуляции необходмо сохранять)

-> cat .config/qtile/config.py

#Импортируем необходимые нам компоненты
from libqtile.manager import Key, Screen, Group, Drag, Click
from libqtile.command import lazy
from libqtile import layout, bar, widget

#Для того что бы сделать конфиг более читабельным, внесем переменные, которые
#позже будем использовать
#(по умолчнию WinKey = mod4,  Alt = mod1)
mod = "mod4"
alt = "mod1"

# Для того что бы указать везде ваш любимый шрифт, не всписывая каждый раз все переменные
#сделаем это через функцию. Которая возвращает нам параметры и размер шрифта который вы указали
def dFont(fs):
    def_font = dict(font='Terminus', fontsize=fs, padding=3,)
    return def_font

#Обозначим хоткеи для смены лайоутов - думаю тут комментарии излишни, если не совсем понятно что и
#зачем, потом просто пробуете и смотрите что меняется
#Layouts Keys
keys = [
    Key(
        [mod], "k",
        lazy.layout.down()
    ),
    Key(
        [mod], "j",
        lazy.layout.up()
    ),
    Key(
        [mod, "control"], "k",
        lazy.layout.shuffle_down()
    ),
    Key(
        [mod, "control"], "j",
        lazy.layout.shuffle_up()
    ),
    Key(
        [mod], "space",
        lazy.layout.next()
    ),
    Key(
        [mod, "shift"], "space",
        lazy.layout.rotate()
    ),
    Key(
        [mod, "shift"], "Return",
        lazy.layout.toggle_split()
    ),
    Key([mod], "h", lazy.to_screen(1)),
    Key([mod], "l", lazy.to_screen(0)),
    Key([alt], "Tab", lazy.nextlayout()),
#Запуск приложений
#Открыть терминал
    Key([mod], "Return", lazy.spawn("urxvt")),
#Открыть браузер
    Key([mod], "w", lazy.spawn("google-chrome")),
#Открыть терминал в котором запустить приложение
    Key([mod], "i", lazy.spawn("urxvt -e ekg2")),

# Application Launcher
# Это утилита dmenu - открывается панелька внизу екрана через которую можно
#быстро запустить нужное вам приложение (необходимо установить dmenu)
    Key(
        [alt], "r",
        lazy.spawn(
            "dmenu_run -b -fn 'Terminus:size=14' -nb '#000000' -nf '#fefefe'")
    ),

# Change the volume if our keyboard has keys
# Если по каким то причинам у вас автоматом не работают клавиши управления зауком на буке
#пропишем их тут
    Key(
        [], "XF86AudioRaiseVolume",
        lazy.spawn("amixer -c 0 -q set Master 2dB+")
    ),
    Key(
        [], "XF86AudioLowerVolume",
        lazy.spawn("amixer -c 0 -q set Master 2dB-")
    ),
    Key(
        [], "XF86AudioMute",
        lazy.spawn("amixer -c 0 -q set Master toggle")
    ),

#Suspend Mode
# если клавиша усыпить не работает пропишем действие на нее (не требует рута - но необходимо установить upower)
    Key(
        [], "XF86Sleep",
        lazy.spawn("dbus-send   --system   --dest=org.freedesktop.UPower   --type=method_call   --print-reply   /org/freedesktop/UPower   org.freedesktop.UPower.Hibernate")
    ),

#Restart Qtile
#Закрыть окно
    Key([mod], "c", lazy.window.kill()),
#Рестартонуть кутиль, при этом все открытые приложения остаются (перечитывается конфиг)
    Key([alt, "control"], "r", lazy.restart()),
]
#Тут проще самому попробовать чем обьяснить.
mouse = [
    Drag([alt], "Button1", lazy.window.set_position_floating(),
         start=lazy.window.get_position()),
    Drag([alt], "Button3", lazy.window.set_size_floating(),
         start=lazy.window.get_size()),
    Click([alt], "Button2", lazy.window.bring_to_front())
]

#Добавим список наших рабочих столов (произвольное количество)
groups = [
    Group("Term"),
    Group("WwW"),
    Group("IM"),
    Group("IDE"),
]
#Переключение между столами по mod+порядковый номер
for index, grp in enumerate(groups):
    keys.extend([
                Key([mod], str(index + 1), lazy.group[grp.name].toscreen()),
                Key([mod, alt], str(index + 1), lazy.window.togroup(grp.name))
                ])
#Лайоуты по умолчанию (откройте 2 окна и поклацайте alt+tab что бы было понятно)
layouts = [
    layout.Max(),
    layout.Stack(stacks=2),
    layout.Tile(ratio=0.25),
]
#Настройка скрина и панели с виджетами, так же можно настроить и на несколько монитров
screens = [
    Screen(
        top=bar.Bar(
            [
            #Вот как раз пользуемся нашим шрифтом по умолчанию
            #в целом я тут постарался перечислить основные парамеры для виджетов
            #так что экспеременитируйте (если редактировать кофиг каким нить ИДЕ то получите автокомплит и.т.д.)
                widget.GroupBox(**dFont(16)),
                widget.CPUGraph(),
                widget.MemoryGraph(),
                widget.WindowName(**dFont(20)),
                widget.Systray(),
                widget.NetGraph(interface='eth1'),
                widget.Clock('%H:%M %a %d/%m', **dFont(20)),
                widget.Volume(foreground="70ff70", **dFont(20)),
                widget.Battery(**dFont(20)),
            ],
            30,
        ),
    ),
]
#ну тут тоже все прозрачно
main = None
follow_mouse_focus = False
cursor_warp = False
floating_layout = layout.Floating()
mouse = ()
#А дальше все ограничено только вашей фантазией, как это все выглядит видно на картинке



Если честно, пока что не могу выделить какие-то заслуги Qtile среди остальных ВМ. Но учитывая мой опыт, результат и затраты труда по его настройке - безусловно он чемпион...
Вот в общем то и все ! Пользуйтесь на здоровье.
Home Page
Forum







2 комментария:

  1. А что делают комбинации
    Key(
    [mod, "control"], "k",
    lazy.layout.shuffle_down()
    ),
    Key(
    [mod, "control"], "j",
    lazy.layout.shuffle_up()
    Key(
    [mod, "shift"], "Return",
    lazy.layout.toggle_split()
    ),

    А то я нажимаю не происходит ничего :)

    ОтветитьУдалить
  2. Меняют размеры окон, но я конфиг выложил общий - там это не учтено !

    ОтветитьУдалить