重新加载 xmonad 时干净地重生 xmobar

Nic*_*roi 9 xmonad

这只是一个小烦恼,但我已经使用以下代码使 XMonad 配置文件加载 xmobar:

xmproc <- spawnPipe "/use/bin/xmobar ~/.xmobarrc"
Run Code Online (Sandbox Code Playgroud)

它运行良好,但每次重新加载 XMonad 时都会产生一个新的 xmobar 进程。我想知道有没有简单的方法可以杀死旧的?

更新:根据 entropo 的建议,我创建了一个像这样的 bash 脚本:

#!/bin/bash

for PID in `pgrep xmobar`; do
    kill ${PID} > /dev/null &
done

/usr/bin/xmobar &
Run Code Online (Sandbox Code Playgroud)

并从 XMonad 配置文件调用该脚本。

Rob*_*oli 17

如果您有一个 shell 脚本来启动 XMobar,那么您就“做错了”。您应该使用 xmonad.hs 配置源文件中的正确 Haskell 函数启动 xmobar。看看我的配置主要功能:

-- put it all together
main = do
    nScreens <- countScreens    -- just in case you are on a laptop like me count the screens so that you can go
    xmonad =<< xmobar myBaseConfig
      { modMask = myModMask
      , workspaces = withScreens nScreens myWorkspaces
      , layoutHook = myLayoutHook nScreens
      , manageHook = myManageHook
      , borderWidth = myBorderWidth
      , normalBorderColor = myNormalBorderColor
      , focusedBorderColor = myFocusedBorderColor
      , keys = myKeys
      , mouseBindings = myMouseBindings
      , logHook = myLogHook
      }
    where
        myLogHook = dynamicLogXinerama

myBaseConfig = gnomeConfig
Run Code Online (Sandbox Code Playgroud)

突出的线是这样的:

xmonad =<< xmobar myBaseConfig
Run Code Online (Sandbox Code Playgroud)

即使您重新加载 xmonad,它也会按照应该运行的方式运行 xmobar。您可以从语句中获得 'xmobar' 函数:

import XMonad.Hooks.DynamicLog (xmobar)
Run Code Online (Sandbox Code Playgroud)

这反过来又来自xmonad-contrib 包

所以你看,你想用 XMonad 做的大部分事情都已经解决了,你只需要知道去哪里找。基本上,只需放弃您的脚本并使用它。我希望这有帮助。

  • 好吧,我在XMonad网站上找到了`spawnPipe`代码,真的不容易知道在哪里看!但最后,我更喜欢我使用的技术,因为它更干净,在我的测试中使用 `DynamicLog` 并没有杀死旧进程。我真的很喜欢 XMonad,但是 Haskell 不是一个好的配置语言。 (2认同)

小智 3

不是 xmonad 特定的,但您可以通过检查现有 xmobar 进程的 shell 脚本启动 xmobar。例如,参见http://bash.cyberciti.biz/web-server/restart-apache2-httpd-shell-script/