Используя цвет внутри разделителя | фиксированная ширина поля команд xmobar

У меня есть конфиг xmobarrc

Config { lowerOnStart = False,
         font    = "xft:Terminus-12"
       , bgColor = "#000000"
       , fgColor = "#8080A1"
       , position = Top
       , commands = [ Run Network "eth0" ["-L","0","-H","32","--normal","#429942","--high","#A36666"] 10
                    , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
                    , Run Memory ["-t","Mem: <usedratio>%"] 10
                    , Run Date "/%a/ %_d.%m.%Y / %H:%M" "date" 10
                    , Run Com "sh" ["~/bin/weather.sh"] "weather" 60
                    , Run StdinReader
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = " %StdinReader% }{  W:<fc=#fce94f>%weather%</fc> | %cpu% | %memory% | %eth0% | %date%"
       }

И у меня есть 2 вопроса:

  • Если мне нужна раскраска | разделитель я должен изменить все | на<fc=#ffffff>|</fc>, например. Так как я могу использовать переменную separator = <fc=#ffffff>|</fc> в template?
  • Текст, что Network а также Cpuвозвращаясь, всегда имеют разную длину, поэтому все штрихи имеют разный размер все время. Как я могу установитьNetworkтекст для фиксированного размера?

2 ответа

По первому вопросу:

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

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

Более привлекательное решение - установить fgColor = "#ffffff", а затем добавить "--low","#8080A1" в список опций каждой из ваших команд, и оберните %StdinReader% а также %date% в <fc=#8080A1></fc>, В основном, установите цвет по умолчанию на | цвет, и явно цвет все остальное. Таким образом, вы избегаете писать все эти fc теги, потому что этот цвет неявный. Я бы не рекомендовал делать это таким образом, так как это несколько снижает четкость файла.

Теперь, на самом деле, есть гораздо лучший способ сделать это, который полностью решает эту проблему и все связанные с ней проблемы: напишите это в реальном Haskell. Вы должны написать программу на Haskell, которая в конечном итоге создает и форматирует правильный xmobarrc, а затем печатает его в файл. Лично я считаю, что это хороший вариант для любого надоедливого конфигурационного файла, но xmobarrc особенно хорош для этого, потому что его синтаксис очень близок к синтаксису Haskell. В частности, синтаксис, который использует xmobarrc, полностью соответствует синтаксису, который использует Haskell для описания литеральных данных, что означает, что все, что нам нужно сделать, - это построить Config объект и запустить его по умолчанию showи вся остальная работа сделана для нас, кроме нескольких крошечных различий. На самом деле, здесь, я напишу это очень быстро для вас... здесь. Теперь, если вы импортируете это и определите основной файл следующим образом:

module Main (main) where

import XMobarHs

main = export $ config
  { lowerOnStart = False
  , font     = "xft:Terminus-12"
  , bgColor  = "#000000"
  , fgColor  = "#8080A1"
  , position = Top
  , commands = [ Run $ Network "eth0" ["-L","0","-H","32","--normal","#429942","--high","#A36666"] 10
               , Run $ Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
               , Run $ Memory ["-t","Mem: <usedratio>%"] 10
               , Run $ Date "/%a/ %_d.%m.%Y / %H:%M" "date" 10
               , Run $ Com "sh" ["~/bin/weather.sh"] "weather" 60
               , Run $ StdinReader
               ]
  , sepChar  = "%"
  , alignSep = "}{"
  , template = " %StdinReader% }{  W:<fc=#fce94f>%weather%</fc> | %cpu% | %memory% | %eth0% | %date%"
  }

Это почти точно так же. Но это не обязательно, потому что сейчас это буквально Хаскель, так что вам действительно позволено использовать идею Томаса или пойти намного дальше, в той степени, в какой вы чувствуете себя лучше. Единственным недостатком является то, что каждый раз, когда вы редактируете файл, вы должны скомпилировать и запустить его снова, чтобы получить обновленный xmobarrc.

По второму вопросу:

В списке параметров команды добавьте "-w","3"заменив 3 на размер (в количестве символов), в котором вы хотите, чтобы поля команды были зафиксированы. Это обрезает поле, если оно превышает этот размер, и заполняет поле пробелами, если оно уменьшается. Если вы хотите заполнить 0 (или другим символом) вместо пробелов, добавьте "-c","0" а также (или "-c","n", заменив n на символ, который вы хотите дополнить).

Для первого вопроса: как использовать separator в вашем шаблоне.

Ваш шаблон может быть преобразован в список строк, тогда вы просто используете intersperse separator а также concat:

let temp = [" %StdinReader% }{  W:<fc=#fce94f>%weather%</fc> ", " %cpu% "," %memory% ", " %eth0% ", " %date%"]
    separator = "<fc=#ffffff>|</fc>"
in concat $ Data.List.intersperse separator temp

Это выражение дает:

" %StdinReader% }{  W:<fc=#fce94f>%weather%</fc> <fc=#ffffff>|</fc> %cpu% <fc=#ffffff>|</fc> %memory% <fc=#ffffff>|</fc> %eth0% <fc=#ffffff>|</fc> %date%"

Если вы не привыкли к Haskell, вы можете просто поместить это целое выражение let ... in ... после template = и это будет работать нормально. Кроме того, вы можете поставить его на верхний уровень:

myTemplate = let temp =... separator =... in...

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

...
, template = myTemplate
}
Другие вопросы по тегам