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사용 중인 모듈은 이름을 작업 공간 레이블과 연결합니다. 그것은 다음을 제공 workspaceNamesPP합니다PP이름을 검색하세요.

그리고 여기:

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

workspaceNamesPPfunction 을 사용하여 상태를 문자열로 반환하는 함수 xmobarPP에 결과를 전달한 다음 루트 창에 기록된 함수 속성을 쓰는 함수에 해당 문자열을 전달합니다. 이것은 xmobar에 정보를 전달하는 다른 방법입니다.dynamicLogStringxmonadPropLog_XMONAD_LOG이 속성을 읽도록 구성. 이 경우 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함수는 또한 추가 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) ]

사용 중인 기능에는 막대 간격을 전환하기 xmobar위한 mod + B 단축키도 있으므로 sendMessage ToggleStruts해당 키 바인딩을 원할 경우 해당 키도 추가해야 합니다.

반품:

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

additionalKeys모듈에서 가져온 XMonad.Util.EZConfig다음 모든 XMonad.Util.EZConfig모듈을 가져옵니다.

관련 정보