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

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

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

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

Ogis1975

#30
ЦитироватьСтрока ввода для xmonad.
Спасибо. Хорошая функция. Сам давно пользуюсь.

Cообщение объединено 23 апреля 2018, 22:02:07

Добавлю и я еще одну маленькую хитрость, под названием XMonad.Prompt.ConfirmPrompt.

Что это такое?

Фишка в том, что при нажатии клавиш, всплывает окно, где нужно подтвердить действие (enter), или аннулировать (escape). Очень удобно при  завершении сеанса пользователя.
Фактическая обработка ключа выполняется с помощью mkXPrompt.

Приступим.

Импортируем модуль

import XMonad.Prompt.ConfirmPrompt

У вас также должны быть импортированы  данные модули:
import XMonad.Prompt
import XMonad.Prompt.Shell


Назначим сочетание клавиш. У меня вот так:

((mod4Mask .|. shiftMask, xK_q), confirmPrompt myXPConfig "exit" $ io (exitWith ExitSuccess))

Настроим тему:

Открыть содержимое (спойлер)
myXPConfig = def
  { position          = Top
  , alwaysHighlight   = True
  , bgColor             = "#0b1c2c"
  , fgColor             = "#cbd6e2"
  , bgHLight            = "#0b1c2c"
  , fgHLight            = "#F0E0AF"
  , promptBorderWidth = 0
  , font              = "xft:iosevka term:size=9"
}
[свернуть]

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


ChubaDuba

MOC + xmobar. Bach скрипт для вывода в xmobar информации о текущем треке.

Работает только с плеером MOC.


#! /bin/bash

TCOL="#8C8C8C"   
ACOL="#E0AF8F"   
DCOL="#637482"   
PCOL="#4F4F4F"   

MOCSTATE=$(mocp --info | head -n 1 | tail -c +8)

if [ $MOCSTATE == "PLAY" ]; then
  # MOC на воспроизведении
  echo "<fc=$ACOL>$(mocp --info | tail -n +4 | head -n 1 | \
       tail -c +9)</fc> <fc=$DCOL>-</fc> <fc=$TCOL>$(mocp --info | \
       tail -n +5 | head -n 1 | tail -c +12)</fc>"

elif [ $MOCSTATE == "PAUSE" ]; then
  # MOC на паузе
  echo "<fc=$PCOL>$(mocp --info | tail -n +4 | head -n 1 | \
       tail -c +9) - $(mocp --info | tail -n +5 | head -n 1 | tail -c +12)</fc>"
fi



Ogis1975

Цитата: ChubaDuba от 24 апреля 2018, 12:24:52MOC + xmobar.
Хороший скрипт. А вы не пробовали сделать вывод в xmobar информации о текущем треке при использовании mpd? Я листал мануалы, и насколько понял, есть нативный плагин для xmobar, но он в Дебиане отключен.

ChubaDuba

Цитата: Ogis1975 от 24 апреля 2018, 16:54:51при использовании mpd

#! /bin/bash

TCOL="#8C8C8C"   
ACOL="#E0AF8F"   
PCOL="#4F4F4F"

MPDSTATE=$(mpc | sed -e '2 !d' -e 's/^.*\[//' -e 's/\].*$//')

if [ $MPDSTATE == "playing" ]; then
    echo "<fc=$ACOL>$(mpc current | sed "s/ - /\<\/fc\> - \<fc=$TCOL>/")</fc>"
elif [ $MPDSTATE == "paused" ]; then
    echo "<fc=$PCOL>$(mpc current)</fc>"
fi

dogsleg

Цитата: Ogis1975 от 24 апреля 2018, 16:54:51но он в Дебиане отключен

В тестируемом выпуске включён. Раньше libmpd не получалось впихнуть в Debian из-за несовместимости версий, поэтому поддержку mpd пришлось отключить.

Ogis1975

#35
Большое человеческое спасибо Вам,  ChubaDuba ;D Скрипт работает без нареканий. Только цвета поменял :)
Вот результат:


Cообщение объединено 25 апреля 2018, 18:11:49

Цитата: dogsleg от 24 апреля 2018, 20:12:00Раньше libmpd не получалось впихнуть в Debian из-за несовместимости версий, поэтому поддержку mpd пришлось отключить.
Спасибо за информацию, dogsleg. Этого я не знал.
ЦитироватьВ тестируемом выпуске включён.
Значит будем ждать выхода Buster  :) а пока нашел простое решение-скрипт от ChubaDuba.

Cообщение объединено 25 апреля 2018, 18:17:51

Тут нарыл еще один скрипт для mpd и moc. Как говорится, два в одном.
Открыть содержимое (спойлер)
#! /bin/bash
#
# Writes the title and artist of the song currently being played by MPD or MOC to STDOUT, formatted for xmobar
# If MPD is playing a song or is paused, its information will be written. If not, MOC will be checked similarly.
# If neither are playing a song or are paused, nothing will be written.
# Note: if MPD isn't playing some errors will be written to STDERR; don't worry - xmobar only looks at STDOUT

TCOL="cyan"         # The colour to be used to draw the song title when playing
ACOL="lightblue"    # The colour to be used to draw the song artist when playing
PCOL="darkred"      # The colour to be used to draw both the song title and artist when paused

MPDSTATE=$(mpc | sed -e '2 !d' -e 's/^.*\[//' -e 's/\].*$//')
MOCSTATE=$(mocp --info | head -n 1 | tail -c +8)

if [ $MPDSTATE == "playing" ]; then
  # MPD is playing
  echo "<fc=$ACOL>$(mpc current | sed "s/ - /\<\/fc\> - \<fc=$TCOL>/")</fc>"
elif [ $MPDSTATE == "paused" ]; then
  # MPD is paused
  echo "<fc=$PCOL>$(mpc current)</fc>"
elif [ $MOCSTATE == "PLAY" ]; then
  # MOC is playing
  echo "<fc=$ACOL>$(mocp --info | tail -n +4 | head -n 1 | tail -c +9)</fc> - <fc=$TCOL>$(mocp --info | tail -n +5 | head -n 1 | tail -c +12)</fc>"
elif [ $MOCSTATE == "PAUSE" ]; then
  # MOC is paused
  echo "<fc=$PCOL>$(mocp --info | tail -n +4 | head -n 1 | tail -c +9) - $(mocp --info | tail -n +5 | head -n 1 | tail -c +12)</fc>"
fi
[свернуть]
Сам не проверял (использую решение от ChubaDuba), но при рассмотрений по ближе-должен работать. Может кому то и пригодится.

источник.

Ogis1975

Цитата: Ogis1975 от 13 февраля 2018, 20:00:26Гуглил, и нашел, что нужно настроить свой ide, чтобы вместо табов, использовались space. Настроил, но ошибка все равно вылезла. Как я понимаю, нужно править ручками, но как? Я в haskel понимаю чуть больше, чем ноль. Как это победить? В принципе не критично, но хочется исправить...
Подниму старую тему. С этой мини-проблемой разобрался. Решение оказалось проще простого. Нужно было удалить white spaces, перед этим настроив Geany так, чтобы он показывал "show white space"


Wtabs были обозначены символом "------->". Я эти символы выделил мышкой, и поменял на пробелы. Может кому и пригодится.

ChubaDuba

#37
Xmobar. Избавляемся от забугорного формата даты.

Выкидываем из ~/.xmobarrc стандартный Run Date и вставляем результат
работы скрипта time:

#!/bin/bash

DATA=`date "+%d.%m"`
DAY=`date "+%a"`
TIME=`date "+%H:%M"`
if [[ $DAY = "Сб" ]]; then echo '<fc=#DBA3A2>'$DAY'</fc>' \
'<fc=#84AAD9>'$DATA'</fc>'  '<fc=#84AAD9>'$TIME'</fc>'
elif [[ $DAY = "Вс" ]]; then echo '<fc=#DBA3A2>'$DAY'</fc>' \
'<fc=#84AAD9>'$DATA'</fc>'  '<fc=#84AAD9>'$TIME'</fc>'
else echo '<fc=#84AAD9>'$DAY'</fc>' '<fc=#84AAD9>'$DATA'</fc>'  \
'<fc=#84AAD9>'$TIME'</fc>'
fi
exit 0


В ~./xmobarrc:

...
Run Com "/путь_до_скрипта/time" [] "time" 10,
...
, template = " %StdinReader% }{ ...%time%... }



Ogis1975

#38
Простой скрипт, для вывода уровня громкости в xmobar. Показывает проценты и красивый мини бар.
Приступим.

Открыть содержимое (спойлер)
#! /bin/sh
# getVolumeForXmobar.sh
# based on: https://bbs.archlinux.org/viewtopic.php?id=74842




vol=`amixer get Master`

vol=${vol%%*\[off\]}
vol=${vol:-MM}

vol=${vol#*\[}
vol=${vol%%%\]*}

case $vol in
   1*) vol="[#---------] $vol%" ;;
   2*) vol="[##--------] $vol%" ;;
   3*) vol="[###-------] $vol%" ;;
   4*) vol="[####------] $vol%" ;;
   5*) vol="[#####-----] $vol%" ;;
   6*) vol="[######----] $vol%" ;;
   7*) vol="[#######---] $vol%" ;;
   8*) vol="[########--] $vol%" ;;
   9*) vol="[#########-] $vol%" ;;
  100) vol="[##########]$vol%"  ;;
    *) vol="[----!!----] $vol " ;;
esac

printf '%s' "$vol"
[свернуть]

Для отображения в xmobar, остается добавить скрипт в конфигурационный файл xmobarrc. У меня вот так:
...
-- volume indicator                   
, Run Com "/home/mindaugas/.scripts/volume.sh" [] "myvolume" 10

...
      , template = " %StdinReader% }{ ...%myvolume% ...}

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



Модифицированный и упрощенный скрипт, показывающий вывод в xmobar информацию о текущем треке при использовании mpd. Показывает исполнителя, название трека, также показывает статус трека (в процентах).

Начнем.

Открыть содержимое (спойлер)
#!/bin/sh
#
# Modified version of http://github.com/jelly/dotfiles/raw/master/bin/mpd.sh
#
# mpd script for showing mpd song + artist in xmobar

MPD="$(mpc | grep -)"

if [ -z "$MPD" ]; then
  echo ""
else
  PCNT="$(mpc | grep -o '([0-9]*%)')"
  PAUSED="$(mpc | grep -o '\[paused\]')"
  echo $PAUSED $PCNT $MPD
fi
[свернуть]

Для отображения в xmobar, остается добавить скрипт в конфигурационный файл xmobarrc.
У меня вот так:

...
-- music indicator                     
, Run Com "/home/mindaugas/.scripts/music" [] "mymusic" 10

...
      , template = " %StdinReader% }{ ...%mymusic% ...}

...


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


На паузе:

Внимание!
Не забудьте сделать скрипты выполняемыми, командой chmod +x

Удачи.

Ogis1975

Компоновка окон XMonad.Layout.Magnifier
Что это?
Это компоновка окон "увеличительное стекло". Компоновка увеличивает размер окна в фокусе.
Приступим.

Подключаем модуль

import XMonad.Layout.Magnifier

Добавим компоновку. У меня вот так:

myLayoutHook = avoidStruts $ smartBorders $ magnifier (Tall 1 (3/100) (1/2)) ||| Full ||| StackTile 1 (3/100) (1/2)

Также советую, для управления окнами, добавить сочетания клавиш. У меня вот так:
       ...
      , ((mod4Mask .|. controlMask              , xK_equal ), sendMessage MagnifyMore)
      , ((mod4Mask .|. controlMask              , xK_minus), sendMessage MagnifyLess)
      , ((mod4Mask .|. controlMask              , xK_o    ), sendMessage ToggleOff  )
      , ((mod4Mask .|. controlMask .|. shiftMask, xK_o    ), sendMessage ToggleOn   )
      , ((mod4Mask .|. controlMask              , xK_m    ), sendMessage Toggle     )
      ...
       ]
...


Компоновка выглядит вот так:






ChubaDuba

Компоновка окон Middle Column Layout
Подойдёт для владельцев широких мониторов.
Страничка на GitHub
Демо ролик на Youtube


Ogis1975

#41
Cкрипт, показывающий вывод в xmobar информацию о текущем треке при использовании cmus. Показывает исполнителя, название трека.

Начнем.

Открыть содержимое (спойлер)
#!/bin/sh
# Code inspired by content found at http://v3gard.com/2011/01/getting-cmus-to-cooperate-with-conky/

if ps -C cmus > /dev/null; then

artist=`cmus-remote -Q |
   grep --text '^tag artist' |
   sed '/^tag artistsort/d' |
   awk '{gsub("tag artist ", "");print}'`
title=`cmus-remote -Q  |
   grep --text '^tag title' |
   sed -e 's/tag title //' |
   awk '{gsub("tag title ", "");print}'`

   echo "Now Playing: $artist - $title"; else echo "";
fi
[свернуть]

Для отображения в xmobar, остается добавить скрипт в конфигурационный файл xmobarrc. У меня вот так:

...
-- cmus indicator                     
, Run Com "/home/mindaugas/.scripts/xsetcmus.sh" [] "myxsetcmus" 10

...
      , template = " %StdinReader% }{ ...%myxsetcmus% ...}

...


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



Внимание!
Не забудьте сделать скрипт выполняемым, командой

chmod +x

Удачи.

ChubaDuba

#42
Кнопки в xmobar.
В последних версиях xmobar появилась возможность отображать иконки в формате xpm.
Для этого, при сборке xmobar из исходников нужно использовать флаг: --flags="with_xpm"
Себе я сделал иконку с логотипом Debian, при нажатии на которую открывается меню myGtkMenu.

Онлайн конвертер изображений в формат XPM
Готовая иконка с логотипом Debian

Редактируем файл .xmobarrc:
В секции Config указываем путь где лежат иконки:

iconRoot = "путь_до_директории_с иконками"


В  template добавляем отображение иконки и указываем какое действие будет выполняться при нажатии:

, template = "<action=`ваше_действие`><icon=debian_logo.xpm/></action>%StdinReader% } ...


Результат:


Ogis1975

#43
Еще один вариант простого скрипта, для вывода уровня громкости в xmobar. Показывает проценты и красивый мини бар.
Приступим.

#!/bin/sh


# To generate bars in python:
# import numpy
# import math
# for i in numpy.arange(0, 10.1, 0.1):
#     print str(i) + ") bar='" + ''.join(['/' for s in range(0, int(round(i)))]) + ''.join(['-' for s in range(0, int(10 - round(i)))]) +"' ;;"
#
# (Requires minor hand-editing to remove '.0' for whole numbers.
#
#
bars=$(amixer get Master | awk -F'[]%[]' '/%/ {if ($7 == "off") { print "MM" } else { print $2/10 }}' | head -n 1)

case $bars in
    0) bar='----------' ;;
    0.1) bar='----------' ;;
    0.2) bar='----------' ;;
    0.3) bar='----------' ;;
    0.4) bar='----------' ;;
    0.5) bar='/---------' ;;
    0.6) bar='/---------' ;;
    0.7) bar='/---------' ;;
    0.8) bar='/---------' ;;
    0.9) bar='/---------' ;;
    1) bar='/---------' ;;
    1.1) bar='/---------' ;;
    1.2) bar='/---------' ;;
    1.3) bar='/---------' ;;
    1.4) bar='/---------' ;;
    1.5) bar='//--------' ;;
    1.6) bar='//--------' ;;
    1.7) bar='//--------' ;;
    1.8) bar='//--------' ;;
    1.9) bar='//--------' ;;
    2) bar='//--------' ;;
    2.1) bar='//--------' ;;
    2.2) bar='//--------' ;;
    2.3) bar='//--------' ;;
    2.4) bar='//--------' ;;
    2.5) bar='///-------' ;;
    2.6) bar='///-------' ;;
    2.7) bar='///-------' ;;
    2.8) bar='///-------' ;;
    2.9) bar='///-------' ;;
    3) bar='///-------' ;;
    3.1) bar='///-------' ;;
    3.2) bar='///-------' ;;
    3.3) bar='///-------' ;;
    3.4) bar='///-------' ;;
    3.5) bar='////------' ;;
    3.6) bar='////------' ;;
    3.7) bar='////------' ;;
    3.8) bar='////------' ;;
    3.9) bar='////------' ;;
    4) bar='////------' ;;
    4.1) bar='////------' ;;
    4.2) bar='////------' ;;
    4.3) bar='////------' ;;
    4.4) bar='////------' ;;
    4.5) bar='/////-----' ;;
    4.6) bar='/////-----' ;;
    4.7) bar='/////-----' ;;
    4.8) bar='/////-----' ;;
    4.9) bar='/////-----' ;;
    5) bar='/////-----' ;;
    5.1) bar='/////-----' ;;
    5.2) bar='/////-----' ;;
    5.3) bar='/////-----' ;;
    5.4) bar='/////-----' ;;
    5.5) bar='//////----' ;;
    5.6) bar='//////----' ;;
    5.7) bar='//////----' ;;
    5.8) bar='//////----' ;;
    5.9) bar='//////----' ;;
    6) bar='//////----' ;;
    6.1) bar='//////----' ;;
    6.2) bar='//////----' ;;
    6.3) bar='//////----' ;;
    6.4) bar='//////----' ;;
    6.5) bar='///////---' ;;
    6.6) bar='///////---' ;;
    6.7) bar='///////---' ;;
    6.8) bar='///////---' ;;
    6.9) bar='///////---' ;;
    7) bar='///////---' ;;
    7.1) bar='///////---' ;;
    7.2) bar='///////---' ;;
    7.3) bar='///////---' ;;
    7.4) bar='///////---' ;;
    7.5) bar='////////--' ;;
    7.6) bar='////////--' ;;
    7.7) bar='////////--' ;;
    7.8) bar='////////--' ;;
    7.9) bar='////////--' ;;
    8) bar='////////--' ;;
    8.1) bar='////////--' ;;
    8.2) bar='////////--' ;;
    8.3) bar='////////--' ;;
    8.4) bar='////////--' ;;
    8.5) bar='/////////-' ;;
    8.6) bar='/////////-' ;;
    8.7) bar='/////////-' ;;
    8.8) bar='/////////-' ;;
    8.9) bar='/////////-' ;;
    9) bar='/////////-' ;;
    9.1) bar='/////////-' ;;
    9.2) bar='/////////-' ;;
    9.3) bar='/////////-' ;;
    9.4) bar='/////////-' ;;
    9.5) bar='//////////' ;;
    9.6) bar='//////////' ;;
    9.7) bar='//////////' ;;
    9.8) bar='//////////' ;;
    9.9) bar='//////////' ;;
    10) bar='//////////' ;;
    *)  bar='----------' ;;
esac

echo "$bar ($bars)"


Для отображения в xmobar, остается добавить скрипт в конфигурационный файл xmobarrc. У меня вот так:
...
Run Com "/home/mindaugas/.scripts/getMasterVolume" [] "volumelevel" 10,

...
template = " %StdinReader% }{ ...%volumelevel% ...}


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



ChubaDuba

Загоняем калькулятор в Prompt
Об использовании XMonad.Prompt и XMonad.Prompt.Shell уже упоминалось в этой теме.
Можно таким же способом организовать работу с калькулятором.
Что на мой взгляд очень удобно. В своей системе я пользуюсь консольным калькулятором Calc.
Все изменения будем вносить в файл xmonad.hs:

Опишем окно в котором будет открываться калькулятор:


-- Calc Prompt
myCalcConfig = def
        { font                = myFont
        , bgColor             = "#1E2320"
        , fgColor             = "#DBA3A2"
        , promptBorderWidth   = 0
        , position            = Top
        }

В моём случае окно калькулятора будет располагаться вверху экрана, перекрывая xmobar.


Добавляем функцию калькулятора:

-- Calculator
calcPrompt :: XPConfig -> String -> X ()
calcPrompt c ans =
    inputPrompt c (trim ans) ?+ \input ->
        liftIO(runProcessWithInput "calc" [input] "") >>= calcPrompt c
    where
        trim  = f . f
            where f = reverse . dropWhile isSpace



Добавляем комбинацию клавиш:

, ((mod4Mask,     xK_c), calcPrompt myCalcConfig "calc")


Теперь при нажатии клавиш mod4 + c на месте xmobar открывается окно калькулятора. Закрыть его можно, нажав кнопку Esc.