我有一些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
?Network
和Cpu
回来,总是有不同的
长度,所以所有的笔画都有不同
一直大小。我怎么设置
Network
固定大小的文字?答案 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 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 = ... 在......
并设置您现在拥有的模板代码:
...
, template = myTemplate
}