3

我有一些 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%"
       }

我有两个问题:

  • 例如,如果我需要一个着色分隔符 |,我应该全部更改为 。那么如何使用变量in呢?|<fc=#ffffff>|</fc>separator = <fc=#ffffff>|</fc>template
  • 文本,那个NetworkCpu 返回,总是有不同的长度,所以所有的笔划总是有不同的大小。如何设置 Network固定大小的文本?
4

2 回答 2

4

对于第一个问题:

托马斯的回答似乎可行,但事实并非如此。xmobarrc 文件语法看起来像 Haskell,但实际上它的格式非常严格,并且它不支持任何 Haskell 语法,除了文件中已有的语法。

也就是说,显而易见的答案是单独为它们中的每一个着色。结果是一个模板行比它应该的要长一点,也不那么漂亮,以后更改它会做更多的工作,但老实说,只有四个|字符,所以还不错。

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

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

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%"
  }

它几乎完全一样。但不一定非得如此,因为它现在实际上是 Haskell,所以你实际上可以使用 Thomas 的想法,或者比这更远,更远,达到你认为最好的程度。唯一的缺点是,每次编辑文件时,都必须再次编译并运行它,以获得更新的 xmobarrc。

对于第二个问题:

在命令的选项列表中,添加"-w","3",将 3 替换为您希望命令字段固定的大小(以字符数为单位)。如果它超过该大小,这将截断一个字段,如果它低于该大小,则用空格填充该字段。如果您想用 0(或其他字符)而不是空格来填充,请"-c","0"同时添加(或者"-c","n",将 n 替换为您要填充的字符)。

于 2013-01-13T07:49:06.307 回答
0

对于第一个问题:如何separator在您的模板中使用。

您的模板可以转换为字符串列表,然后您只需使用intersperse separatorand 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,你可以把 after 的整个表达式放在let ... in ...后面template =,它就可以正常工作了。或者,您可以将其放在顶层:

myTemplate = let temp = ... 分隔符 = ... in ...

并将您现在必须的模板代码设置为:

...
, template = myTemplate
}
于 2011-04-10T21:47:59.357 回答