Используя цвет внутри разделителя |фиксированная ширина поля команд xmobar - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть некоторые настройки 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 вопроса:

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

Ответы [ 2 ]

2 голосов
/ 13 января 2013

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

Кажется, что ответ Томаса сработает, но это не так. Синтаксис файла 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 на символ, который хотите дополнить).

0 голосов
/ 11 апреля 2011

По первому вопросу: как использовать 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 = ... разделитель = ... в ...

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

...
, template = myTemplate
}
...