Personal tools

Xmonad/Config archive/oxymor00n's xmonad.hs

From HaskellWiki

< Xmonad | Config archive(Difference between revisions)
Jump to: navigation, search
(update)
(sync)
Line 8: Line 8:
 
import qualified XMonad.StackSet as W
 
import qualified XMonad.StackSet as W
 
import qualified Data.Map as M
 
import qualified Data.Map as M
import qualified XMonad.Layout.Decoration as D
 
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.ResizableTile
 
import XMonad.Layout.ResizableTile
import XMonad.Hooks.DynamicLog
+
import XMonad.Layout.Simplest
  +
import XMonad.Layout.Grid
  +
import XMonad.Layout.Magnifier
  +
import XMonad.Hooks.DynamicLog hiding (shorten)
 
import XMonad.Actions.CycleWS
 
import XMonad.Actions.CycleWS
 
import XMonad.Hooks.ManageDocks
 
import XMonad.Hooks.ManageDocks
Line 22: Line 21:
 
import XMonad.Prompt.Shell
 
import XMonad.Prompt.Shell
 
import XMonad.Prompt.Window
 
import XMonad.Prompt.Window
import XMonad.Layout.SimpleFloat
 
import XMonad.Layout.Simplest
 
 
import XMonad.Util.WorkspaceCompare
 
import XMonad.Util.WorkspaceCompare
import XMonad.Layout.WindowArranger
 
import XMonad.Actions.MouseResize
 
 
import XMonad.Util.EZConfig
 
import XMonad.Util.EZConfig
+
import XMonad.Actions.Warp
  +
import Data.Ratio
   
 
myTerminal = "urxvt"
 
myTerminal = "urxvt"
myScreenLock = "/usr/bin/slock"
+
myScreenLock = "/usr/bin/gnome-screensaver-command -l"
 
myBorderWidth = 1
 
myBorderWidth = 1
 
myModMask = mod4Mask
 
myModMask = mod4Mask
 
myNumlockMask = mod2Mask
 
myNumlockMask = mod2Mask
myWorkspaces = ["1:web", "2:emacs" ,"3:gnus", "4:music", "5:shells"] ++ map show [6 .. 9 :: Int]
+
myWorkspaces = ["α", "β" ,"γ", "δ", "ε", "ζ", "η", "θ", "ι"]
 
myNormalBorderColor = "#111"
 
myNormalBorderColor = "#111"
 
myFocusedBorderColor = "aquamarine3"
 
myFocusedBorderColor = "aquamarine3"
Line 55: Line 50:
 
, ("M-S-k", windows W.swapDown)
 
, ("M-S-k", windows W.swapDown)
 
, ("M-S-j", windows W.swapUp)
 
, ("M-S-j", windows W.swapUp)
  +
, ("M-b", sendMessage ToggleStruts)
 
, ("M-h", sendMessage Shrink)
 
, ("M-h", sendMessage Shrink)
 
, ("M-l", sendMessage Expand)
 
, ("M-l", sendMessage Expand)
Line 80: Line 76:
 
, ("M-x c", kill)
 
, ("M-x c", kill)
 
, ("M-x M-x", nextScreen)
 
, ("M-x M-x", nextScreen)
  +
, ("M-u M-x M-x", swapNextScreen)
 
, ("M-x e", spawn "emacsclient -c -s emacs")
 
, ("M-x e", spawn "emacsclient -c -s emacs")
 
, ("M-x s", spawn "swiftfox")
 
, ("M-x s", spawn "swiftfox")
  +
, ("M-x t", spawn "tvbrowser")
  +
, ("M-x d", spawn "deluge")
  +
, ("M-x <Return>", spawn $ XMonad.terminal conf)
  +
, ("M-w", sendMessage MagnifyMore)
  +
, ("M-e", sendMessage MagnifyLess)
  +
, ("M-<", warpToWindow (1%10) (1%10)) -- Move pointer to currently focused window
 
]
 
]
 
++
 
++
Line 91: Line 94:
 
nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
 
nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
 
prevNonEmptyWS = moveTo Prev (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 :: X (WindowSpace -> Bool)
Line 108: Line 102:
 
-- Config for Prompt
 
-- Config for Prompt
 
oxyXPConfig :: XPConfig
 
oxyXPConfig :: XPConfig
oxyXPConfig = defaultXPConfig { font = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
+
oxyXPConfig = defaultXPConfig { font = "xft:Consolas-12"
, bgColor = "#000"
+
, bgColor = "Aquamarine3"
, fgColor = "LightSkyBlue"
+
, fgColor = "black"
, fgHLight = "#000000"
+
, fgHLight = "black"
, bgHLight = "Aquamarine2"
+
, bgHLight = "darkslategray4"
, borderColor = "aquamarine2"
+
, borderColor = "black"
 
, promptBorderWidth = 1
 
, promptBorderWidth = 1
 
, position = Top
 
, position = Top
, height = 18
+
, height = 24
-- , historySize = 256
 
 
, defaultText = []
 
, defaultText = []
 
}
 
}
Line 142: Line 136:
 
||| Mirror tiled
 
||| Mirror tiled
 
||| tabs
 
||| tabs
||| floating
+
||| magnify Grid
 
where
 
where
 
-- default tiling algorithm partitions the screen into two panes
 
-- default tiling algorithm partitions the screen into two panes
Line 149: Line 143:
 
nmaster = 1
 
nmaster = 1
 
-- Default proportion of screen occupied by master pane
 
-- Default proportion of screen occupied by master pane
ratio = 3/5
+
ratio = 8 % 13
 
-- Percent of screen to increment by when resizing panes
 
-- Percent of screen to increment by when resizing panes
delta = 3/100
+
delta = 3 % 100
 
-- tabbed layout
 
-- tabbed layout
tabs = D.decoration shrinkText oxyTheme Tabbed Simplest
+
tabs = tabbed shrinkText oxyTheme
-- floating layout with mouse resize
+
-- magnification in grid
-- floating = simpleFloat' shrinkText oxyTheme
+
magnify = magnifiercz (13%10)
floating = D.decoration shrinkText oxyTheme D.DefaultDecoration (mouseResize $ windowArrangeAll $ SF 20)
 
 
   
 
-- Configuration for Tabbed
 
-- Configuration for Tabbed
oxyTheme :: D.Theme
+
oxyTheme :: Theme
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
 
, activeBorderColor = "aquamarine3"
 
, activeBorderColor = "aquamarine3"
Line 165: Line 159:
 
, inactiveTextColor = "#222"
 
, inactiveTextColor = "#222"
 
, activeTextColor = "#222"
 
, activeTextColor = "#222"
, fontName = "xft:Corbel-10"
+
, fontName = "xft:Candara-11"
, decoHeight = 16
+
, decoHeight = 18
 
, urgentColor = "#000"
 
, urgentColor = "#000"
 
, urgentTextColor = "#63b8ff"
 
, urgentTextColor = "#63b8ff"
Line 172: Line 166:
   
 
myManageHook = composeAll
 
myManageHook = composeAll
[ resource =? "desktop_window" --> doIgnore ]
+
[ resource =? "desktop_window" --> doIgnore
  +
, className =? "ClockScreenlet.py" --> doIgnore
  +
, className =? "Deluge" --> doF (W.shift "ι")
  +
, title =? "roottail" --> doIgnore ]
 
<+> manageDocks
 
<+> manageDocks
   
 
-- Status bars and logging
 
-- Status bars and logging
myLogHook h = dynamicLogWithPP $ oxyPP h
+
myLogHook h = dynamicLogWithPP $ oxyPP h
   
 
oxyPP :: Handle -> PP
 
oxyPP :: Handle -> PP
Line 183: Line 177:
 
, ppWsSep = ""
 
, ppWsSep = ""
 
, ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>"
 
, ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>"
, ppLayout = \x -> "<fc=aquamarine2,black> :: " ++ x ++ " </fc>"
+
, ppLayout = \x -> "<fc=aquamarine2,black> "
  +
++ case x of
  +
"Mirror ResizableTall" -> "Tiled-"
  +
"ResizableTall" -> "Tiled|"
  +
"Tabbed Bottom Simplest" -> "Tabbed"
  +
"Tabbed Simplest" -> "Tabbed"
  +
_ -> x
  +
++ "</fc> "
 
, ppTitle = \x -> case length x of
 
, ppTitle = \x -> case length x of
 
0 -> ""
 
0 -> ""
_ -> "<fc=DarkSlateGray3,black>[ " ++ shorten 40 x ++ " ] </fc>"
+
_ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>"
-- if a workspace has a tag, show it, even if it has no windows
+
, ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>"
, ppHiddenNoWindows = \x -> case length x of
 
1 -> ""
 
_ -> wrap "<fc=#aaa,black> " " </fc>" x
 
 
, ppHidden = wrap "<fc=#aaa,black> " " </fc>"
 
, ppHidden = wrap "<fc=#aaa,black> " " </fc>"
--, ppUrgent = wrap "^bg(#ffb90f)^fg(#d02090)" ""
+
, ppOutput = System.IO.UTF8.hPutStrLn h
, ppOutput = hPutStrLn h
 
 
}
 
}
  +
  +
shorten :: Int -> String -> String
  +
shorten n xs | length xs < n = xs
  +
| otherwise = (take (n - length end) xs) ++ end
  +
where
  +
end = "…"
   
 
myFocusFollowsMouse :: Bool
 
myFocusFollowsMouse :: Bool

Revision as of 22:49, 20 March 2008

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 XMonad.Layout.Tabbed
import XMonad.Layout.ResizableTile
import XMonad.Layout.Simplest
import XMonad.Layout.Grid
import XMonad.Layout.Magnifier
import XMonad.Hooks.DynamicLog hiding (shorten)
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.Util.WorkspaceCompare
import XMonad.Util.EZConfig
import XMonad.Actions.Warp
import Data.Ratio
 
myTerminal      = "urxvt"
myScreenLock    = "/usr/bin/gnome-screensaver-command -l"
myBorderWidth   = 1
myModMask       = mod4Mask
myNumlockMask   = mod2Mask
myWorkspaces    = ["α", "β" ,"γ", "δ", "ε", "ζ", "η", "θ", "ι"] 
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-b",          sendMessage ToggleStruts)
                , ("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-u M-x M-x",  swapNextScreen)
                , ("M-x e",        spawn "emacsclient -c -s emacs")
                , ("M-x s",        spawn "swiftfox")
                , ("M-x t",        spawn "tvbrowser")
                , ("M-x d",        spawn "deluge")
                , ("M-x <Return>",  spawn $ XMonad.terminal conf)
                , ("M-w",          sendMessage MagnifyMore)
                , ("M-e",          sendMessage MagnifyLess)
                , ("M-<",          warpToWindow (1%10) (1%10)) -- Move pointer to currently focused window
                ]
                ++
                [ (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))
 
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              = "xft:Consolas-12"
                              , bgColor           = "Aquamarine3"
                              , fgColor           = "black"
                              , fgHLight          = "black"
                              , bgHLight          = "darkslategray4"
                              , borderColor       = "black"
                              , promptBorderWidth = 1
                              , position          = Top
                              , height            = 24
                              , 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
           ||| magnify Grid
  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   = 8 % 13
     -- Percent of screen to increment by when resizing panes
     delta   = 3 % 100
     -- tabbed layout
     tabs = tabbed shrinkText oxyTheme
     -- magnification in grid
     magnify = magnifiercz (13%10)
 
-- Configuration for Tabbed
oxyTheme :: Theme
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
                        , activeBorderColor = "aquamarine3" 
                        , activeColor = "aquamarine3"
                        , inactiveColor = "DarkSlateGray4"
                        , inactiveTextColor = "#222"
                        , activeTextColor = "#222"
                        , fontName = "xft:Candara-11"
                        , decoHeight = 18
                        , urgentColor = "#000"
                        , urgentTextColor = "#63b8ff"
                        }
 
myManageHook = composeAll
    [ resource  =? "desktop_window"     --> doIgnore
    , className  =? "ClockScreenlet.py" --> doIgnore
    , className =? "Deluge"             --> doF (W.shift "ι")
    , title =? "roottail"               --> 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> "
                                  ++ case x of
                                       "Mirror ResizableTall"   -> "Tiled-"
                                       "ResizableTall"          -> "Tiled|"
                                       "Tabbed Bottom Simplest" -> "Tabbed"
                                       "Tabbed Simplest"        -> "Tabbed"
                                       _                        -> x
                                  ++ "</fc> "
                     , ppTitle = \x -> case length x of
                                         0 -> ""
                                         _ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>"
                     , ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>"
                     , ppHidden = wrap "<fc=#aaa,black> " " </fc>"
                     , ppOutput = System.IO.UTF8.hPutStrLn h
                     }
 
shorten :: Int -> String -> String
shorten n xs | length xs < n = xs
             | otherwise     = (take (n - length end) xs) ++ end
 where
    end = "…"
 
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
    }