XMonad + XMobar = ❤

Многие слышали про тайловые оконные менеджеры, некоторые даже слышали о XMonad. А ребята из Google даже променяли Unity/Gnome на XMonad. Что же это такое, как это настраивать и как с этим жить? Краткий workaround для любителей кастомизировать всё подряд.



Дружище, зачем же оно мне?


Для себя я выделил несколько ситуаций, когда он особенно полезен особенно полезен:

  • Рабочий стол ноутбука для разработки. Места не хватает, очень хочется использовать его максимально эффективно;
  • Многомониторные рабочие места. XMonad позволяет во всю использовать преимущества нескольких мониторв с помощью xinerma;
  • Частое переключение контекстов задач. Например, разработчику часто приходится переключаться между IDE, файловым менеджером, консолью и прочими инструментами. Этот процесс можно ускорить;
  • Надоел визуальный шум от стандартных оконных менеджеров.


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

Немного о коде и примерах


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

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

Шаг 1: Установка XMonad


Данное действие специфичено для archlinux
Первое, что нужно сделать — это поставить yaourt, если он не стоит конечно же. Не буду утомлять, я делаю это скриптом install-01-yaourt.sh. (Когда нашел на просторах интернета, спасибо автору.)

Ставим XMonad:

yaourt -S xmonad xmonad-contrib xmobar dmenu2

Или, если хотим поставить из haskell-core репозитория:

yaourt -S haskell-xmonad haskell-xmonad-contrib xmobar dmenu2

Так же можно поставить через yaourt darcs версию, но этот вирант мы опустим.

Шаг 2: Минимальная настройка XMonad


Конфигурирование XMonad производится с помощью файла ~/.xmonad/xmonad.hs. Как вы уже наверно догадались, конфигурация пишется на Haskell.

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

Минимальный .xmonad/xmonad.hs:

import XMonad

main = xmonad defaultConfig
        { modMask = mod4Mask -- Use Super instead of Alt
        , terminal = "urxvt"
        }


Курс молодого бойца по управлению XMonad


При использовании тайлового оконного менеджера, окон как таковых — нет. Есть тайлы. Тайлы ведут себя в соответсвии с текущем Layout автоматически располагаясь так или иначе (например, Layout Grid — тупо отображает таблицой или же Full — отобразить одно главное окно).

Layout


Компанует тайлы. По умолчанию переключение между Layout`s производится с помощью сочетания modKey+space.
В нашем случае modKey = клавише Windows(Super).

Тайл


Это и есть те самые, привычные нам окошки.

В Layout может быть настроена поддержка изменения размера тайлов и количества мастер окон. Так же можно «отсоединить» тайл, зажав кнопку modKey и потянув за окно мышкой. А modKey+RightMouseButton будет изменять размер окошка. Перевести тайл из режима doFloat в стандартный можно комбинацией modKey+t.

Мастер тайл — тайл, или группа тайлов, которые будут отображаться на «самом видном месте». На скришоте в шапке, master тайл самый большой, его сразу видно.

Между тайлами можно переключаться сочетаниями modKey+tab или modKey+j/modKey+k — фокус на предыдущий/следующий тайл. Так же тайлы можно менять местами с мастер тайлом или предыдущими: modKey+entеr — поменять местами текущий тайл и мастер тайл. modKey+J/modKey+K — поменять местами со следующим/предыдущим

Workspace


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

Переключаться между Wokspace можно с помощью сочетания modKey+#, где # — номер рабочего стола (не на цифровой клавиатуре).

Подведём итог:

modKey+tab — фокус на следующий (или modKey+shift+tab на предыдущий);
modKey+j/modKey+k — фокус на следующий/предыдущий;
modKey+J/modKey+K — поменять текущий и следующий/предыдущий;
modKey+entеr — поменять текущий тайл и мастер тайл местами;
modKey+m — фокус на мастер тайл;
modKey+# — рабочий стол №#;
modKey+t — перевести тайл из режима doFloat в стандартный.

Оставлю это тут: xmonad cheatsheet

Шаг 3: Запуск


Есть много способов запустить XMonad, рассмотрим парочку.

1. Чистый запуск


У нас установлены только XMonad, нам не нужен ни Gnome, ни KDE, ни XFCE. Мы сами по себе.
В этом случае для запуска достаточно сконфигурировать запуск xmonad в файле инициализации X системы: .xinitrc:

setxkbmap -layout "us,ru"
setxkbmap -option "grp:caps_toggle,grp_led:scroll"

xsetroot -cursor_name left_ptr &

export PATH=~/bin:$PATH

#exec startxfce4
#exec startkde
#exec gnome-session
exec dbus-launch xmonad


Полезняшка: мой .xinitrc

Теперь при запуске startx запустется xmonad (конечно же, эта команда исполняется, когда ещё нет X сессии).

2. Замена текущего оконного менеджера


XMonad умеет нагло заменять текущий window manager. Для этого достаточно выполнить простую команду:

xmonad --replace


3. Интеграция с __ПодставитьЧтоНужно__


А подставить можно, например, GNOME (дока для archlinux).
Тут, я думаю, каждый найдёт то, что ему нужно, мы же двинемся к самому интересному.

Шаг 4: Нескучные обои


Если вы запустили xmonad с минимальным конфигом, то уже, наверно, заметили, что там чёрный экран. Обоев нет!
Как же так, подумали мы, в gnome есть, в kde есть… И тут сделаем!

Быстро исправляем это недоразумение:

sudo pacman -S feh
feh --bg-center /usr/share/backgrounds/gnome/Bokeh_Tails.jpg # Тут можно подставить путь до любой картинки. Или, о господи, даже http урл!
feh --bg-center http://habrastorage.org/files/c1a/90a/763/c1a90a763acc48a083a325d42f86f8ad.jpg # да да, даже так!


Вам, наверно, понравилось, да? Можно поставить любимую картинку из интернета прямо на рабочий стол, зафиксируем результат:

echo "feh --bg-center http://habrastorage.org/files/c1a/90a/763/c1a90a763acc48a083a325d42f86f8ad.jpg &">>~/.xinitrc


Шаг 5: Рашпиль


Ну вот теперь можно работать, возьмём в руки инструмент и начнём допиливать XMonad.

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

defaults = defaultConfig {
          terminal                 = "urxvt"
        , workspaces           = myWorkspaces
        , modMask              = mod4Mask
        , borderWidth          = 2
	}

myWorkspaces :: [String]
myWorkspaces =  ["1:web","2:dev","3:term","4:vm","5:media"] ++ map show [6..9]

main = do
        xmonad defaults


Теперь наши рабочие столы с названиями, но ты, дядя Фёдор, этого всё равно не увидишь, ведь у тебя xmobar не настроен!
Ладно, отложим xmobar, сделаем нечто более существенное:


defaults = defaultConfig {
          terminal                 = "urxvt"
        , workspaces           = myWorkspaces
        , modMask              = mod4Mask
        , layoutHook            = myLayoutHook
        , handleEventHook  = fullscreenEventHook  -- для корректного отображения окон в полно экранном режиме
        , startupHook           = setWMName "LG3D"  -- для совместимости определёных приложений, java например(IntelliJ IDEA)
        , borderWidth           = 2
        , normalBorderColor  = "black"
        , focusedBorderColor  = "orange"   
	}

myWorkspaces :: [String]
myWorkspaces =  ["1:web","2:dev","3:term","4:vm","5:media"] ++ map show [6..9]

myLayoutHook = spacing 6 $ gaps [(U,15)] $ toggleLayouts (noBorders Full) $
    smartBorders $ Mirror tiled ||| mosaic 2 [3,2]  ||| tabbed shrinkText myTabConfig
      where 
        tiled = Tall nmaster delta ratio
        nmaster = 1
        delta   = 3/100
        ratio   = 3/5

main = do
        xmonad defaults


Теперь посмотрим что получилось, для этого:

  • перекомпилим командой xmonad --recompile
  • если нет ошибок перезапустим xmonad --restart

И, вуаля, изменения должны вступить в силу.

Выполним комбинацию modKey+shift+enter. Должнен открыться тайл с консолью. Если не открылся, возможно, проблема в строчке конфига xmonad.hs:

          terminal                 = "urxvt"

Укажите терминал, которые есть в системе, или установите urxvt:


sudo pacman -S rxvt-unicode


Сочетанием modKey+p можно вызвать dmenu (откроется сверху, набирая команду, там будет отобажён список приложений, которые можно запустить). Вызовем gvim, например, modKey+p -> печатаем gvim (если он, конечно, есть в системе) жмакаем enter.

Итак, у нас есть рабочие столы, тайлы, лайауты… Так давайте же автоматически направлять приложения на разные рабочие столы? Давайте.

Идём в наш конфиг xmonad.hs и добавляем следующее:

...
defaults = defaultConfig {
          terminal                 = "urxvt"
        , workspaces           = myWorkspaces
        , modMask              = mod4Mask
        , layoutHook            = myLayoutHook
        , handleEventHook  = fullscreenEventHook  -- для корректного отображения окон в полно экранном режиме
        , startupHook           = setWMName "LG3D"  -- для совместимости определёных приложений, java например(IntelliJ IDEA)
        , borderWidth           = 2
        , manageHook          = myManageHook  -- Добавили ХУК Сюда
        , normalBorderColor  = "black"
        , focusedBorderColor  = "orange"   
	}

-- Добавим хуук с реализацией
myManageHook :: ManageHook
	
myManageHook = composeAll . concat $
	[ [className =? c --> doF (W.shift "1:web")		| c <- myWeb]
	, [className =? c --> doF (W.shift "2:dev")		| c <- myDev]
	, [className =? c --> doF (W.shift "3:term")	        | c <- myTerm]
	, [className =? c --> doF (W.shift "4:vm")		| c <- myVMs]
	, [manageDocks]
	]
	where
	myWeb = ["Firefox","Chromium","Chrome"]
	myDev = ["Eclipse","Gedit","sublime-text"]
	myTerm = ["Terminator","xterm","urxvt"]
	myVMs = ["VirtualBox"]
....


Теперь

xmonad --recompile && xmonad --restart


Через dmenu запускаем например sublime-text, и вот она! Вот она магия! Он сразу оказался на рабочем столе с пометкой 2:dev.

Нажмём modKey+shift+enter для запуска терминала и, о чудо! Он окажется на 3-м рабочем столе.

А как же мне узнать className тайла для отправки на нужный рабочий стол?


Это очень просто. Открываем консоль, набираем команду xprop, дальше тыркаем мышкой в нужное окно и в консоле отобразится информация о нём. Нас интересует поле WM_CLASS(STRING).
Впринципе, не обязательно именно по className фильтровать окна, можно и по другим параметрам. Можно увидеть, что, например, по полю title так же можно отправить окошко куда душе угодно.
Это то, к чему мы так долго шли…
И тут мы вспомнили о дяде Фёдоре. Точнее — о xmobar. Давайте сделаем статус бар. Для тех, кто ещё не понял, это чёрная панелька сверху (скриншот в шапке).

Шаг 6: Напильник


Итак, xmobar уже должен быть установлен. Поэтому открываем наш конфиг xmonad.hs и меняем:

main = do
        xmonad defaults

На:

main = do
	xmproc <- spawnPipe "/usr/bin/xmobar ~/.xmonad/xmobar.hs"
	xmonad $ defaults {
	logHook =  dynamicLogWithPP $ defaultPP {
            ppOutput = System.IO.hPutStrLn xmproc
          , ppTitle = xmobarColor xmobarTitleColor "" . shorten 100
          , ppCurrent = xmobarColor xmobarCurrentWorkspaceColor "" . wrap "[" "]"
          , ppSep = "   "
          , ppWsSep = " "
          , ppLayout  = (\ x -> case x of
              "Spacing 6 Mosaic"                      -> "[:]"
              "Spacing 6 Mirror Tall"                 -> "[M]"
              "Spacing 6 Hinted Tabbed Simplest"      -> "[T]"
              "Spacing 6 Full"                        -> "[ ]"
              _                                       -> x )
          , ppHiddenNoWindows = showNamedWorkspaces
      } 
} where showNamedWorkspaces wsId = if any (`elem` wsId) ['a'..'z']
                                       then pad wsId
                                       else ""

Нет времени ничего объяснять, просто создаём дальше конфиги, а именно ~./xmonad/xmobar.hs:

Config { 
    font = "xft:Droid Sans Mono:size=9:bold:antialias=true"
    bgColor = "#000000",
    fgColor = "#ffffff",
    position = Static { xpos = 0, ypos = 0, width = 1920, height = 16 },
    lowerOnStart = True,
    commands = [
         Run Weather "UUDD" ["-t","<tempC>°C","-L","18","-H","25","--normal","green","--high","red","--low","lightblue"] 36000
        ,Run Memory ["-t","<used>/<total>M (<cache>M)","-H","8192","-L","4096","-h","#FFB6B0","-l","#CEFFAC","-n","#FFFFCC"] 10        
        ,Run Network "enp6s0" [
             "-t"    ,"rx:<rx>, tx:<tx>"
            ,"-H"   ,"200"
            ,"-L"   ,"10"
            ,"-h"   ,"#FFB6B0"
            ,"-l"   ,"#CEFFAC"
            ,"-n"   ,"#FFFFCC"
            , "-c"  , " "
            , "-w"  , "2"
            ] 10
        ,Run Date "%Y.%m.%d %H:%M:%S" "date" 10
        ,Run MultiCpu [ "--template" , "<autototal>"
            , "--Low"      , "50"         -- units: %
            , "--High"     , "85"         -- units: %
            , "--low"      , "gray"
            , "--normal"   , "darkorange"
            , "--high"     , "darkred"
            , "-c"         , " "
            , "-w"         , "3"
        ] 10
        ,Run CoreTemp [ "--template" , "<core0> <core1> <core2> <core3> <core4>°C"
            , "--Low"      , "70"        -- units: °C
            , "--High"     , "80"        -- units: °C
            , "--low"      , "darkgreen"
            , "--normal"   , "darkorange"
            , "--high"     , "darkred"
        ] 50
        ,Run StdinReader
    ],
    sepChar = "%",
    alignSep = "}{",
    template = "%StdinReader% }{ %coretemp% | %multicpu% | %memory%  | %enp6s0% | %UUDD% | <fc=#FFFFCC>%date%</fc>   "
}


Ух, теперь можно присесть и выполнить уже знакомую команду:


xmonad --recompile && xmonad --restart

Должен был появится наш долгожданный бар и теперь, %USERNAME%, должен наконец увидеть, на каком он рабочем сталое находится. Так же вынесли заголовок текущего окна в наш бар (прям как в mac os x, только гибче). За это отвечает dynamicLogWithPP, который копирует информацию в stdin xmobar, предварительно форматируя её.

Очень подробно о xmobar и его плагинах тут.

Будьте внимательны, в font нужно указать существущий шрифт в вашей системе. Его можно найти в выводе команды fc-list.

Шаг 7: Надфиль


Вроде всё работает, но как-то не уютно. Чего бы ещё такого сделать? Давайте отобразим Volume Level в нашем баре! Хм, ХМобаре! Сказал — делай.

Изменяем ~/.xmonad/xmobar.hs


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

,Run PipeReader "/tmp/.volume-pipe" "vol"
template = "%StdinReader% }{ %vol% | %coretemp% | %multicpu% | %memory%  | %enp6s0% | %UUDD% | <fc=#FFFFCC>%date%</fc>   "


Создадим pipe


export _volume_pipe=/tmp/.volume-pipe
[[ -S $_volume_pipe ]] || mkfifo $_volume_pipe

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

amixer sget Master | grep -o -m 1 '[[:digit:]]*%' | tr -d '%'<source>
Отлично, вот его и "сольём":

<source lang="bash">echo `amixer sget Master | grep -o -m 1 '[[:digit:]]*%' | tr -d '%'`>/tmp/.volume-pipe<source>

Обновленные данные отобразились в xmobar.. Вё равно как то счастья не видно. Может дело в этих сухих цифрах? Так давайте сделаем бар громкости в xmobar! Ух, повеселело сразу.

Создаем скрипт ./xmonad/getvolume.sh:

<source lang="bash">#!/bin/sh
vol=`amixer sget Master | grep -o -m 1 '[[:digit:]]*%' | tr -d '%'`
level=`expr $vol / 10`
bars=$level

case $bars in
  0)  bar='[----------]' ;;
  1)  bar='[|---------]' ;;
  2)  bar='[||--------]' ;;
  3)  bar='[|||-------]' ;;
  4)  bar='[||||------]' ;;
  5)  bar='[|||||-----]' ;;
  6)  bar='[||||||----]' ;;
  7)  bar='[|||||||---]' ;;
  8)  bar='[||||||||--]' ;;
  9)  bar='[|||||||||-]' ;;
  10) bar='[||||||||||]' ;;
  *)  bar='[----!!----]' ;;
esac

echo $bar

exit 0


Примерно так, зато быстро. Проверяем:

echo `~/.xmonad/getvolume.sh`>/tmp/.volume-pipe


Не знаю как у вас, а у меня работает. Но как то оно… не автоматически. Хочется ещё вкусняшек, а если хочется, зачем останавливаться?

Бонусные вкусняшки


Редактируем наш ~/.xmonad/xmonad.hs.

Добавим следующее:
defaults = defaultConfig {
...
	}`additionalKeys` myKeys  -- добавили к дефолтной конфигурации новые кнпоки!
myKeys = [         
         ((mod4Mask, xK_g), goToSelected defaultGSConfig)
	 	     , ((mod4Mask, xK_s), spawnSelected defaultGSConfig ["chromium","idea","gvim"])
	 	     , ((mod4Mask, xK_KP_Add), spawn "amixer set Master 10%+ && ~/.xmonad/getvolume.sh >> /tmp/.volume-pipe")
	 	     , ((mod4Mask, xK_KP_Subtract), spawn "amixer set Master 10%- && ~/.xmonad/getvolume.sh >> /tmp/.volume-pipe")         
         ]


Теперь при нажатии на modKey+ -/+ (это — и + на NumKeyboard) будет изменяться громкость и её уровень сразу отобразится в нашей панельке.
Ещё не уснувший читатель мог заметить дополнительную вкусняшку в виде строчки:

((mod4Mask, xK_s), spawnSelected defaultGSConfig ["chromium","idea","gvim"])


В качестве вознаграждения он может исполнить хитрую комбинацию клавиш и увидеть результат.

Как заметили в комментария, хорошо было бы добавить определение цветов темы myTabConfig:

myTabConfig = defaultTheme {
   activeColor         = "#6666cc"
  , activeBorderColor   = "#000000"
  , inactiveColor       = "#666666"
  , inactiveBorderColor = "#000000"
  , decoHeight          = 10
 }


Заключение


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

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

PS: Для экономии места все примеры конфигов не снабжены необходимыми директивами import. Импорты можно стянуть с гитхаба.

Материалы


Сайт XMonad — много инфы и доки по API;
Xmobar Reference — дока по Xmobar и его плагинам;
Архив конфигураций XMonad — примеры кофнигов с прилагающимися картинками результата;
XMonad hotkey cheatsheet — все хоткеи на одной страничке. Для начала советую feh --bg-center www.haskell.org/wikiupload/b/b8/Xmbindings.png;
GitHub xmonad-config — Все конфиги, которые тут использовал, в кучку собрал да на гитхабе разместил.
Поделиться публикацией

Комментарии 94

    0
    Классная статья, Спасибо. А вы перед тем как перейти на xmonad пробовали что-нибудь еще(как пример awesome или что-нибудь из аналогов), почему xmonad?
      0
      Пробовал dwm и awesome. XMonad понравился больше, да и конфигурации на Haskell показались очень гибкими. Ну и вообще специфика попробовать Haskell хоть где то, очень привлекала )
        +1
        А попробуйте ещё i3-wm, ушёл на него с XMonad.
          0
          тоже слышал о i3 много хорошего, но у самого руки не дошли попробовать
      +10
      Я пролистал в надежде посмотреть картинки, а их нет, только одна — для завлекалова, т.к. не в состоянии сейчас оценить всю прелесть текста. Но с другой стороны сам давно сижу на i3. Итак, тайловые менеджеры это очень здорово, но поскольку это менеджер окон хотелось бы увидеть скрины, т.е. хотя бы как-то ощутить пользоватеьский опыт, который сподвиг автора на написание этого поста.
        0
        Все скрины похожи друг на друга как две капли. Вот сейчас сижу в таком окружении тайтлов (два монитора, 3 тайтла):
        image
          0
          А ты знал, что для хрома есть расширение ViRome, такой себе аналог Vimperator'a. Просто мне по душе больше пришелся vim, чем nano, и вот управелние от него в браузере — очень классная штука.
            +1
            У меня firefox + vimperator
            0
            А можно вас попросить расшарить тему и плагины для vim, которые используются тут?
            Очень долго использовал vim лишь с плагином для отображения структуры фс и подсветкой, хочется чего то большего)
              +3
              Могу написать статью на хабр по моим плагинам и подобному добру в Vim.
                0
                Пишите ) Буду очень благодарен!
                  +2
                  А чтоб вы пока не скучали, вот вам мой справочник по некоторым, используемым мной модулям для Vim.
                    0
                    Вот это вам спасибо, то что нужно!
            0
            Не вопрос, скажите какой функционал вас интересует? Я с радостью поделюсь скриншотами в любой интересующей вас конфигурации )
              0
              В i3 есть классная опция hide_edge_borders.
              В awesome нет возможности её реализовать.
              В xmonad можно?
                0
                да, там же есть в конфиге явно прописанный параметр ) И цвет, и ширина… А для Full Layout они убраны с помощью модификатора noBorder
                  0
                  Хорошо если они есть. Указать цвет, ширину, отступ и скрыть границы не проблема, но это не то.
                    0
                    Всё выше перечисленное можно настроить ) Причем цвет есть точно для разного типа окон, активные, не активные и ещё несколько каких то)
                      0
                      Я не сомневаюсь в том что всё вышеперечисленное можно настроить в xmonad (это вполне стандартный функционал).
                      Меня интересует только hide_edge_borders.
                      В awesome вот тоже есть что-то вроде «умных границ», но они ведут себя довольно примитивно. Хорошо если в xmonad поведение границ может быть аналогично i3wm.
                        0
                        К сожалению не знаю какое поведение в i3wm. Но тут есть различные варианты, в конце концов никто не запрещает закодить самому. Вот это помогает настроить borders, а с помощью этих хуков можно сделать приятный спейсинг.
                        Можно на пальцах, как работает hide_edge_borders? Или может видео с примером, заинтересовали эти «умные границы»
                          0
                          При hide_edge_borders both отображаются только те границы что примыкают к другим окнам.

                          Мелочь, но UX в корне меняет.
            +3
            Круто, но Haskell и монады в конфигах — это перебор. А какие еще реально крутые проекты на Haskell знаете вы?
              0
              Знаю haxl что от fb. также можете поискать на github для нахождения большего количества.
                0
                Почему перебор? Нормально. Так же нормально, как lua для awesome.
                  0
                  Потому что тем самым ограничивается количество потенциальных пользователей до тех, кто более-менее понимает Haskell.
                    0
                    Я не понимаю Haskell чуть менее чем совсем, но активно пользую xmonad как дома, так и на работе.
                  0
                  0
                  Можете сравнить с dwm?
                    +5
                    Что касается картинки с хоткеями, я бы порекомендовал вот эту:
                    image
                      –1
                      Это божественно ) Спасибо!
                      0
                      А есть аналоги Unity Dash для XMonad? Т.е. omnibox для поиска всего на свете.
                        0
                        dmenu + google search
                          0
                          О, google уже умеет искать локально установленные приложения, индексирует локальные файлы, залазит в devhelp и даже имитирует написанные мной плагины для юнити. Почти как в 2010.
                            0
                            Я же вроде сказал — dmenu + google.
                              0
                              Извиняюсь, неправильно понял. Я в таких случаях пишу google://dmenu :)
                              Да, dmenu похож на более-менее приемлимую замену. Как минимум «плагины» для него писать точно проще.
                        0
                        Вот кстати в текущей конфигурации у меня не отображаются Табы при Tabbed layout. Не понимаю почему, когда то помню отображались. Может подскажет кто где косяк?
                        +2
                        Много лет работаю в тайловых менеджерах. Были ion3, dwm, wmii, сейчас awesome. Есть ли существенные преимущества сабжа перед другими менеджерами? Насколько он интегрирован с современными подсистемами?

                        Например в awesome мне много проблем доставляет буфер обмена, мне кажется их много, этих буферов обмена, иногда скопируешь что-нибудь, а не вставляется. Приходится копировать в gedit и оттуда копировать куда надо. Например из chrome не копируется в rdesktop. Еще проблема, закроешь окно, откуда скопировал и все, буфер очистился.

                        Отдельная анальная боль от ibus. Обновишься до новой убунты, устанавливается IBus. Проблема с ним такая, если стоит русский язык, то awesome уже не реагирует на команды, на англ все хорошо. Если удалить, то снова становится все хорошо.

                        Тайловые менеджеры это основная вещь, которая меня держит на linux десктоп, потому что ничего подобного в плане личной продуктивности в других системах для себя не нашел.
                          0
                          А с wmii почему ушли?
                            0
                            Слишком простенький, плюс конфигурация прямо в исходниках. На awesome в lua я довольно увесистые конструкции для себя навернул, как мне удобно. В wmii я бы такое не осилил…
                              0
                              Попробуйте i3, он классный, перешёл на него с XMonad. Конечно, конфиг не на языке программирования ограничивает возможности, но зато почти всё, что надо для работы и так из коробки, и при необходимости можно командовать менеджером через dbus.
                                0
                                > можно командовать менеджером через dbus

                                В i3wm же нет dbus. У них свой вело-ipc которым они очень гордятся.
                                  0
                                  Да, на самом деле всё именно так, как вы и сказали, я ошибся. Однако собственный ipc не делает управление этим оконным менеджером извне сложнее, чем если бы это было через dbus.
                                    0
                                    Ну, просто скормить последовательность из нескольких команд не проблема, но для чего то большего хочется полноценный стандартизированный ipc или что-то более вменяемое чем их ipc.

                                    Допустим использовать conky для генерации особого (заморочки i3) json-stream для i3bar это то ещё удовольствие.
                            0
                            С буфером никаких проблем не испытывал. Что касается клавиш, то тоже проблем не испытывал. Если с клавишами и возникают проблемы, то они легко решаются путем правки конфига.
                              0
                              С буфером решил вопрос, оказывается косяк rdesktop, решается ключом

                              -r clipboard:CLIPBOARD

                              С клавишами — это баг самого awesome, когда-нибудь починят. Лечится путем сноса IBus, или колдунством с xkbcomp.
                              0
                              Для буфера поставьте что-то вроде clipit
                              По умолчанию при закрытии приложение буфер стирается. clipit это дело сохраняет + хоткеи и история.
                              0
                              Чем вы пользуетесь для менеджмента сетевых соединений? Руками писать всю эту систему приоритетов wifi сетей, реконнекты как-то лениво, а уж тем более для каждого нового соединения редактировать какие-то файлы с конфигами. Когда пользовался awesome, использовал gnome-network-manager.
                                0
                                И тут им же можно пользоваться. На ноутбуке выводил в trayer. Но со временем перешёл на mac os x, а на него страшновато archlinux ставить ) Так и сижу на маке, порой выбешивает)
                                  0
                                  anmi, посмотрите в сторону wicd — есть GTK- консольная и оболочки этого network manager'a
                                    0
                                    GTK- и консольная оболочки… Извините.
                                  0
                                  Немного не в тему, но.
                                  Чтож каждый раз такие палитры, уровня «вырви себе глаза и раздави их»?
                                    0
                                    Каждый волен выбирать сам, но для разработчика важна эффективность. Если палитра решает задачу контрастности элементов окружения и не вызывает отторжения, то всё ок ) Видимо это палитра не для вас, покажите свою? Может возьму на вооружение!
                                    PS: Часто и красноглазиков искажённое чувство прекрасного, это да. Но мы прогрессируем, если нам укажут как)
                                      0
                                      Палитра, в том числе, зависит и от пробега глазьев, так что это индивидуально.

                                      А я сколько лет уже не пытался уйти от борландсишнойтри, но всё ещё пытаюсь воспроизвести DN образца 90-х.

                                      тык

                                      Тут другой вопрос: сколько сущностей нужно держать в поле зрения. И что на фоне :)

                                        0
                                        Про борланд, прям за душу взяло)
                                        Я за аскетичность, не очень люблю прозрачные консоли даже, только последнее время тестирую — пока неплохо)
                                          0
                                          не очень люблю прозрачные консоли

                                          Ну, раз уж серьёзная пьянка пошла, то рекламирую sjterm
                                          Мой вариант такой (как пример, дальше творчески):
                                          /usr/bin/stjerm -k F12 -st always -ab false -w 1024 -h 800 -fn «Monospace 12» -s right -b thin
                                    0
                                    XMobar уже не очень. Использую чуть меньге года taffybar и доволен как слон.
                                      +2
                                      тот случай, когда комменты полезнее статьи (от которой несет manpages)
                                        0
                                        C чего то нужно же начинать ) Про taffybar согласен, отличная штука.
                                        0
                                        Ух у него и зависимостей 0_о
                                        Повторное использование кода, конечно, хорошо, но уверен, что львиная доля установившегося функционала мне ни разу в жизни не понадобится.
                                          0
                                          Например?
                                            0
                                            Мне сложно сказать, что будет нужно, а что нет — еще даже не запускал, не говоря уж о конфигурации.
                                            Но по зависимостям пришлось обновить/установить/пересобрать 108 пакетов. Из них 4 — сам taffybar, ghc, xmonad, xmonad-contrib, и все остальное — из dev-haskell/* Мягко говоря неожиданно для панельки =)
                                              0
                                              Ну да, возможно.
                                              Правда, я использую NixOS и не особо волнуюсь об этом :)
                                                0
                                                А расскажите про впечатления от NixOS в качестве основной системы? Я сижу на Арче, но иногда тянет попробовать Никс. Оно стоит инвестированного времени? Какие лично для вас плюсы/минусы по сравнению с предыдущей системой (какая она была?) обнаружились?
                                        0
                                        А кто-нибудь может посоветовать тайловые оконные менеджеры под винду?
                                          0
                                          Выбирай:
                                          blogerator.ru/page/tajlovye-okonnye-menedzhery-windows
                                          На деле не представляю как можно пользоваться подобным на Windows. В смысле так или иначе пользователи этой ОС довольно часто используют в работе мышку, от чего правая рука больше времени лежит на ней, чем в исходной позиции для печати слепым методом. Более того в Windows нет (по крайней мере до 10 версии) многоэкранности, а для тайловых менеджеров это крайне важно. При такой работе куда проще пользоваться alt+tab.
                                            0
                                            Про многоэкранность не согласен, я ниже уже жаловался на судьбу безрутового пользователя корпоративной машины на RHEL5. На борту nvidia, конфигурить два монитора у техподдержки нет инструкции (смешно, но это так).
                                            Нашел выход — TwinView через nvidia-settings + dwm в варианте разбиения master/stack 50x50, получается этакая двухмониторность для убогих. На винде можно аналогично поступить. Не так удобно, как нативная многомониторность, конечно, floating приложения приходится вручную изменять. Если очень нужно можно и подпилить WM, чтобы он «эмулировал» два монитора из одного «широкого», ну то есть чтобы было два «sublayout».
                                              0
                                              Я не про многомониторность, а про многоэкранность (правильнее даже будет сказать — много рабочих областей (workspaces)). Это когда в xmonad нажимаешь super + 2 и переходишь в чистый рабочий стол без тайтлов, делаешь там что то, затем жмешь super + 1 и возвращаешься к предыдущему рабочему столу.
                                                0
                                                Там же ещё xinerma есть. super+e super+w свапает столы на мониторах. Очень удобно)
                                                  0
                                                  Не свапает, а переключается между экранами. Свапнуть — обменять.
                                                    0
                                                    Так ведь можно и свапнуть или отправить одно окно на соседний экран итд… Много вариантов )
                                                      0
                                                      За это отвечает super+shift+e/w
                                          +2
                                          Нигде не встретил в комментариях, но ещё очень здорово работает связка bspwm+sxhkd+(dzen2 || bar), где можно делать вот такие вещи
                                            0
                                            Впечатляет!
                                            А толковый мануал по допиливанию не подскажете?
                                              0
                                              Ну, в основном man и чужие конфиги :) Если интересно — могу написать пост немного позже.
                                                0
                                                Тоже голосую за мануал)
                                              0
                                              Выглядит очень приятно. А вы сами используете? С каким дистрибутивом?
                                                0
                                                Да, Arch Linux, раньше использовал dzen2 для бара но перешёл на b-a-r, dzen2 остался только для вот таких уведомлений
                                              0
                                              Использовал xmonad долгое время, потом перешел на dwm. Причины просты:
                                              Надоело таскать штангу
                                              Один С файл. dwm можно скомпилить и на работе, без рутовых прав, за суровой проксей, не качая ghc и пакет либ. Главное чтобы Xlib-devel и gcc были,.
                                              После настройки dwm не шибко то отличается от xmonad. Ну разве что layout-ов поменьше из коробки, можно добить патчами (или написать). Многие фичи я не использую, конечно, но автор топика их и не описывает.
                                                0
                                                И так толстая статья получилась, тут главное вовремя остановится. Хотя и у меня не всё в XMonad работает, иногда сам задаюсь вопросом «почему? Почему это не работает?» :)
                                                Последнее время пытаюсь немного попрактиковаться с haskell чтобы лучше понимать возможности конфигов XMonad )
                                                  0
                                                  Да, это понятно. Хорошая статья, и WM отличный. Плюса заслуживает.
                                                  Но «тяжеловат» он для моих нужд. gcc у меня есть на всех машинах, а ghc/haskell-библиотек и рантайма нет ни на одной. А вообще это дело вкуса, а фломастеры у всех разные.
                                                0
                                                Пользовал несколько месяцев Awesome, решил перейти на XMonad, т.к. заинтересовался Haskell. Вроде более-менее настроил, работает, и… Вы уж извините, но, как-то, не дотягивает он до Awesome.
                                                Во-первых: там нет функции (achtung!)«пред. лэйаут». Да. Есть функция «след. лэйаут», есть сброс на некий дефолтный лэйаут; но функции возврата нет. Я задал об этом вопрос на IRC #xmonad, чем вызвал 15 бурное минутное обсуждение, из которого я понял, что α) Это невозможно реализовать в принципе ( geekosaur: (they're actually functions. ever tried to run a function backwards?)© ) β) Ядро XMonad реализовано ввиде некоего мат. концепта StackSet, который очень красивый, будучи представленным в вакууме, но был ужасной идеей для имплементации UI (geekosaur: and most of the problems people have with window behavior boil down to the StackSet being a lovely theoretical concept and a horrible UI implementation© )
                                                Во-вторых: XMobar не показывает, элементарно, свернутые приложения. Я имею ввиду те, что сворачиваются в некий мини-значок, как правило это всякие чаты, торренты, и пр. Гугление по этому поводу мне выдало, что нужно запускать какое-то отдельное приложение, но лично мне его запуск ничего не дал. Так же, вроде бы как, это проблема XMobar, и якобы она отсутствует в TaffyBar. Попытки сконфигурировать и запустить последний, за пред. несколько вечеров еще не достигли успеха.
                                                В-третьих: XMonad сдает мод клавишу VirtualBox'у. Как чинить это, я не имею ни малейшего понятия, Awesome WM из коробки не позволял VB перехватывать свои комбинации. Это очень болезненно, т.к. в VB у меня обычно запущена WinXP c Visual Studio. Я в IRC задавал вопрос на каналах обоих менеджеров, и нагуглил на stackexchange заданный кем-то вопрос — никто ничего об этом не знает.
                                                В-четвертых: в SimpleFloat layout, который я обычно оставляю для некоторых приложений, окна каким-то чудесным образом просто не переключаются. Т.е. я жму кнопку «след. окно», вижу в XMobar'e, что я, вроде бы, переключился, но передо мной по прежнему продолжает висеть окно предыдущего приложения.

                                                Конечно я очень надеюсь, что смогу его довести до более-менее работоспособного состояния, но, если кто-то впервые желает попробовать тайловый оконный менеджер лучше о XMonad даже и не думайте. Я все еще не сбежал с него исключительно из-за своего желания научиться и попрактиковать Haskell.
                                                  0
                                                  Я так же добавлю, что даже до нынешнего, до сих пор слабо-юзабельного, состояния, мне его пришлось настраивать вечерами недели полторы-две. При наличии конкуренции со стороны, к примеру, Awesome, который до всего мной перечисленного настраивается простым копированием откуда-то из /etc/ конфига по-умолчанию, который дальше уже без проблем можно подредактировать под себя, это делает XMonad просто ужасным менеджером.
                                                    0
                                                    Когда вы переключаетесь в SimpleFloat, все тайны остаются в том же положении что и были. Но их можно перетащить например. Сам я правда использовал лишь для конкретных тайлов
                                                    className =? "MPlayer"        --> doFloat 
                                                    

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

                                                    Не понял ваших рассуждений на тему «сворачивания в некий мини-значок». Я не пользуюсь TaffyBar, но для отображения списка окон у меня есть TabLayout, в котором тайны отображаются в виде табов. В крайнем случае могу выводить список в xmobar…

                                                    По поводу свернутых приложений — никто не мешает легким движением рук отправлять тайлы на другой рабочий стол. Ну или лучше привязать конкретный рабочий стол к группе приложений. Именно в этом же концепция XMonad

                                                    А в целом конечно да, XMonad не для слабонервных. В настройке бывает не очевиден и сложен.
                                                    0
                                                    Можно поподробнее про SimpleFloat? В каком смысле перетащить? Вот есть у меня, скажем, два окна в SimpleLayout, мне надо, чтобы при нажатии M-j, окно, на которое перешел фокус, всплыло выше предыдущего. Среди таких приложений я могу назвать pdf читалку и офис, т.к. их не имеет смысла делать меньше полного экрана (по-крайней мере на моем рабочем 1366×768 дисплее), но я бы не рискнул составлять полный список приложений по разным причинам. Мне просто надо, чтобы на SimpleFloat у меня работало переключение между приложениями, вне зависимости от того, какие это.

                                                    Про мини-значок — я имел ввиду трэй. Есть ряд приложений, которые при их «закрытии» просто уходят в этот трэй, и проблема, что я не могу видеть список этих приложений. Ну, или, у меня там стоит klipper, которым я пользуюсь довольно часто.
                                                    На самом деле я этим вечером наконец смог заставить работать taffybar. Я некоторые шаги напишу здесь, на случай, если кто пойдет по моим стопам: во-первых на сегодняшний день не стоит ставить с репозитория taffybar. Он там версии 0.2, а все примеры на гитхаб под версию 0.4, они просто не заработают. Во-вторых качать исходники тоже не надо. taffybar устанавливается в два шага: вначале используем команду «cabal install tafybar», затем скачиваем с гитхаб «taffybar.hs» (при желании редактируем, что надо), и компилируем командой «ghc taffybar.hs». Если все пройдет нормально, это выдаст исполняемый файл собственно панельки — исполняем его, и наслаждаемся. «taffybar.rc» с гитхаб должен находиться в директории «~/.config/taffybar/», так же не забываем глянуть в пример там же «xmonad.hs».
                                                    По непонятным причинам автор не счел нужным оставить доки на гитхаб, и все это пришлось либо угадывать самому, либо спрашивать на IRC, так что, думаю, кому-то это очень пригодиться.

                                                    Понятия не имею, как комментарий ушел в верхний уровень… Полагаю, причина в том, что я случайно закрыл окно, и хабр, к счастью, сохранил мой комментарий, но сдвинул его в самый низ, на что я даже не обратил внимания…
                                                      +1
                                                      Taffybar хорош для тех кто любит haskell ) Можно много классных штучек сделать, но «взял, набросал конфиг, радуешься» это не про него )
                                                      SimpleFloat — при переключении на него, если у вас много тайлов, они будут перекрывать друг друга. Если они изначально не перекрывали — ничего и не будет. Можно например открыть приложение в новом тайме и оно всплывет по умолчанию по центру над другими. При свапе( у меня super+tab) между тайлами они выводились на передний фон. Когда я использовал его, у меня это так работало.

                                                      По поводу трея — я раньше использовал trayer, в котором свернутые приложения, типа чатов, отображаются корректно. Но за ненадобностью перешел на xmobar. Хотя ничто не мешает использовать xmobar и trayer вместе

                                                      Вы пробовали trayer?
                                                        0
                                                        Я думаю, я вернусь на Awesome. Я собачусь с XMonad уже около месяца, но до сих пор так и не получил нормальное рабочее окружение. На половину моих вопросов, заданных в IRC, я слышу либо ответ о том, как это непросто будет реализовать, либо вообще молчание, никто ничего не знает. Наверное можно было бы все это как-то перетерпеть, но я засел в специфичные для XMonad проблемы, и за весь месяц ничуть не выучил Хаскелл — мою главную цель миграции с Awesome на XMonad. Из прочитанных бесед в IRC у меня сложилось впечатление, что этот менеджер умирает, и держится исключительно на энтузиастах/разработчиках; но т.к. ядро/StackSet никто не станет переписывать, он обречен.
                                                        У меня, в общем-то, еще была идея заняться текстовым редактором yi, так что, на чем потренироваться в Haskell, у меня есть. За напрасно потраченное время только обидно, но надо уметь остановиться…
                                                          0
                                                          Развитие действительно какое то вялое. Можете попробовать еще bspwm. В комментариях советовали, выглядит приятно.
                                                            0
                                                            Но он не имеет отношения к Haskell :/ Меня ведь Awesome WM полностью устраивает — удобен, легок в понимании и настройке, много конфигов и туториалов на интернетах. Я пытался перейти на XMonad исключительно из материальных соображений изучения Haskell'а.
                                                              +1
                                                              На мой взгляд, для изучения Haskell и XMonad, и Yi совершенно бесполезны. Скорее, вредны. Из комментариев вижу, что вы пришли к тому же выводу )

                                                              По настоящему действенный способ — попробовать написать на нём что-нибудь сиюминутно полезное. Например, автоматизировать какой-нибудь процесс на работе, написать какой-нибудь полезный конвертер или верификатор / миникомпилятор.
                                                              Я вот всё надеюсь найти время на парсер/форматтер/линт make-файлов.
                                                                0
                                                                Кажется так и появился pandoc :)
                                                                Для изучения возможно не подходит, но как стимул начать использовать Haskell — вполне.
                                                      0

                                                      Статья хорошая, но есть определённые пробелы, не позволяющие просто взять и "утащить" к себе минимально рабочий конфиг. В частности, отсутствует определение myTabConfig

                                                        0
                                                        Благодарю за замечание, как то так выглядит этот кусок:
                                                        myTabConfig = defaultTheme {
                                                           activeColor         = "#6666cc"
                                                          , activeBorderColor   = "#000000"
                                                          , inactiveColor       = "#666666"
                                                          , inactiveBorderColor = "#000000"
                                                          , decoHeight          = 10
                                                         }
                                                        

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

                                                      Самое читаемое