Некоторые хитрости в использовании xmonad
Некоторое время назад я публиковал здесь статьи по настройке ion3. Всё течёт, всё меняется, и сейчас я использую другой фреймовый оконный менеджер - xmonad. С русской документацией по нему сейчас дело обстоит лучше, чем обстояло с ion3, когда я начал писать о нём. Именно, есть довольно основательная статья xmonad: функциональный оконный менеджер. Так что с вопросами "что такое xmonad" отсылаю туда. Однако, когда есть одна только вводная документация - этого всё-таки недостаточно. Хочется примеров настройки и всяческих вкусностей. И их есть у меня! ;)
Во вводных статьях по xmonad обычно рассматриваются три стандартные "компоновки" (способа автоматического расположения окон): Full, Tall и Mirror Tall. "Контрибы" xmonad содержат ещё довольно много компоновок, однако даже базовые могут использоваться более чем одним способом. Например, компоновку "Tall 1 (1/100) (2/3)" (что означает: одно мастер-окно, занимающее по ширине 2/3 экрана, за раз ширина его может меняться на 1/100) я использую для чтения документов и книг: основную часть экрана занимает окно документа, а сбоку может быть что-то ещё. Конечно, такую компоновку можно сделать и "на ходу" из стандартной Tall несколькими нажатиями (по умолчанию) mod-l, но если есть уже сделанная заготовка - проще обратиться к ней. Итак, "хитрость" первая: делайте "заготовки" из настроенных компоновок, чтобы потом быстро к ним обращаться.
Для того, чтобы удобнее было обращаться к конкретным компоновкам, есть расширение XMonad.Layout.Named. Делаем
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
import XMonad.Layout.Named
и потом в определении layoutHook описываем компоновки, давая им имена. Например, вместо tiled пишем named "dwmtiled" tiled, где "dwmtiled" - выбираемое вами имя компоновки.
По умолчанию для переключения компоновок используются сочетания mod-space (следующая компоновка) и mod-shift-space (предыдущая). Однако, когда компоновок больше чем 2-3, это становится неудобно. Удобнее переключаться сразу на нужную компоновку. Я использую для этого сочетания клавиш типа mod+буква. Чтобы такое себе устроить, подправьте в xmonad.hs строку с импортом модуля XMonad: вместо "import XMonad" напишите
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
import XMonad hiding ( (|||) )
Это мы указали, что не хотим использовать оператор ||| (служащий для перечисления компоновок), определённый в модуле XMonad. Зато мы будем использовать одноимённый оператор, определённый в модуле LayoutCombinators. Итак,
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
import XMonad.Layout.LayoutCombinators
Оператор ||| из LayoutCombinators "умнее", и позволяет переключаться сразу на нужную компоновку. Теперь описываем сочетания клавиш для этого переключения:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
...
, ((modMask, xK_d ), sendMessage $ JumpToLayout "dwmtiled")
, ((modMask, xK_m ), sendMessage $ JumpToLayout "mirror")
...
где "dwmtiled", "mirror" - имена соответствующих компоновок.
Однако переключение на указанную компоновку - только побочная задача модуля LayoutCombinators. Главное его назначение состоит, соответственно названию, в том, чтобы комбинировать компоновки. Этот модуль содержит операторы типа ***||**. Такие операторы разбивают экран на две части, в каждой из которых работает своя компоновка. Количество звёздочек слева и справа показывает, в каком отношении разбивать экран (скажем, упомянутый оператор делит экран в отношении 3:2). Операторы с вертикальными чертами (|) делят экран по вертикали, а с наклонными (например, ***//*) - по горизонтали. Операторы, в которых две черты (вертикальные или наклонные), позволяют во время работы изменять соотношение частей экрана (перетаскивая границу мышкой), а операторы с одной чертой (например, */***) - не позволяют.
Одна проблема с LayoutCombinators состоит в том, что для перемещения окон между разными частями экрана стандартные действия (swapUp, swapDown) не работают. Для этого приходится использовать модуль WindowNavigation, который определяет модификатор компоновки windowNavigation и действие Move (с аргументом U/D/L/R, указывающим, куда двигать окно).
Вот пример использования LayoutCombinators:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Разделить экран по вертикали в отношении 3:1
onebig = windowNavigation (tile ***|* coltile)
where
-- компоновка для левой части
-- master-окно занимает 3/4 по высоте
tile = Mirror $ Tall 1 (1/100) (3/4)
-- компоновка для правой части
-- располагает все окна в один столбец
coltile = Tall 0 (1/100) (1/2)
Здесь onebig - это компоновка, дающая одному окну большую часть экрана (3/4 по вертикали и 3/4 по горизонтали), а остальные располагающая снизу и справа от него. Кому легче один раз увидеть, чем десять раз прочитать - вот пример использования этой компоновки (заодно это иллюстрация к предыдущей статье).
Ещё одна "хитрость" касается автоматического назначения свойств окнам (manageHook). xmonad по умолчанию делает диалоги "плавающими" (float), и это правильно. Только вот по умолчанию распознаются не все диалоги. В частности, по умолчанию xmonad не считает диалогами всплывающие окна Gimp-а (например, диалог кривых и пр). Однако это можно победить. Для таких окон приложения обычно выставляют свойство окна _NET_WM_WINDOW_TYPE в значение _NET_WM_WINDOW_TYPE_DIALOG. Можно заставить xmonad проверять это свойство:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- подключаем библиотеки X11
import Graphics.X11.Xlib.Extras
import Foreign.C.Types (CLong)
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Взять значение свойства окна
getProp :: Atom -> Window -> X (Maybe [CLong])
getProp a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Эта функция проверяет, выставлено ли свойство окна name в значение value
checkAtom name value = ask >= \w -> liftX $ do
a <- getAtom name
val <- getAtom value
mbr <- getProp a w
case mbr of
Just [r] -> return $ elem (fromIntegral r) [val]
_ -> return False
-- Эта функция проверяет, является ли окно диалогом
checkDialog = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG"
Другой "пунктик" - надо ещё распознавать "отрывающиеся" (tear-off) меню. Это тоже можно сделать проверкой значения атома:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
checkMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU"
Объявляем соответствующие manageHook-и и добавляем их к остальным:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Сделать меню плавающими
manageMenus = checkMenu --> doFloat
-- Сделать диалоги плавающими
manageDialogs = checkDialog --> doFloat
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Добавляем наши функции к остальным
myManageHook = ... <+> manageMenus <+> manageDialogs
Xmonad реализует концепцию виртуальных десктопов (здесь они называются workspaces), как, вобщем, и большинство других оконных менеджеров. Однако известна также другая концепция - теги для окон. Теги используются, например, в dwm и awesome. Их можно использовать и в xmonad. У меня сейчас используются обе концепции параллельно.
Чтобы использовать теги в xmonad, нужно подключить соответствующий модуль:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
import XMonad.Actions.TagWindows
Я объявляю несколько функций, для пущей читабельности:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- переместить окна, помеченные тегом name, на текущий workspace
showtag name = withTaggedGlobalP name shiftHere
-- вкл/выкл тег name для текущего окна
toggletag name = withFocused $ \w -> hasTag name w >=
(\b -> if b then delTag name w else addTag name w)
-- снять тег name
remtag name = withFocused (delTag name)
-- перейти к следующему окну, помеченному тегом name
nexttagged name = focusDownTaggedGlobal name
-- переместить окна с тегом name с текущего workspace на "misc"
shiftoff name = withTaggedP name (W.shiftWin "misc")
Т.к. я использую несколько тегов, то для объявления сочетаний клавиш для перечисленных действий я ввожу отдельную функцию:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
-- Объявить сочетания клавиш для тега tag с клавишей tag
tagkeys mask key tag = [
((mod1Mask, key), showtag tag),
((mask, key), toggletag tag),
((mod3Mask, key), nexttagged tag),
((mask .|. controlMask, key), shiftoff tag)
]
(mod3 у меня находится слева от цифрового ряда клавиатуры). Ну и добавляем эти сочетания к остальным:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
...
-- Пометить текущее окно произвольным тегом
, ((modMask, xK_t), tagPrompt defaultXPConfig (\s -> withFocused (addTag s)))
-- Снять произвольный тег
, ((modMask .|. controlMask, xK_t), tagDelPrompt defaultXPConfig)
-- Переместить окна, помеченные произвольным тегом, на текущий workspace
, ((mod1Mask, xK_t), tagPrompt defaultXPConfig (\s -> withTaggedGlobalP s shiftHere))
-- Вкл/выкл тег "mark"
, ((modMask, xK_grave), toggletag "mark")
-- Перейти к следующему окну, помеченному "mark"
, ((mod3Mask, xK_grave), focusDownTaggedGlobal "mark")
...
]
++ (tagkeys modMask xK_exclam "web")
++ (tagkeys modMask xK_numbersign "text")
++ (tagkeys modMask xK_slash "gfx")
++ (tagkeys modMask xK_semicolon "office")
++ (tagkeys modMask xK_colon "docs")
++ (tagkeys modMask xK_question "math")
++ (tagkeys modMask xK_asterisk "files")
++ (tagkeys modMask xK_percent "im")
(у меня typewriter-like раскладка клавиатуры, так что при нажатии цифровых клавиш без шифта получаются знаки препинания).
Для полного счастья надо, чтобы некоторым окнам (отбираемым, например, по классу или заголовку) сразу назначались правильные теги. Стандартного manageHook-а для этого нет, так что приходится изобретать свой. Чтобы было покороче, я просто приведу куски своего xmonad.hs:
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
import XMonad.Hooks.XPropManage
...
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
myManageHook = ignoresome <+> (xPropManageHook xPropMatches) <+> manageMenus <+> manageDialogs
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
ignoresome = composeAll
[ className =? "trayer" --> doIgnore
, className =? "fbpanel" --> doIgnore
, className =? "Plasma" --> doIgnore]
http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite -->
xPropMatches :: [XPropMatch]
xPropMatches = tagclasses ["Epiphany-browser", "Kontact", "Liferea-bin"] "web"
++ tagclasses ["gimp", "f-spot", "Inkscape", "Eog"] "gfx"
++ tagclasses ["gnome-terminal"] "term"
++ tagclasses ["Gedit", "Leafpad", "Gvim"] "text"
++ tagclasses ["Evince"] "docs"
++ tagclasses ["Nautilus"] "files"
++ tagclasses ["Amarok", "Rhythmbox", "Totem"] "media"
++ tagclasses ["Wxmaxima"] "math"
++ moveclasses ["Pidgin"] "im"
++ floatclasses ["Qwerty.py"]
where
ckClass cls = [(wM_CLASS, any (cls==))]
-- добавить тег окну
tag name = pmX (addTag name)
-- добавить тег и переместить окно
moveAndTag name = (\w -> addTag name w > return (W.shift name))
mkfloat = pmX float
-- пометить тегом все окна с данным классом
tagclasses clss name = [ (ckClass cls, tag name) | cls <- clss ]
-- переместить окна с данным классом на воркспейс ws
moveclasses clss ws = [ (ckClass cls, moveAndTag ws) | cls <- clss ]
floatclasses clss = [ (ckClass cls, mkfloat) | cls <- clss ]
Это, конечно, далеко не все "фишки" xmonad. Однако, я надеюсь, кому-то это может послужить стартовой площадкой :)

Привет. Интересно узнать, как избавился от потребности в десятке скратчпадов. Как таковой замены им для xmonad не нашлось.
А я сейчас просто не использую такие приложения, которые нужнаются в скратчпадах :)
Pidgin с кучей окон на отдельном воркспейсе, гимповские панели собрал в одно окно, и оно довольно хорошо управляется специальной компоновкой...
Я в общем-то поступил примерно так же. И всё же по иону скучаю — всё в нём было нормально, только динамичности не хватало…
Отдельный воркспейс для пиджина всё-таки не так удобно, как скратчпад (и urgent в ионе больше нравился). Да и терминалка у меня в скратчпаде была. А гимп я и в ионе с самого начала в одно окно сгонял.
None can doubt the vreatciy of this article.
You can safely deetle some or all of the blocked addresses. Spammers rarely, if ever, go back to previously used addresses. They simply create a new address for each batch of spam they send out.The new Y.Mail (formerly known as Beta) lets you remove only one address at a time. Therefore, it would be better to switch back to the original version of Y.Mail and remove them from there. In the original version, go to Options > Block Addresses. Click one address in the block list, then press Ctrl-A on your keyboard to select all addresses. Then, click Remove Block. You are now ready to accumulate more addresses on your block list. Was this answer helpful?
I was thinking about that, I seem to be blkniocg loads of spam recently I have used about 100+ so far. All I can think is to unblock some of the earlier ones when we have used the 500 up, and hope they wont start bombarding us with spam again, hope someone knows what we can do. Was this answer helpful?
SGkS7s , [url=http://cyiedebbfofk.com/]cyiedebbfofk[/url], [link=http://ybxikpsujglb.com/]ybxikpsujglb[/link], http://hevmuaulpnyw.com/
http://www.keepyourhairback.com/ buy propecia from usa %P http://www.mypillsonline.net/ zovirax 808
That's raelly shrewd! Good to see the logic set out so well.
You couldn't pay me to ingroe these posts!
You are so awesmoe for helping me solve this mystery.
Спасибо Медведеву, теперь в скором времени не нужно будет ходить по кабинетам, всю информацию можно будет найти в интернете.
That's going to make things a lot eesair from here on out.
I was sutrck by the honesty of your posting
http://www.myedservice.com/|cialis :]] http://www.insuranceslife.net/|best life insurance itz
:Good – I should rietacnly pronounce, impressed with your site. I had no trouble navigating through all the tabs and related information ended up being truly simple to do to access. I recently found what I hoped for before you know it in the least. Reasonably unusual. Is likely to appreciate it for those who add forums or anything, web site theme . a tones way for your client to communicate. Excellent task.
Search for The air jordan 7 rich in top qatiluy, several variations and also cheap charges. The environment The air jordan Eight Old style, Aqua within our retail store.
N-L-Studio / ØªØ¨Ø§Ø±Ù Ø§ÙØ±ØÙ ٠عÙÙÙ ÙØ§ ب٠ÙÙØ§Ù .. تصÙÙØ±Ù Ø±ÙØ¹Ù جدا جدا Ù Ù Ø´Ù٠جدا ٠ا شاء اÙÙ٠عÙÙÙ .. Ø£ØØ¯ Ø£ÙÙ Ø§ÙØ¹Ùا٠٠اÙÙ٠تستخد٠٠اÙÙ Ø·Ø§Ø¹Ù ÙØ¬Ø°Ø¨ Ø¥ÙØªØ¨Ø§Ù اÙÙ Ø´Ø§ÙØ¯ Ø£ÙÙ Ø¥Ø®ØªÙØ§Ø± اÙÙ ØµÙØ± اÙ٠٠تاز اÙÙÙ ÙØ·Ùع Ø£ÙÙØ§Øª اÙ٠طع٠ب٠” ØµÙØ±Ù ÙØ°Ùذ٠” Ù Ù Ù ØªØ§Ø²Ù ØØªÙ ÙØªØ´Ù٠اÙÙ Ø´Ø§ÙØ¯ Ø¥ÙÙ Ø²ÙØ§Ø±Ø© اÙ٠طع٠.. ٠٠ا شاء اÙÙ٠عÙÙÙ Ø¨Ø¯ÙØª تتÙÙ ÙØ§Ùش٠٠أتÙÙØ¹ ÙÙ Ù Ø³ØªÙØ¨Ù Ø¨Ø¥Ø®ØªÙØ§Ø± اÙ٠طاع٠ÙÙ ÙÙ ØµÙØ± ÙØ£ÙÙØ§ØªÙا بإذ٠اÙÙÙ .. تسÙÙ Ø§ÙØ¯Ù 2 0
Posts like this make the internet such a treasrue trove
http://www.insuranceslife.net/|affordable life insurance slcotb http://www.lifeinsurers4u.com/|life insurance quotes 906419
http://www.mycarinsur.com/|car insurance quote 41803 http://www.freeinsurestimates.com/|senior life insurance >:-OOO
rvkipgq viagra MogHv cialis RnLWr buy cialis 1153 viagra 6424 cialis zJoRjm cheap viagra jATXCL
ylsramy http://mypaydayloanscanada.ca/ payday loan Canada 7018 cash loans yvLfo [url=http://paydayloans2012.co.uk/]payday loans[/url] 5098
телевизоры philips
Смотреть международные новости можно всем тем людям, которым не безразлична мировая экономическая и политическая ситуация.
тест Люшера
gianelle
садовые цветы посадка
ремонт кухни
аниме магазины в нижнем новгороде
история городов россии
список компьютерных игр/url>
авто новинки 2013 года
ipuiyra viagra nahqa buy generic cialis :-O viagra 3151 viagra 3628 cheap cialis >:-OOO cheap cialis online RXGxgn
eaoqzzy nfbwzcc
wtyrxps Payday advance 8656 payday loans =-] pay day loan 5111
oigenzpn
ljgzrn http://fastpaydayloansfst.com/ fast payday loan 8123 bad credit cash advance 9304
mqyrqos http://paydayloansjjj.ca/ Cash Advance hCssj http://paydayloansplp.com/ fast payday loan >:-[ http://paydayloansjjj.com/ payday advance 3640 http://paydayloansjjj.co.uk/ pay day loans 9171
aedjeul buy cymbalta >:-OOO buy flomax HfDBQh norvasc 2429 inderal 8]]] order cialia aVkHo
ljrpqwsj http://paydayloanshgh.com/ no fax payday loans >:-OOO http://paydayloanshgh.ca/ pay day loan 8736 http://paydayloanshgh.co.uk/ payday loans 9597
ikuislma pay day loan 8]]] payday Canada 7283 payday loans 1024
dkfgsf acheter zithromax 1334 viagra 9610 nizoral GCfqms viagra 7934 viagra >:-OOO
bzsabo http://paydayloansef.com/ short term loan 8166 http://paydayloansftc.ca/ payday loans ZNReKP http://paydayloansef.co.uk/ payday advances YjhRwe
gwnzeb buy viagra 7644 cheap cialis =-] buy cialis 4445 viagra ZJtLE cheap viagra =-]