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に情報を送信する2つの異なる方法を混ぜています。

ここで:

main = xmonad =<< xmobar myConfig

あなたは使用していますxmobar便利な機能。文書のソースリンクをクリックすると、文書がどのように定義されているかを確認できます。それを使うstatusBar関数はデフォルトでxmobarを起動しますxmobarPP。このstatusBar関数はspawnPipeステータスバーアプリケーションを起動し、PPパイプの出力を変更します。

ワークスペースラベルのみを印刷するデフォルトのプリティープリンタとロガーを含むバー。XMonad.Actions.WorkspaceNames使用中のモジュールは名前をワークスペースラベルに関連付けます。それは次を提供workspaceNamesPPしますPP名前を検索してください。

そしてここ:

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

workspaceNamesPPfunctionを使用してステータスを文字列として返す関数にxmobarPP結果を渡し、ルートウィンドウに書き込まれた関数プロパティを書き込む関数にその文字列を渡します。これはxmobarに情報を渡す別の方法です。dynamicLogStringxmonadPropLog_XMONAD_LOGこの属性を読み取るように構成。この場合、xmonadでxmobarを起動する必要はありません。

したがって、どの方法を使用するかを決定する必要があります。

たとえば、次のように XMonad で xmobar を起動できます。spawnPipemyLogHook渡されたパイプに状態を書き込みます。

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関数は追加manageHookする合計も変更します。layoutHookmanageDocksavoidStrutsXMonad.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) ]

使用している機能には、バーの間隔を切り替えるためのxmobarmod + Bショートカットもあるため、キーsendMessage ToggleStrutsバインディングをしたい場合はそのキーも追加する必要があります。

返品:

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

additionalKeysモジュールからインポートし、XMonad.Util.EZConfigすべてのXMonad.Util.EZConfigモジュールをインポートします。

関連情報