Используя цвет внутри разделителя | фиксированная ширина поля команд 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
}