Difference between revisions of "Xmonad/Config archive/oxymor00n's xmonad.hs"

From HaskellWiki
Jump to navigation Jump to search
(update to current version)
(update)
Line 1: Line 1:
 
Some of the other scripts I use can be found [http://sec.modprobe.de/hg/?file/ here] (outdated at the moment).
 
Some of the other scripts I use can be found [http://sec.modprobe.de/hg/?file/ here] (outdated at the moment).
 
 
<haskell>
 
<haskell>
  +
-- -*- haskell -*-
 
import XMonad
 
import XMonad
 
import System.Exit
 
import System.Exit
Line 20: Line 20:
 
import XMonad.Layout.Grid
 
import XMonad.Layout.Grid
 
import XMonad.Util.Run (spawnPipe)
 
import XMonad.Util.Run (spawnPipe)
import System.IO (Handle, hPutStrLn)
+
import System.IO (Handle)
  +
import System.IO.UTF8
 
import Monad
 
import Monad
 
import XMonad.Prompt
 
import XMonad.Prompt
Line 26: Line 27:
 
import XMonad.Prompt.Window
 
import XMonad.Prompt.Window
 
import XMonad.Layout.SimpleFloat
 
import XMonad.Layout.SimpleFloat
import XMonad.Layout.Decoration
+
import qualified XMonad.Layout.Decoration as D
 
import XMonad.Layout.Simplest
 
import XMonad.Layout.Simplest
 
import XMonad.Util.WorkspaceCompare
 
import XMonad.Util.WorkspaceCompare
Line 32: Line 33:
 
import XMonad.Layout.WindowArranger
 
import XMonad.Layout.WindowArranger
 
import XMonad.Actions.MouseResize
 
import XMonad.Actions.MouseResize
  +
import XMonad.Util.EZConfig
  +
   
 
myTerminal = "urxvt"
 
myTerminal = "urxvt"
  +
myScreenLock = "/usr/bin/slock"
 
myBorderWidth = 1
 
myBorderWidth = 1
 
myModMask = mod4Mask
 
myModMask = mod4Mask
Line 42: Line 46:
 
myDefaultGaps = [(0,0,0,0),(0,20,0,0)]
 
myDefaultGaps = [(0,0,0,0),(0,20,0,0)]
   
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
+
myKeys = \conf -> mkKeymap conf $
-- launch a terminal
+
[ ("M-S-<Return>", spawn $ XMonad.terminal conf)
[ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
+
, ("C-S-<Esc>", spawn $ myScreenLock)
  +
, ("M-C-<Esc>", spawn $ "xkill")
-- close focused window
 
  +
, ("M-<Space>", sendMessage NextLayout)
, ((modMask .|. shiftMask, xK_c ), kill)
 
  +
, ("M-S-<Space>", setLayout $ XMonad.layoutHook conf)
-- Rotate through the available layout algorithms
 
, ((modMask, xK_space ), sendMessage NextLayout)
+
, ("M-n", refresh)
  +
, ("M-S-c", kill)
-- Reset the layouts on the current workspace to default
 
  +
, ("M-<Tab>", windows W.focusDown)
, ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
 
  +
, ("M-j", windows W.focusDown)
-- Resize viewed windows to the correct size
 
, ((modMask, xK_n ), refresh)
+
, ("M-S-<Tab>", windows W.focusUp)
  +
, ("M-k", windows W.focusUp)
-- Move focus to the next window
 
, ((modMask, xK_Tab ), windows W.focusDown)
+
, ("M-m", windows W.focusMaster)
, ((modMask, xK_j ), windows W.focusDown)
+
, ("M-S-k", windows W.swapDown)
  +
, ("M-S-j", windows W.swapUp)
-- Move focus to the previous window
 
  +
, ("M-h", sendMessage Shrink)
, ((modMask .|. shiftMask, xK_Tab ), windows W.focusUp )
 
, ((modMask, xK_k ), windows W.focusUp )
+
, ("M-l", sendMessage Expand)
  +
, ("M-t", withFocused $ windows . W.sink)
-- Move focus to the master window
 
, ((modMask, xK_m ), windows W.focusMaster )
+
, ("M-,", sendMessage (IncMasterN 1))
  +
, ("M-.", sendMessage (IncMasterN (-1)))
-- Swap the focused window with the next window
 
  +
, ("M-S-q", io (exitWith ExitSuccess))
, ((modMask .|. shiftMask, xK_j ), windows W.swapDown )
 
  +
, ("M-q", restart "xmonad" True)
-- Swap the focused window with the previous window
 
, ((modMask .|. shiftMask, xK_k ), windows W.swapUp )
+
, ("M-p", shellPrompt oxyXPConfig)
  +
, ("M-o", shellPrompt oxyXPConfig)
-- Shrink the master area
 
, ((modMask, xK_h ), sendMessage Shrink)
+
, ("M-S-<Right>", shiftToNext >> nextWS)
  +
, ("M-S-<Left>", shiftToPrev >> prevWS)
-- Expand the master area
 
, ((modMask, xK_l ), sendMessage Expand)
+
, ("M-<Down>", nextScreen)
  +
, ("M-S-<Down>", shiftNextScreen >> nextScreen)
-- Push window back into tiling
 
, ((modMask, xK_t ), withFocused $ windows . W.sink)
+
, ("M-<Left>", moveTo Prev (WSIs (liftM (not .) isVisible)) )
  +
, ("M-<Right>", moveTo Next (WSIs (liftM (not .) isVisible)) )
-- Increment the number of windows in the master area
 
, ((modMask , xK_comma ), sendMessage (IncMasterN 1))
+
, ("M-s", swapNextScreen)
  +
, ("M-<Up>", swapNextScreen)
-- Deincrement the number of windows in the master area
 
, ((modMask , xK_period), sendMessage (IncMasterN (-1)))
+
, ("M-a", sendMessage MirrorShrink)
  +
, ("M-y", sendMessage MirrorExpand)
-- Quit xmonad
 
, ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
+
, ("M-<Return>", dwmpromote)
  +
, ("M-x M-c", kill)
-- Restart xmonad
 
, ((modMask , xK_q ), restart "xmonad" True)]
+
, ("M-x c", kill)
  +
, ("M-x M-x", nextScreen)
++
 
  +
, ("M-x e", spawn "emacsclient -c -s emacs")
-- mod-[1..9], Switch to workspace N
 
  +
]
-- mod-shift-[1..9], Move client to workspace N
 
[((m .|. modMask, k), windows $ f i)
+
++
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
+
[ (m ++ i, windows $ f j)
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
+
| (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf)
  +
, (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
++
 
-- shell prompt
+
]
[ ((modMask , xK_p), shellPrompt oxyXPConfig)
 
, ((modMask , xK_o), shellPrompt oxyXPConfig)
 
-- move window to next workspace and follow
 
, ((modMask .|. shiftMask, xK_Right), shiftToNext >> nextWS)
 
-- move window to previous workspace and follow
 
, ((modMask .|. shiftMask, xK_Left), shiftToPrev >> prevWS)
 
-- switch focus between physical screens...
 
, ((modMask, xK_Down), nextScreen)
 
-- ...and take the window with it
 
, ((modMask .|. shiftMask, xK_Down), shiftNextScreen >> nextScreen)
 
-- previous workspace
 
, ((modMask, xK_Left), moveTo Prev (WSIs (liftM (not .) isVisible)) )
 
, ((modMask .|. controlMask, xK_k), moveTo Prev (WSIs (liftM (not .) isVisible)) )
 
-- next workspace
 
, ((modMask, xK_Right), moveTo Next (WSIs (liftM (not .) isVisible)) )
 
, ((modMask .|. controlMask, xK_j), moveTo Next (WSIs (liftM (not .) isVisible)) )
 
-- swap screens
 
, ((modMask, xK_s), swapNextScreen)
 
, ((modMask, xK_Up), swapNextScreen)
 
-- resize tiled windows vertically
 
, ((modMask, xK_a), sendMessage MirrorShrink)
 
, ((modMask, xK_y), sendMessage MirrorExpand)
 
-- toggle struts
 
, ((modMask .|. shiftMask, xK_b), sendMessage ToggleStruts)
 
, ((modMask , xK_b), modifyGap (\i n -> let x = (XMonad.defaultGaps conf ++ repeat (0,0,0,0)) !! i in if n == x then (0,0,0,0) else x))
 
-- brings the currently focused window to the master area
 
, ((modMask, xK_Return), dwmpromote)
 
, ((modMask .|. controlMask, xK_t), themePrompt oxyXPConfig)
 
, ((modMask .|. controlMask, xK_space), (sendMessage (Toggle "Full")) >> sendMessage (Toggle "Grid"))]
 
++
 
-- custom emacs-style keybindings
 
-- mostly for launching applications
 
[((modMask, xK_x), submap . M.fromList $
 
[ ((0, xK_e), spawn "emacsclient -s emacs -c -d $DISPLAY")
 
, ((0, xK_f), spawn "firefox")
 
, ((0, xK_Return), spawn "urxvt")
 
, ((0, xK_t), spawn "~/bin/tvbrowser")
 
-- mod-x mod-c and mod-x c close a window
 
, ((0, xK_c), kill)
 
, ((modMask, xK_c), kill)
 
-- mod-x mod-x cycles focus between screens
 
, ((modMask, xK_x), nextScreen)
 
-- window bringer emacs-style bindings
 
, ((0, xK_b), windowPromptGoto oxyXPConfig)
 
, ((shiftMask, xK_b) , windowPromptBring oxyXPConfig)
 
])]
 
++
 
-- hm. is this useful?
 
-- anyway, these are basically the same bindings as wind-move in emacs
 
[ ((modMask .|. controlMask, xK_Right), sendMessage $ Go R)
 
, ((modMask .|. controlMask, xK_Left ), sendMessage $ Go L)
 
, ((modMask .|. controlMask, xK_Up ), sendMessage $ Go U)
 
, ((modMask .|. controlMask, xK_Down ), sendMessage $ Go D)]
 
   
 
-- Config for Prompt
 
-- Config for Prompt
Line 188: Line 139:
 
delta = 3/100
 
delta = 3/100
 
-- tabbed layout
 
-- tabbed layout
tabs = decoration shrinkText oxyTheme Tabbed Simplest
+
tabs = D.decoration shrinkText oxyTheme Tabbed Simplest
 
-- floating layout with mouse resize
 
-- floating layout with mouse resize
floating = simpleFloat' shrinkText oxyTheme
+
-- floating = simpleFloat' shrinkText oxyTheme
  +
floating = D.decoration shrinkText oxyTheme D.DefaultDecoration (mouseResize $ windowArrangeAll $ SF 20)
   
   
 
-- Configuration for Tabbed
 
-- Configuration for Tabbed
oxyTheme :: Theme
+
oxyTheme :: D.Theme
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
 
, activeBorderColor = "aquamarine3"
 
, activeBorderColor = "aquamarine3"

Revision as of 13:32, 27 February 2008

Some of the other scripts I use can be found here (outdated at the moment).

-- -*- haskell -*-
import XMonad
import System.Exit
import XMonad.Core
import qualified XMonad.StackSet as W
import qualified Data.Map        as M
import XMonad.Layout.Tabbed
import XMonad.Layout.ResizableTile
import XMonad.Hooks.DynamicLog
import XMonad.Actions.CycleWS
import XMonad.Actions.Submap
import XMonad.Actions.WindowBringer
import XMonad.Hooks.ManageDocks
import XMonad.Actions.DwmPromote
import XMonad.Layout.WindowNavigation
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.Grid
import XMonad.Util.Run (spawnPipe)
import System.IO (Handle)
import System.IO.UTF8
import Monad
import XMonad.Prompt
import XMonad.Prompt.Shell
import XMonad.Prompt.Window
import XMonad.Layout.SimpleFloat
import qualified XMonad.Layout.Decoration as D
import XMonad.Layout.Simplest
import XMonad.Util.WorkspaceCompare
import XMonad.Prompt.Theme
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,20,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>",     moveTo Prev (WSIs (liftM (not .) isVisible)) )
                , ("M-<Right>",    moveTo Next (WSIs (liftM (not .) isVisible)) )
                , ("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 ++ i, windows $ f j)
                    | (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf)
                    , (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
                ]

-- Config for Prompt
oxyXPConfig :: XPConfig
oxyXPConfig = defaultXPConfig { font              = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
                              , bgColor           = "#000"
                              , fgColor           = "Aquamarine2"
                              , 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), (\_ -> moveTo Next (WSIs (liftM (not .) isVisible))))
    , ((controlMask .|. modMask, button4), (\_ -> moveTo Prev (WSIs (liftM (not .) isVisible))))
    ]

myLayout = avoidStruts $ windowNavigation $ 
           toggleLayouts Full tiled
           ||| toggleLayouts Full (Mirror tiled)
           ||| toggleLayouts Grid 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"
                        -- This font can be found in the package ttf-alee 
                        -- on debian-systems
                        -- , fontName = "-*-Bandal-*-*-*-*-12-*-*-*-*-*-*-*"
                        , decoHeight = 16
                        , urgentColor = "#000"
                        , urgentTextColor = "#63b8ff"
                        }

myManageHook = composeAll
    [ className =? "MPlayer"        --> doFloat
    , className =? "Gimp"           --> doFloat
    , resource  =? "desktop_window" --> doIgnore
    , resource  =? "kdesktop"       --> 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
    }