让 xmonad 在 xmobar 中显示当前工作区的名称

让 xmonad 在 xmobar 中显示当前工作区的名称

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 不显示名称。

答案1

您正在混合两种不同的方式来向 xmobar 发送信息。

这里 :

main = xmonad =<< xmobar myConfig

您正在使用xmobar便利功能。您可以单击文档上的源链接来查看它是如何定义的。它使用statusBar功能以默认启动 xmobar xmobarPP。该statusBar函数用于spawnPipe启动状态栏应用程序,并将PP输出修改为该管道。

这是您看到的栏,带有默认的漂亮打印机和记录器,仅打印工作区标签。XMonad.Actions.WorkspaceNames您正在使用的模块将名称与工作区标签相关联。它提供了workspaceNamesPPPP检索名称。

和这里 :

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

您正在使用workspaceNamesPP函数xmobarPP,将结果传递给以dynamicLogString字符串形式返回状态的函数,然后将该字符串传递给将xmonadPropLog其写入的函数_XMONAD_LOG属性写入根窗口的函数。这是向 xmobar 传达信息的不同方式,可以是配置为读取该属性。在这种情况下,您不必从 xmonad 启动 xmobar。

因此,您应该决定要使用哪种方式。

例如,您可以使用以下命令继续从 XMonad 启动 xmobarspawnPipe,并将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函数还修改manageHooklayoutHook以添加manageDocksavoidStruts来自XMonad.Hooks.ManageDocks模块给他们。您应该使用此模块,以便栏和窗口不会互相踩踏。这manageDocks使得 XMonad 忽略扩展坞或桌面类型的窗口。布局avoidStruts修改器更改布局,根据条形图保留空间。_NET_WM_STRUT_PARTIAL财产。

manageHook layoutHook并且handleEventHook是的一部分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

additionalKeys您从模块导入XMonad.Util.EZConfig,然后导入所有XMonad.Util.EZConfig模块。

相关内容