XMonad.Action.GridSelect spawnSelected with nice titles
There’s an awesome module available for XMonad called GridSelect. It
contains very pretty window selectors and such. And one of it’s awesome
functions is spawnSelected that aimed to build a grid menu with apps to run.
Usage is pretty simple: spawnSelected conf ["xterm", "smplayer", "gvim"].
But what if you want to have nice titles rather than command names?
If you’ll take a look on that function source it zips given list with
itself and feeds to gridlist function, which returns snd element of chosen
tuple. That means you can easily write your own definitions that will allow to
provide nice names for menu elements. So it will look something like this:

Let’s import module first:
import XMonad.Actions.GridSelect
Then we can define our version of spawnSelected like this:
spawnSelected' :: [(String, String)] -> X ()
spawnSelected' lst = gridselect conf lst >>= flip whenJust spawn
where conf = defaultGSConfig
Now all you need to do is to add a hotkey to run your menu, something like this:
, ((modm, xK_r), spawnSelected'
[ ("Mozilla Firefox", "firefox")
, ("GVim", "gvim")
, ("MCabber", "xterm -e detach -A /tmp/mcabber -z mcabber")
, ("WeeChat", "xterm -e detach -A /tmp/weechat -z weechat-curses")
, ("Terminal", "xterm")
])