Xmonad/Config archive/oxymor00n's xmonad.hs
From HaskellWiki
< Xmonad | Config archive
Some of the other scripts I use can be found here (outdated at the moment).
-- -*- haskell -*- import Monad (liftM) import XMonad import XMonad.Core import System.Exit import qualified XMonad.StackSet as W import qualified Data.Map as M import qualified XMonad.Layout.Decoration as D import XMonad.Layout.Tabbed import XMonad.Layout.ResizableTile import XMonad.Hooks.DynamicLog import XMonad.Actions.CycleWS import XMonad.Hooks.ManageDocks import XMonad.Actions.DwmPromote import XMonad.Hooks.UrgencyHook import XMonad.Util.Run (spawnPipe) import System.IO (Handle) import System.IO.UTF8 import XMonad.Prompt import XMonad.Prompt.Shell import XMonad.Prompt.Window import XMonad.Layout.SimpleFloat import XMonad.Layout.Simplest import XMonad.Util.WorkspaceCompare import XMonad.Layout.WindowArranger import XMonad.Actions.MouseResize import XMonad.Util.EZConfig myTerminal = "urxvt" myScreenLock = "/usr/bin/slock" myBorderWidth = 1 myModMask = mod4Mask myNumlockMask = mod2Mask myWorkspaces = ["1:web", "2:emacs" ,"3:gnus", "4:music", "5:shells"] ++ map show [6 .. 9 :: Int] myNormalBorderColor = "#111" myFocusedBorderColor = "aquamarine3" myDefaultGaps = [(0,0,0,0),(0,0,0,0)] myKeys = \conf -> mkKeymap conf $ [ ("M-S-<Return>", spawn $ XMonad.terminal conf) , ("C-S-<Esc>", spawn $ myScreenLock) , ("M-C-<Esc>", spawn $ "xkill") , ("M-<Space>", sendMessage NextLayout) , ("M-S-<Space>", setLayout $ XMonad.layoutHook conf) , ("M-n", refresh) , ("M-S-c", kill) , ("M-<Tab>", windows W.focusDown) , ("M-j", windows W.focusDown) , ("M-S-<Tab>", windows W.focusUp) , ("M-k", windows W.focusUp) , ("M-m", windows W.focusMaster) , ("M-S-k", windows W.swapDown) , ("M-S-j", windows W.swapUp) , ("M-h", sendMessage Shrink) , ("M-l", sendMessage Expand) , ("M-t", withFocused $ windows . W.sink) , ("M-,", sendMessage (IncMasterN 1)) , ("M-.", sendMessage (IncMasterN (-1))) , ("M-S-q", io (exitWith ExitSuccess)) , ("M-q", restart "xmonad" True) , ("M-p", shellPrompt oxyXPConfig) , ("M-o", shellPrompt oxyXPConfig) , ("M-S-<Right>", shiftToNext >> nextWS) , ("M-S-<Left>", shiftToPrev >> prevWS) , ("M-<Down>", nextScreen) , ("M-S-<Down>", shiftNextScreen >> nextScreen) , ("M-<Left>", prevNonEmptyWS ) , ("M-C-k", prevNonEmptyWS ) , ("M-<Right>", nextNonEmptyWS ) , ("M-C-j", nextNonEmptyWS ) , ("M-s", swapNextScreen) , ("M-<Up>", swapNextScreen) , ("M-a", sendMessage MirrorShrink) , ("M-y", sendMessage MirrorExpand) , ("M-<Return>", dwmpromote) , ("M-x M-c", kill) , ("M-x c", kill) , ("M-x M-x", nextScreen) , ("M-x e", spawn "emacsclient -c -s emacs") , ("M-x s", spawn "swiftfox") ] ++ [ (m ++ i, windows $ f j) | (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf) , (m, f) <- [("M-", W.view), ("M-S-", W.shift)] ] where nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible)) prevNonEmptyWS = moveTo Prev (WSIs (liftM (not .) isVisible)) -- (thanks to byorgey for that) -- | A predicate on workspaces that returns whether or not the workspace -- is currently visible. Useful for cycling through workspaces in a -- Xinerama context. For example, to cycle through all non-visible -- workspaces, you could add to your keybindings -- -- > , ((modMask x, xK_Left), moveTo Prev (WSIs (liftM not isVisible)) ) -- isVisible :: X (WindowSpace -> Bool) isVisible = do vs <- gets (map (W.tag . W.workspace) . W.visible . windowset) return (\w -> (W.tag w) `elem` vs) -- Config for Prompt oxyXPConfig :: XPConfig oxyXPConfig = defaultXPConfig { font = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*" , bgColor = "#000" , fgColor = "LightSkyBlue" , fgHLight = "#000000" , bgHLight = "Aquamarine2" , borderColor = "aquamarine2" , promptBorderWidth = 1 , position = Top , height = 18 -- , historySize = 256 , defaultText = [] } myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $ -- mod-button1, Set the window to floating mode and move by dragging [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w)) -- mod-button2, Raise the window to the top of the stack , ((modMask, button2), (\w -> focus w >> windows W.swapMaster)) -- mod-button3, Set the window to floating mode and resize by dragging , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w)) -- you may also bind events to the mouse scroll wheel (button4 and button5) -- cycle focus , ((modMask, button4), (\_ -> windows W.focusUp)) , ((modMask, button5), (\_ -> windows W.focusDown)) -- cycle through workspaces , ((controlMask .|. modMask, button5), nextNonEmptyWS) , ((controlMask .|. modMask, button4), prevNonEmptyWS) ] where nextNonEmptyWS = \_ -> moveTo Next (WSIs (liftM (not .) isVisible)) prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible)) myLayout = avoidStruts $ tiled ||| Mirror tiled ||| tabs ||| floating where -- default tiling algorithm partitions the screen into two panes tiled = ResizableTall nmaster delta ratio [] -- The default number of windows in the master pane nmaster = 1 -- Default proportion of screen occupied by master pane ratio = 3/5 -- Percent of screen to increment by when resizing panes delta = 3/100 -- tabbed layout tabs = D.decoration shrinkText oxyTheme Tabbed Simplest -- floating layout with mouse resize -- floating = simpleFloat' shrinkText oxyTheme floating = D.decoration shrinkText oxyTheme D.DefaultDecoration (mouseResize $ windowArrangeAll $ SF 20) -- Configuration for Tabbed oxyTheme :: D.Theme oxyTheme = defaultTheme { inactiveBorderColor = "#000" , activeBorderColor = "aquamarine3" , activeColor = "aquamarine3" , inactiveColor = "DarkSlateGray4" , inactiveTextColor = "#222" , activeTextColor = "#222" , fontName = "xft:Corbel-10" , decoHeight = 16 , urgentColor = "#000" , urgentTextColor = "#63b8ff" } myManageHook = composeAll [ resource =? "desktop_window" --> doIgnore ] <+> manageDocks -- Status bars and logging myLogHook h = dynamicLogWithPP $ oxyPP h oxyPP :: Handle -> PP oxyPP h = defaultPP { ppCurrent = wrap "<fc=black,aquamarine3> " " </fc>" , ppSep = "" , ppWsSep = "" , ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>" , ppLayout = \x -> "<fc=aquamarine2,black> :: " ++ x ++ " </fc>" , ppTitle = \x -> case length x of 0 -> "" _ -> "<fc=DarkSlateGray3,black>[ " ++ shorten 40 x ++ " ] </fc>" -- if a workspace has a tag, show it, even if it has no windows , ppHiddenNoWindows = \x -> case length x of 1 -> "" _ -> wrap "<fc=#aaa,black> " " </fc>" x , ppHidden = wrap "<fc=#aaa,black> " " </fc>" --, ppUrgent = wrap "^bg(#ffb90f)^fg(#d02090)" "" , ppOutput = hPutStrLn h } myFocusFollowsMouse :: Bool myFocusFollowsMouse = True ------------------------------------------------------------------------ -- Now run xmonad with all the defaults we set up. -- Run xmonad with the settings you specify. No need to modify this. -- main = do pipe <- spawnPipe "xmobar" xmonad $ withUrgencyHook NoUrgencyHook $ defaults pipe defaults pipe = defaultConfig { -- simple stuff terminal = myTerminal, focusFollowsMouse = myFocusFollowsMouse, borderWidth = myBorderWidth, modMask = myModMask, numlockMask = myNumlockMask, workspaces = myWorkspaces, normalBorderColor = myNormalBorderColor, focusedBorderColor = myFocusedBorderColor, defaultGaps = myDefaultGaps, -- key bindings keys = myKeys, mouseBindings = myMouseBindings, -- hooks, layouts layoutHook = myLayout, manageHook = myManageHook, logHook = myLogHook pipe }
