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


9

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

xmproc <- spawnPipe "/use/bin/xmobar ~/.xmobarrc"

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

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

#!/bin/bash

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

/usr/bin/xmobar &

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

Answers:



16

如果您具有启动XMobar的Shell脚本,则说明您“做错了”。您应该使用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

重点是这一条:

xmonad =<< xmobar myBaseConfig

即使重新加载xmonad,它也会按应运行的方式运行xmobar。您可以从以下语句获得“ xmobar”功能:

import XMonad.Hooks.DynamicLog (xmobar)

依次来自xmonad-contrib软件包

因此,您知道,要使用XMonad进行的大多数操作已经解决了,您只需要知道在哪里看即可。基本上,只需放弃脚本并使用它即可。我希望这有帮助。


2
好吧,我已经spawnPipe在XMonad网站上找到了代码,要知道在哪里看真的不容易!但是最后,我更喜欢我使用的技术,因为它更干净,使用时DynamicLog并没有杀死测试中的旧过程。我非常喜欢XMonad,但是Haskell并不是一种好的配置语言。
Nicolas Buduroi 2011年

1
好吧,无论对您有什么用,最终都是好的。但是我认为您在想错了。您无需配置XMonad:可以对其进行扩展。Haskell长官适合扩展。
Robert Massaioli 2011年

对我来说,每次重新加载xmonad时,这都会创建2个新进程。使用spawnPipe会创建2个其他进程。ps -ax返回:“ / bin / sh -c /.cabal/bin/xmobar〜/ .xmobarrc:”,“ / bin / sh -c xmobar”,“〜/ .cabal / bin / xmonad〜/ .xmobarrc”和“ xmobar”。
fsanches

重新安装都解决了我上面提到的问题。
凌晨

1
我很确定您spawnPipe会在新线程中派生一个进程。如果您想spawnPipe创建一个子进程(当主进程执行时会关闭一个子进程),恐怕您必须编写自己的spawnPipe函数。
yyny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.