在分隔符内使用颜色|固定宽度的xmobar命令字段

时间:2011-04-10 21:37:43

标签: haskell xmonad 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%"
       }

我有两个问题:

  • 如果我需要着色|分隔符I 应该更改所有| 例如<fc=#ffffff>|</fc>。所以 如何在separator = <fc=#ffffff>|</fc>中使用变量template
  • 文字,NetworkCpu 回来,总是有不同的 长度,所以所有的笔画都有不同 一直大小。我怎么设置 Network固定大小的文字?

2 个答案:

答案 0 :(得分:2)

对于第一个问题:

托马斯的答案看起来似乎有效,但事实并非如此。 xmobarrc文件语法看起来像Haskell,但它实际上对它的格式有限制,并且它不支持任何Haskell语法,除了文件中已经存在的内容。

尽管如此,显而易见的答案是单独为每个人着色。结果是一个模板行,它比它可能应该更长,更不漂亮,稍后更改它会更多的工作,但老实说,只有四个|个字符,所以它不是那很糟糕。

一个更好看的解决方案是设置fgColor = "#ffffff",然后将"--low","#8080A1"添加到每个命令的选项列表中,并将%StdinReader%%date%包裹在{{ 1}}。基本上,将默认颜色设置为<fc=#8080A1></fc>颜色,并明确地为其他所有颜色着色。这样,您就可以避免编写所有这些|标记,因为该颜色是隐含的。我不建议这样做,因为它会稍微降低文件的清晰度。

现在,实际上有一种更好的方法可以解决这个问题以及所有相关的问题:在真正的Haskell中编写它。你要做的是,编写一个Haskell程序,最终构建并格式化正确的xmobarrc,然后将其打印到文件中。我个人认为这对任何讨厌的配置文件都是一个很好的选择,但是xmobarrc对它来说是一个特别好的候选者,因为它的语法非常接近Haskell。更具体地说,xmobarrc使用的语法完全是Haskell用于描述文字数据的语法,这意味着我们要做的就是构建一个fc对象并运行其默认的Config,以及其他所有除了一些微小的差异之外,我们的工作已经完成了。实际上,在这里,我会很快为你写这个...... here。现在,如果你导入它,并定义一个像这样的主文件:

show

几乎完全一样。但它不一定是,因为它现在确实是Haskell,所以你实际上被允许使用托马斯的想法,或者远远超过你的想法,无论你觉得什么是最好的。唯一的缺点是,每次编辑文件时,都必须再次编译并运行它,以获得更新的xmobarrc。

关于第二个问题:

在命令的选项列表中,添加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%" } ,将3替换为您希望修复命令字段的大小(字符数)。如果字段超过该大小,则会截断该字段,如果该字段位于下方,则填充该字段。如果你想用0(或其他一些字符)而不是空格填充,也可以添加"-w","3"(或"-c","0",将n替换为你要填充的字符。)

答案 1 :(得分:0)

关于第一个问题:如何在模板中使用separator

您的模板可以转换为字符串列表,然后您只需使用intersperse separatorconcat

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 = ...                 在......

并设置您现在拥有的模板代码:

...
, template = myTemplate
}