2011-04-10 51 views
2

我有一些xmobarrc配置在分隔符|中使用顏色xmobar命令字段的固定寬度

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>,爲例。那麼 如何在template中使用變量separator = <fc=#ffffff>|</fc>
  • 文本,即NetworkCpu 回來,總是有不同的 長度,因此所有行程都有不同 大小所有的時間。我如何設置 Network的固定大小的文本?

回答

0

對於第一個問題:如何在模板中使用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%" 

如果你不習慣哈斯克爾,你可以在template =之後加上let ... in ...的整個表達式,它可以正常工作。或者,你可以把它放在一個頂級:

MyTemplate的=讓TEMP = ... 分離= ... 在...

,並設置你現在是模板代碼:

... 
, template = myTemplate 
} 
+0

你確定這應該在'xmobarrc'中工作嗎? – 2012-05-02 20:53:50

+0

xmobar自此評論以來可能有許多版本,因此可能會進行格式更改。我在很長一段時間內沒有使用過xmobarrc。如果您遇到問題,我建議您提出一個新問題。 – 2012-05-02 22:50:39

2

對於第一個問題:

托馬斯的答案似乎像它會工作,但事實並非如此。 xmobarrc文件的語法看起來像Haskell,但它的格式非常嚴格,除了文件中已有的內容外,它不支持任何Haskell語法。

也就是說,顯而易見的答案是隻爲每個人單獨着色。結果是一個模板行比原本要長一點,也不怎麼漂亮,稍後改變它會有更多的工作,但老實說,只有四個|個字符,所以它並沒有那麼糟糕。

一個更好看的解決方案是設置fgColor = "#ffffff",然後添加"--low","#8080A1"您的每一個命令的選項列表,並在<fc=#8080A1></fc>包裹%StdinReader%%date%。基本上,將默認顏色設置爲|顏色,併爲其他所有顏色明確着色。這樣,您避免編寫所有fc標籤,因爲該顏色是隱含的。我不會推薦這樣做,因爲它會降低文件的清晰度。

現在,實際上有一個更好的方法來完成這個工作,它完全解決了這個問題和所有相關的問題:將它寫在真正的Haskell中。你要做的是編寫一個Haskell程序,最終構建和格式化正確的xmobarrc,然後將其打印到文件中。我個人認爲這對於任何煩人的配置文件來說都是一個很好的選擇,但是xmobarrc是一個非常好的選擇,因爲它的語法和Haskell的語法非常接近。更具體地說,xmobarrc所使用的語法完全是Haskell用來描述文字數據的語法,這意味着我們所要做的就是構建一個Config對象並運行其默認show,其餘所有工作都爲我們完成,其他比一些微小的差異。其實,在這裏,我會很快爲你寫出這個... here。現在,如果你導入並定義一個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替換爲您要填充的字符)。

+0

我只是想,你可以將編譯/運行xmobarrc生成器綁定到mod + q,並將它放在xmonad --recompile/restart之前。這樣你根本不必擔心它。 – DarthFennec 2013-01-13 09:10:11

相關問題