Xmonad, xmobar. Делимся полезными наработками.

Автор ChubaDuba, 23 января 2018, 15:02:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ogis1975

Цитата: ChubaDuba от 23 июня 2018, 20:40:10Можно таким же способом организовать работу с калькулятором.
Полезная вещь. Спасибо.

ChubaDuba

#46
XMonad.Layout.Spacing
Добавляем пространство вокруг окон.

Очередная заметка по настройке xmonad. XMonad.Layout.Spacing позволяет добавить отступы вокруг открытых окон. Наличие отступов даёт лучшую визуализацию на
экране компьютера при работе с несколькими отрытыми окнами.

Цитировать
Чтобы добавить отступы ко всем окнам, за исключением случаев, когда окно является единственным видимым окном в текущей рабочей области, нужно использовать функцию smartSpacing. Если использовать функцию spacing, то заданное свободное простраство вокруг окон будет добавляться в любом случае.

Добавляем в наш xmonad.hs данный модуль:

import XMonad.Layout.Spacing


После чего модифицируем секцию Layouts. В моём случае это выглядит так:

-- Layouts
myLayouts = minimize (avoidStruts tiled
           ||| threecolmid
           ||| onebig
           ||| imTkabber
           ||| full)
where
    tiled   = smartSpacing 5 $ ResizableTall nmaster delta ratio []
    nmaster = 1
    ratio   = 1/2
    delta   = 3/100

-- basic layouts
full        = noBorders Full
onebig      = smartSpacing 5 $ OneBig (3/4) (3/4)
threecolmid = smartSpacing 5 $ ThreeColMid 1 (3/100) (1/2)
imTkabber   = withIM (1%7) (ClassName "Tkabber") Grid


Если в какой-то компановке вам не нужны отступы, то просто не прописывайте их. Например, я в компановке окон imTkabber отступы не использую.

Остаётся сохранить xmonad.hs и перекомпилировать наш xmonad.

Чтобы изменения вступили в силу необходимо перезайти в систему!



Ogis1975

Компоновка окон- XMonad.Layout.Maximize

Данная компоновка окон, временно как бы "вырывает" сфокусированное окно из видимых в фокусе окон, и заполняет собой экран.

Выглядит вот так:



Как видно из скриншота, у меня Firefox заполнил все рабочее пространство. Это очень удобно, и по моему субьективному мнению, позволяет отказаться от стандартного лайаута "fulscreen".

Но как его настроить? Очень легко!

Добавляем модуль:
import XMonad.Layout.Maximize

Затем отредактируйте свой layoutHook, добавив модификатор  Maximize layout

У меня вот так:
myLayouts = maximizeWithPadding 10 (Tall 1 (3/100) (1/2)) ||| emptyBSP ||| Column 1.6

Обратите внимание, что я добавил значение "10". Это значение помогает регулировать отступы между окном. Если вы не хотите иметь такие отступы, вам нужно, вместо  maximizeWithPadding 10 просто добавить maximize

Теперь, нам только осталось назначить горячую клавишу.
У меня вот так:

   `additionalKeysP`
     [
        ...
      , ("M-<Esc>", withFocused (sendMessage . maximizeRestore))
      ]
...


Удачи!

ChubaDuba

XMonad.Actions.Search
Быстрый поиск информации в internet

XMonad.Actions.Search - удобный инструмент для быстрого поиска информации в internet. Как видно из описания, модуль поддерживает большое количество поисковых движков.
Я сравнительно часто пользуюсь тремя:

deb - Debian package search;
duckduckgo - DuckDuckGo search engine;
youtube - Youtube video search.

Поэтому и добавил функционал только для них.
Чтобы всё это у нас заработало, добавляем в наш файл конфигурации xmonad.hs:
Сам модуль:

import XMonad.Actions.Search


Сконфигурируем окно, в которое мы будем вводить поисковый запрос:

-- Search Prompt
mySearchConfig = def
        { font                = myFont
        , bgColor             = "#1E2320"
        , fgColor             = "#E0AF8F"
        , promptBorderWidth   = 0
        , position            = Top
        , historySize         = 0
        , historyFilter       = deleteConsecutive
        }

Здесь ничего объяснять, думаю, не нужно. Все параметры задаются в зависимости от личных предпочтений пользователя.

И последнее, что нужно сделать - это добавить в конфигурационный файл сочетания горячих клавиш для каждого поискового движка.
Я выбрал следующие сочетания:

deb - mod4 + Shift + d;
duckduckgo - mod4 + Shift + s;
youtube - mod4 + Shift + y.

Соответственно добавляем в конфиг:

- Search prompt
, ((mod4Mask .|. shiftMask, xK_s), promptSearchBrowser mySearchConfig myBrowser duckduckgo)
, ((mod4Mask .|. shiftMask, xK_y), promptSearchBrowser mySearchConfig myBrowser youtube)
, ((mod4Mask .|. shiftMask, xK_d), promptSearchBrowser mySearchConfig myBrowser deb)

где
mySearchConfig - имя нашего окна, которое мы сконфигурировали ранее;
myBrowser - браузер используемый по умолчанию.

Я пользуюсь браузером Chromium поэтому в xmonad.hs прописал константу:

myBrowser = "chromium"


Остаётся перекомпилировать и перезагрузить xmonad, чтобы все изменения вступили в силу.
А вот как это выглядит, например, при нажатии сочетания клавиш mod4 + Shift + s:

После ввода запроса и нажатия клавиши Enter откроется браузер с результатами поиска.

ChubaDuba

Xmobar.
Мониторинг статуса подключения к сети интернет (online/offline).

Последнее время периодически стал отваливаться интернет.
Решил автоматизировать процедуру проверки, а результат проверки
вывести в xmobar.

Скрипт:

#!/bin/bash

color1="#709180"
color2="#DC8BC3"
ip="8.8.8.8"
count=3
default_status="0%"

count_loss=$(ping -c ${count} ${ip} | sed -e '$!{h;d;}' -e x | \
sed -r 's!^[^0]+!!' | sed 's/^\(..\).*/\1/')

if [[ $count_loss == *"$default_status"* ]]; then
echo "<fc=$color1>online</fc>"
else
echo "<fc=$color2>offline</fc>"
fi



Ogis1975

Цитата: ChubaDuba от 04 апреля 2020, 14:49:47Решил автоматизировать процедуру проверки, а результат проверки
вывести в xmobar.
Отличное решение. Спасибо, что поделились!

ChubaDuba

Xmobar. Мониторим почтовый ящик Gmail.

Следить за нашим почтовым ящиком будет утилита fetchmail
Установим её:

$ sudo apt-get install fetchmail


Сконфигурируем её для работы с нашим почтовым ящиком. Создаём файл с настройками:

nano /home/username/.fetchmailrc


В который прописываем имя нашего почтового ящика и пароль:

poll imap.gmail.com with proto IMAP
    user "ваш e-mail" there with password "пароль"
    options nofethmail keep ssl


Присвоим права 600 для созданного файла:

$ chmod 600 /home/username/.fetchmailrc


Создаём скрипт для xmobar:
mail:

#!/bin/sh

color1="#6781A2"
color2="#95B8E7"

IMAPDIRS="INBOX"
totalmsg=0
seenmsg=0

CHECKMAIL=`fetchmail -c -r $IMAPDIRS`

_TOTALMSG=`echo $CHECKMAIL | cut -d " " -f 1`
_SEENMSG=`echo $CHECKMAIL | cut -d "(" -f 2 | cut -d " " -f 1`

TOTALMSG=`echo $_TOTALMSG | awk -v _totalmsg="$_TOTALMSG" \
'{ totalmsg += $1} END {print totalmsg}'`

SEENMSG=`echo $_SEENMSG | awk -v _seenmsg="$_SEENMSG" \
'{ seenmsg += $1} END {print seenmsg}'`

NEWMSG=$(($TOTALMSG - $SEENMSG))

if [ $TOTALMSG -eq $SEENMSG ]; then
echo "<fc=$color1>mail:$NEWMSG/$TOTALMSG</fc>"
else
echo "<fc=$color1>mail:</fc><fc=$color2>$NEWMSG</fc><fc=$color1>/$TOTALMSG</fc>"
fi


И теперь остаётся добавить в файл конфигурации xmobarrc результат работы скрипта:

commands = [ ...
                  , ...
                  , Run Com "/home/username/.../mail" [] "mail" 120
                  , ...
                ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "...%mail%..."
       }


Результат:

ChubaDuba

#52
Цитата: ChubaDuba от 19 марта 2018, 21:20:44Bash скрипт для вывода погоды в xmobar...
Добавил в скрипт вывод информации о направлении и скорости ветра:

weather

#!/bin/bash

s1="OK"
COLOR1="#b2b2a0"
COLOR2="#709180"

CITY_URL="http://old.meteoinfo.ru/rss/forecasts/34630"

SITE="`curl -Is $CITY_URL | head -1 | grep -Eo '.{3}$'`"

if [[ $SITE == *"$s1"* ]]; then

     TOMORROW_TEMP="`wget -O - $CITY_URL 2>/dev/null | \
              grep -w 'Температура' | sed '2!d' | \
              sed -r 's/^[^Т]+//' | sed -r 's/^[^д]+//' | \
              sed -r 's/°.+//' | sed 's/днём //'`"

     POSSIBILITY_RAIN="`wget -O - $CITY_URL 2>/dev/null | \
              grep -w 'Вероятность' | sed '2!d' | \
              sed -r 's/^[^ф]+//' | sed -r 's/^[^к]+//' | \
              sed 's/ков //' | grep -o '^[^<]*'`"

     BREEZE="`wget -O - $CITY_URL 2>/dev/null | \
              grep -w 'Ветер' | sed '2!d' | \
              sed -r 's/^[^В]+//' | grep -o '^[^.]*'`"
             
     
     echo "<fc=$COLOR1>$TOMORROW_TEMP°C($POSSIBILITY_RAIN)</fc> <fc=$COLOR2>$BREEZE</fc>"
     
else

     echo "n/a"
fi





ChubaDuba

Google переводчик в один клик с помощью Scratchpad.

Про Scratchpad уже было выше

Делаем с помощью него быстрый доступ к Google переводчику:


-- Scratchpads
scratchpads = [
         ...
         NS "translate" "chromium --app=http://translate.google.com/#"
          (className =? "Chromium")
          (customFloating $ W.RationalRect 0 0.6 1 0.4)
         ...
        ]
...

-- Keybindings
-- Scratchpads
         ...
         , ((mod4Mask .|. shiftMask,     xK_t), namedScratchpadAction scratchpads "translate")
         ...



ChubaDuba

#54
Xmobar. Курсы валют.

За основу взят скрипт currencyrates.py, написанный на языке Python.
Скрипт не мой, был найден на просторах internet. Поддерживает 169 валют,
в том числе основные криптовалюты. вывести можно любые кросс-курсы.
Скрипт мне понравился, поэтому я решил использовать его.

currencyrates.py:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json,sys,urllib

if len(sys.argv) != 3:
    print("Usage: ./currencyrates.py \
    comma_separated_currency_list base_currency. \
    Example: ./currencyrates.py usd,eur,btc nok")
    sys.exit()

currencies = sys.argv[1]
basecurrency = sys.argv[2]

currencyurl = \
"http://freecurrencyrates.com/api/action.php?do=cvals&iso=" \
+ currencies.replace(',','') + "&f=" \
+ basecurrency + "&v=1&s=cbr"
f = urllib.urlopen(currencyurl)
obj = json.loads(f.read())
res="";
for c in currencies.split(','):
    res += c.upper() + \
    ":{:,.2f}".format(1/obj[c.upper()]).replace(',',' ')

# some unicode currency code replacement (optional)
res = res.replace("USD", "$")
res = res.replace("EUR", "€")
res = res.replace("BTC", "btc")

sys.stdout.write(res);


Чтобы было понимание как он работает, приведу несколько команд:

Текущий курс доллара по отношению к рублю:

   ./currencyrates.py usd rub
   $:74.14


Текущий курс евро по отношению к рублю:

   ./currencyrates.py eur rub
   €:88.43


Вывод сразу нескольких валют по отношению к рублю:

   ./currencyrates.py usd,eur,gbp,uah,nok rub
   $:74.14 €:88.43 GBP:93.76 UAH:2.36 NOK:7.54


Остаётся только применить его к нашему xmobar.
Для этого я создал bash скрипт currency с таким содержимым:

COLORUSD="#709180"
COLOREUR="#C3C19C"

USD=`~/.xmonad/scripts/currencyrates.py usd rub`
EUR=`~/.xmonad/scripts/currencyrates.py eur rub`

echo "<fc=$COLORUSD>$USD</fc> <fc=$COLOREUR>$EUR</fc>"


Редактируем наш .xmobarrc. Добавляем в него:

commands = ...
           ...
           , Run Com "/home/chubaduba/.xmonad/scripts/currency" [] "currency" 7200
           ...
, template = ... %currency% ...


Сохраняемся, перезагружаем xmobar и смотрим результат:


ChubaDuba

Erorr: Could not find module 'XMonad'

Суть проблемы:
После обновления ghc до версии 9.0.2 в Debian Bookworm при попытке сделать рекомпиляцию xmonad.hs командой:
$ xmonad --recompile
получаем ошибку Could not find module "XMonad". Ошибка повторяется для всех модулей, которые используются в xmonad.hs.

Решение:
1. Удаляем каталоги ~/.cabal и ~/.ghc
2. Создаём каталог ~/.config/xmonad
3. Переносим xmonad.hs из ~/.xmonad в ~/.config/xmonad
4. Создаём в ~/.config/xmonad файл cabal.project со следующим содержимым:
packages: */*.cabal
5. Обновляем cabal:
$ cabal update
6. Собираем xmonad и xmonad-contrib:
$ cabal install --package-env=$HOME/.config/xmonad --lib xmonad xmonad-contrib
$ cabal install --package-env=$HOME/.config/xmonad xmonad
7. Если вы используете xmobar, то его тоже нужно пересобрать:
$ cabal install xmobar --flags="all_extensions"
Теперь можно перекомпилировать xmonad.hs:
$ xmonad --recompile
После всех этих манипуляций имеем в системе:
xmobar - 0.44.2
xmonad - 0.17.1
xmonad-contrib - 0.17.1
Вместо cabal для сборки можно использовать stack. Об этом можно почитать тут

ChubaDuba

#56
В новых версиях xmonad и xmobar шрифты задаются в соответствии с Pango format
Например:
font = "xft:DejaVu Sans:size=15:bold:antialias=true"
работать не будет.

ChubaDuba

Xmobar & xft


Последние версии xmobar перестали собираться с поддержкой xft.
Если такая поддержка необходима, нужно установить пакет из репозитория.

ChubaDuba

Поиск на Ozon

Используем XMonad.Actions.Search

  -- URL's
  ozon = "https://www.ozon.ru/search/?text="
  ...
 
  -- Ozon prompt
  myOzonPrompt = def
        { font                = myFont
        , bgColor             = "#1d2021"
        , fgColor             = "#b8bb26"
        , promptBorderWidth   = 0
        , position            = Bottom
        , height              = 32
        , historySize         = 0
        }
  ... 

  -- Search's
  myOzonSearch = searchEngine "Ozon" ozon
  ...

  -- Action Search
  -- Ozon
  ,((mod4Mask .|. shiftMask,  xK_o), promptSearch myOzonPrompt myOzonSearch)

ChubaDuba

Подключаем внешний монитор

Подключаем внешний монитор и смотрим вывод xrandr:
Screen 0: minimum 8 x 8, current 1366 x 1024, maximum 32767 x 32767
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 280mm x 160mm
   1366x768      60.02*+
   1280x720      59.86    60.00    59.74 
   1024x768      60.00 
   1024x576      60.00    59.90    59.82 
   960x540       60.00    59.63    59.82 
   800x600       60.32    56.25 
   864x486       60.00    59.92    59.57 
   640x480       59.94 
   720x405       59.51    60.00    58.99 
   680x384       60.00 
   640x360       59.84    59.32    60.00 
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
VGA-1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 380mm x 300mm
   1280x1024     60.02*+  75.02 
   1280x960      60.00 
   1152x864      75.00 
   1024x768      75.03    70.07    60.00 
   832x624       74.55 
   800x600       72.19    75.00    60.32    56.25 
   640x480       75.00    72.81    66.67    59.94 
   720x400       70.08 
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
где
LVDS-1 - экран ноутбука;
VGA-1 - внешний монитор.

Готовим два изображения:
vw_0.png (1366x768) - для ноутбука;
vw_1.png (1280x1024) - для внешнего монитора.

Пропишем их загрузку в .xinitrc:
feh --bg-center --no-fehbg ~/wallpapers/vw_0.png ~/wallpapers/vw_1.png

Теперь нужно прописать наши мониторы. Сделать это можно в xorg.conf, я же пропишу их в xinitrc с помощью xrandr:
xrandr --dpi 125 --output LVDS-1 --auto --right-of VGA-1
Что, зачем и почему можно почитать в man xrandr. Отмечу только то, что на моём рабочем пространстве внешний монитор стоит слева от ноутбука.

После перезагрузки получаем:


Теперь необходимо добавить горячие клавиши для переключения между мониторами и для перемещения окон между мониторами. Для этого нам понадобится XMonad.Actions.CycleWS
Добавляем в наш xmonad.hs:
import XMonad.Actions.CycleWS
Задаём горячие клавиши:
-- Move between screens (monitor's)
        ,((mod4Mask,                0xff51), prevScreen)
        ,((mod4Mask,                0xff53), nextScreen)

-- Move window between screens (monitor's)
        ,((mod4Mask .|. shiftMask,  0xff51), shiftPrevScreen)
        ,((mod4Mask .|. shiftMask,  0xff53), shiftNextScreen)

Чтобы ненужный монитор не отсвечивал можно добавить горячие клавиши для регулировки яркости мониторов. Ступенчатая регулировка мне не нужна, а вот максимальная/минимальная - в самый раз. Использую для этого вот эти клавиши:

Добавляем в xmonad.hs:
-- Command's
  brightness_LVDS_max = "xrandr --output LVDS-1 --brightness 1"
  brightness_LVDS_min = "xrandr --output LVDS-1 --brightness 0.2"
  brightness_VGA_max  = "xrandr --output VGA-1 --brightness 1"
  brightness_VGA_min  = "xrandr --output VGA-1 --brightness 0.2"

-- Brightnes min/max
        ,((mod4Mask,                0xff57), spawn brightness_LVDS_min)
        ,((mod4Mask,                0xff50), spawn brightness_LVDS_max)
        ,((mod4Mask .|. shiftMask,  0xff57), spawn brightness_VGA_min)
        ,((mod4Mask .|. shiftMask,  0xff50), spawn brightness_VGA_max)