Xmonad

讓 xmonad 在 xmobar 中顯示目前工作區的名稱

  • July 24, 2015

xmonad/xmobar/haskell 的新手,試圖獲取目前工作區的名稱以顯示在 xmobar 中。到目前為止,我有這個 xmonad.hs:

module Main where
 import XMonad
 import XMonad.Hooks.SetWMName
 import XMonad.Hooks.DynamicLog
 import XMonad.Actions.WorkspaceNames
 import XMonad.Util.EZConfig(additionalKeys)
 import XMonad.Prompt
 import XMonad.Util.EZConfig

 main = xmonad =<< xmobar myConfig

 myConfig = defaultConfig { startupHook = setWMName "LG3D" , logHook = myLogHook } `additionalKeys` [ ((mod4Mask, xK_r      ), renameWorkspace defaultXPConfig) ]

 myLogHook = workspaceNamesPP xmobarPP >>= dynamicLogString >>= xmonadPropLog

這似乎允許我更改工作區的名稱(至少會出現一個帶有“工作區名稱:”的提示,並接受我的輸入)。

但是,xmobar 不顯示名稱。

您正在混合兩種不同的方式將資訊發送到 xmobar。

這裡 :

main = xmonad =<< xmobar myConfig

您正在使用xmobar便利功能。您可以點擊文件上的源連結以查看它是如何定義的。它使用該statusBar功能以預設啟動 xmobar xmobarPP。該statusBar函式用於spawnPipe啟動狀態欄應用程序,並修改PP輸出到該管道。

這是您看到的欄,帶有僅列印工作區標籤的預設漂亮列印機和記錄器。您正在使用的XMonad.Actions.WorkspaceNames模組將名稱與工作區標籤相關聯。它提供workspaceNamesPP了與 a 組合PP來檢索名稱的功能。

和這裡 :

myLogHook = workspaceNamesPP xmobarPP >>= dynamicLogString >>= xmonadPropLog

您正在使用workspaceNamesPP帶有 的函式xmobarPP,將結果傳遞dynamicLogString給以字元串形式返回狀態的函式,然後將該字元串傳遞給xmonadPropLog將其作為_XMONAD_LOG屬性寫入根視窗的函式。這是將資訊傳遞給 xmobar 的另一種方式,可以將其配置為讀取該屬性。在這種情況下,您不必從 xmonad 啟動 xmobar。

因此,您應該決定要使用哪種方式。

例如,您可以使用 XMonad 繼續啟動 xmobar spawnPipe,並將myLogHook狀態寫入您傳遞給它的管道:

import XMonad.Util.Run -- spawnPipe and associated functions

main = xmonad . myConfig =<< spawnPipe "xmobar"

myConfig pipe = defaultConfig { startupHook = setWMName "LG3D" , 
                               logHook = myLogHook pipe} 
               `additionalKeys` 
                [((mod4Mask, xK_r), renameWorkspace defaultXPConfig)]

myLogHook pipe = workspaceNamesPP xmobarPP {ppOutput = hPutStrLn pipe}
                  >>= dynamicLogWithPP

statusBar函式還修改manageHookandlayoutHook以將manageDocksandavoidStruts來自XMonad.Hooks.ManageDocks模組添加到它們。你應該使用這個模組,這樣欄和視窗就不會互相踩到。這manageDocks使得 XMonad 忽略類型為停靠或桌面的視窗。佈局修改器根據它們的_NET_WM_STRUT_PARTIAL屬性avoidStruts更改佈局以保留條形空間。

manageHook layoutHookhandleEventHook是的一部分XConfig,所以要添加XMonad.Hooks.ManageDocks模組提供的功能:

myConfig pipe = defaultConfig 
      { 
       startupHook = setWMName "LG3D" , 
       logHook = myLogHook pipe,
       manageHook = manageDocks <+> manageHook defaultConfig,
       layoutHook = avoidStruts $ layoutHook defaultConfig,
       handleEventHook = docksEventHook <+> handleEventHook defaultConfig
      } `additionalKeys` [((mod4Mask, xK_r), renameWorkspace defaultXPConfig) ]

您使用的xmobar功能還綁定了 mod + B 鍵快捷鍵sendMessage ToggleStruts以切換條形間隙,因此如果您想要該鍵綁定,您也應該添加它。

還 :

import XMonad.Util.EZConfig(additionalKeys)
import XMonad.Util.EZConfig

您正在additionalKeysXMonad.Util.EZConfig模組導入,然後您正在導入所有XMonad.Util.EZConfig模組。

引用自:https://unix.stackexchange.com/questions/217213