Turns your workspaces into a more topic oriented system.
This module allows to organize your workspaces on a precise topic basis. So
instead of having a workspace called work you can setup one workspace per
task. Here we call these workspaces, topics. The great thing with
topics is that one can attach a directory that makes sense to each
particular topic. One can also attach an action which will be triggered
when switching to a topic that does not have any windows in it. So you can
attach your mail client to the mail topic, some terminals in the right
directory to the xmonad topic... This package also provides a nice way to
display your topics in an historical way using a custom pprWindowSet
function. You can also easily switch to recents topics using this history
of last focused topics.
Here is an example of configuration using TopicSpace:
-- The list of all topics/workspaces of your xmonad configuration.
-- The order is important, new topics must be inserted
-- at the end of the list if you want hot-restarting
-- to work.
myTopics :: [Topic]
myTopics =
[ "dashboard" -- the first one
, "admin", "build", "cleaning", "conf", "darcs", "haskell", "irc"
, "mail", "movie", "music", "talk", "text", "tools", "web", "xmonad"
, "yi", "documents", "twitter", "pdf"
]
myTopicConfig :: TopicConfig
myTopicConfig = TopicConfig
{ topicDirs = M.fromList $
[ ("conf", "w/conf")
, ("dashboard", "Desktop")
, ("yi", "w/dev-haskell/yi")
, ("darcs", "w/dev-haskell/darcs")
, ("haskell", "w/dev-haskell")
, ("xmonad", "w/dev-haskell/xmonad")
, ("tools", "w/tools")
, ("movie", "Movies")
, ("talk", "w/talks")
, ("music", "Music")
, ("documents", "w/documents")
, ("pdf", "w/documents")
]
, defaultTopicAction = const $ spawnShell >*> 3
, defaultTopic = "dashboard"
, maxTopicHistory = 10
, topicActions = M.fromList $
[ ("conf", spawnShell >> spawnShellIn "wd/ertai/private")
, ("darcs", spawnShell >*> 3)
, ("yi", spawnShell >*> 3)
, ("haskell", spawnShell >*> 2 >>
spawnShellIn "wd/dev-haskell/ghc")
, ("xmonad", spawnShellIn "wd/x11-wm/xmonad" >>
spawnShellIn "wd/x11-wm/xmonad/contrib" >>
spawnShellIn "wd/x11-wm/xmonad/utils" >>
spawnShellIn ".xmonad" >>
spawnShellIn ".xmonad")
, ("mail", mailAction)
, ("irc", ssh somewhere)
, ("admin", ssh somewhere >>
ssh nowhere)
, ("dashboard", spawnShell)
, ("twitter", spawnShell)
, ("web", spawn browserCmd)
, ("movie", spawnShell)
, ("documents", spawnShell >*> 2 >>
spawnShellIn "Documents" >*> 2)
, ("pdf", spawn pdfViewerCmd)
]
}
-- extend your keybindings
myKeys =
[ ((modMask , xK_n ), spawnShell) -- %! Launch terminal
, ((modMask , xK_a ), currentTopicAction myTopicConfig)
, ((modMask , xK_g ), promptedGoto)
, ((modMask .|. shiftMask, xK_g ), promptedShift)
...
]
++
[ ((modMask, k), switchNthLastFocused defaultTopic i)
| (i, k) <- zip [1..] workspaceKeys]
spawnShell :: X ()
spawnShell = currentTopicDir myTopicConfig >>= spawnShellIn
spawnShellIn :: Dir -> X ()
spawnShellIn dir = spawn $ "urxvt '(cd ''" ++ dir ++ "'' && " ++ myShell ++ " )'"
goto :: Topic -> X ()
goto = switchTopic myTopicConfig
promptedGoto :: X ()
promptedGoto = workspacePrompt myXPConfig goto
promptedShift :: X ()
promptedShift = workspacePrompt myXPConfig $ windows . W.shift
myConfig = do
checkTopicConfig myTopics myTopicConfig
myLogHook <- makeMyLogHook
return $ defaultConfig
{ borderWidth = 1 -- Width of the window border in pixels.
, workspaces = myTopics
, layoutHook = myModifiers myLayouts
, manageHook = myManageHook
, logHook = myLogHook
, handleEventHook = myHandleEventHook
, terminal = myTerminal -- The preferred terminal program.
, normalBorderColor = "#3f3c6d"
, focusedBorderColor = "#4f66ff"
, XMonad.modMask = mod1Mask
, keys = myKeys
, mouseBindings = myMouseBindings
}
main :: IO ()
main = xmonad =<< myConfig
|