On 06/10/2014, Chris Bell
I run Xmonad on my laptop, where I sometimes have multiple displays (when I'm at my desk). As a result, I have two Xmonad configs - one for a single screen, and one for two screens, which spawns extra copies of some programs (xmobar, for example). However, to keep everything playing nice, I have to manually swap out the config each time I switch my monitor setup by editing my xmonad.hs.
You may have some luck with XMonad.Hooks.DynamicBars (http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-DynamicBars.html). It's for dynamically starting and stopping status bars on each screen, but you could probably use it to manage other things as well. I've been using it for a while now, and it works great for having one xmobar instance per screen. There's one issue (https://code.google.com/p/xmonad/issues/detail?id=538) where the xmobars aren't dealt with automatically. There was a comment about it at the time from the maintainer (http://www.haskell.org/pipermail/xmonad/2013-June/013765.html) but I haven't heard about it since. In the meantime, I just recompile and restart xmonad using a keybinding each time I change my screen configuration, and that works. Only a single configuration file, and no need to pass in arguments or even deal with Xinerama manually.