Xmonad/Config archive/webframp's xmonad.hs

From HaskellWiki
< Xmonad‎ | Config archive
Revision as of 00:53, 21 October 2008 by Webframp (talk | contribs) (fixed XPC ommisions)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
-----------------------------------------------------------------------
--
-- Module      :  xmonad.hs
-- Copyright   :  (c) Sean Escriva 2008
-- License     :  BSD3-style (see LICENSE)
--
-- Maintainer  :  sean.escriva@gmail.com
-- Stability   :  unstable
-- Portability :  not portable, 
--
-- customization for the xmonad window manager
-----------------------------------------------------------------------

-- Imports {{{
import XMonad 
-- Hooks
import XMonad.Hooks.DynamicLog hiding (xmobar, xmobarPP, xmobarColor, sjanssenPP, byorgeyPP)
import XMonad.Hooks.UrgencyHook (withUrgencyHook, NoUrgencyHook(..), focusUrgent)
import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, ToggleStruts(..))
-- Prompt
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise
import XMonad.Prompt.Shell (shellPrompt, prompt, safePrompt)
import XMonad.Prompt.Workspace 
import XMonad.Prompt.AppendFile
-- Actions 
import XMonad.Actions.CycleWS --(nextWS, prevWS, shiftToNext, shiftToPrev, nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS)
import XMonad.Actions.WindowGo (title, raise, raiseMaybe, raiseBrowser, raiseEditor, runOrRaise, (=?))
import XMonad.Actions.UpdatePointer
import qualified XMonad.Actions.Search as S
-- Util
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
import XMonad.Util.Scratchpad (scratchpadSpawnAction, scratchpadManageHook)
import XMonad.Util.XSelection (safePromptSelection)
import XMonad.Util.EZConfig hiding (additionalMouseBindings, removeMouseBindings)
-- Layouts 
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.ResizableTile (ResizableTall(..))
import System.IO (hPutStrLn)
import qualified XMonad.StackSet as W
import qualified Data.Map        as M
--}}}

-- Main {{{
main = do
    dzpipe <- spawnPipe statusBarCmd
    xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig 
        { terminal              = mTerm
        , focusFollowsMouse     = False
        , borderWidth           = 1
        , modMask               = mod4Mask -- win key
        , numlockMask           = mod2Mask
        , workspaces            = ["mail","web","code","irc","term","read","game","art","win"]
        , normalBorderColor     = colorNormalBorder
        , focusedBorderColor    = colorFocusedBorder
        , layoutHook            = mLayout 
        , manageHook            = mManageHook
        , logHook               = (dynamicLogWithPP $ mPP dzpipe) >> updatePointer (Relative 0.95 0.95)
        , startupHook           = return () >> checkKeymap defaultConfig lacKeys
        }
       `additionalKeysP` lacKeys
-- }}}

-- Config {{{
-- single options here, more complex settings(by comparison) get separated
-- }}}

-- Theme {{{
colorNormalBorder    = "#1c2636"
colorFocusedBorder   = "#99ff99"
colorNormalBG        = "#1e1e27"
colorNormalFG        = "#cfbfad"
colorFocusFG         = "#33ccff"
colorFocusBG         = "#1C2636"
colorFocusBO         = "#99ffcc"
colorUrgentBG        = "#ff00cc"
colorUrgentFG        = "#00ff99"
--barFont = "snap"
--barXFont = "-artwiz-snap-*-*-*-*-*-*-*-*-*-*-iso8859"
barFont  = "terminus"
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
--}}}
statusBarCmd = "dzen2" ++ 
               " -bg '" ++ colorNormalBG ++ "'" ++
               " -fg '" ++ colorNormalFG ++ "'" ++
               " -sa c" ++
               " -fn '" ++ barXFont ++ "'" ++
               " -ta l -expand r -e ''"
notesFile = "/home/webframp/TODO"
mTerm = "urxvt"

-- Custom Searches
enro40 = S.searchEngine "enro40" "http://dictionare.com/phpdic/enro40.php?field0="
roen40 = S.searchEngine "roen40" "http://dictionare.com/phpdic/roen40.php?field0=" 

-- Pretty printer {{{
-- dynamiclog pretty printer for dzen
mPP h = defaultPP 
        { ppCurrent = wrap ("^fg(" ++ colorFocusFG ++ ")^bg(" ++ colorFocusBG ++ ")^p(2)") "^p(2)^fg()^bg()"
        , ppVisible = wrap ("^fg(" ++ colorNormalFG ++ ")^bg(" ++ colorNormalBG ++ ")^p(2)") "^p(2)^fg()^bg()"
        , ppSep     = " ^fg(grey60)^r(1x8)^fg() "
        , ppLayout  = dzenColor colorNormalFG "" . (\x -> case x of
                                                            "Mirror Tall"       -> "^i(/home/webframp/.xmonad/dzen/mtall.xbm)"
                                                            "ResizableTall"     -> "^i(/home/webframp/.xmonad/dzen/tall.xbm)"
                                                            "Full"              -> "^i(/home/webframp/.xmonad/dzen/full.xbm)"
                                                            _                   -> " " ++ x ++ " "
                                                   )
        , ppUrgent  = dzenColor colorNormalBG colorUrgentBG . wrap "[" "]"
        , ppTitle   = dzenColor colorFocusFG "" . wrap "<" ">" 
        , ppOutput  = hPutStrLn h
        }
--}}}

-- Prompt Config {{{
mXPConfig = 
    XPC { font                = barFont
        , bgColor             = colorFocusBG
        , fgColor             = colorNormalFG
        , bgHLight            = colorNormalBG
        , fgHLight            = colorFocusFG
        , borderColor         = "black"
        , promptBorderWidth   = 0
        , position            = Bottom
        , height              = 14
        , historySize         = 256
        , historyFilter       = id
        , defaultText         = ""
        , autoComplete        = Nothing
        , showCompletionOnTab = False
        }

largeXPConfig = mXPConfig 
                { font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
                , height = 16 
                }
-- }}}

-- Layout Hook{{{
mLayout = avoidStruts $ smartBorders( 
                                     Mirror tiled                     ||| 
                                     ResizableTall 1 (3/100) (1/2) [] ||| 
                                     Full)
    where
      tiled   = Tall nmaster delta ratio
      nmaster = 1
      ratio   = toRational (2/(1+sqrt(5)::Double)) -- golden, thx Octoploid
      delta   = 0.03
--}}} 
-- Window rules aka Manage Hook {{{ 
mManageHook = scratchpadManageHook (W.RationalRect 0.25 0.375 0.5 0.35) <+> 
               (composeAll . concat $
    [ [ className =? c --> doFloat       | c <- floats ] ,
      [ className =? w --> moveTo "web"  | w <- webs] ,
      [ className =? g --> moveTo "game" | g <- games] ,
      [ resource  =? "desktop_window"  --> doIgnore
      , className =? "Epdfview"        --> moveTo "read"
      , title     =? "mutt"            --> moveTo "mail"
      , title     =? "irssi"           --> moveTo "irc"
      , title     =? "Save a Bookmark" --> doFloat
      , title     =? "Add-ons"         --> doFloat
      , className =? "Mitter"          --> moveTo "irc"
      , className =? "Evolution"       --> moveTo "mail"
      , className =? "VirtualBox"      --> moveTo "win"
      , className =? "Tsclient"        --> moveTo "win"
      ] ])
        <+> manageDocks -- make some space
            where floats = ["Mplayer","Gimp","Gimp-2.4","Tsclient","VirtualBox","Gtklp","smc"]
                  webs   = ["Navigator","Gran Paradiso","Firefox", "Midori"]
                  games  = ["roguestar-gl","neverputt","neverball","wesnoth"]
                  moveTo = doF . W.shift

-- }}}
lacKeys =
    [ ("M-p"        , runOrRaisePrompt largeXPConfig { bgHLight = colorFocusFG, fgHLight = colorNormalBG })
    , ("M-g"        , runOrRaise "firefox" (className =? "Gran Paradiso"))
    , ("M-S-g"      , safePromptSelection "firefox")
    , ("M-w"        , workspacePrompt largeXPConfig (windows . W.view))
    , ("M-S-w"      , workspacePrompt largeXPConfig (windows . W.shift))
    , ("M-C-n"      , appendFilePrompt largeXPConfig { bgColor = colorFocusFG, fgColor = colorFocusBG } notesFile)
    , ("M-S-z"      , safeSpawn "mocp" "-G")                -- play/pause
    , ("M-S-<L>"    , safeSpawn "mocp" "-r")                -- rev
    , ("M-S-<R>"    , safeSpawn "mocp" "-f")                -- fwd
    , ("M-<Esc>"    , focusUrgent)
    , ("M-`"        , scratchpadSpawnAction defaultConfig { terminal = mTerm })  -- scratchpad
    , ("M-S-x"      , unsafeSpawn "slock")                  -- screen lock
    , ("M-<Sys_Req>", unsafeSpawn "scrot '%Y-%m-%d-%H%M_$wx$h.png' -e 'mv $f ~/screenshots/'")
    , ("M-i"  , raiseMaybe (runInTerm "-title irssi" "sh -c 'screen -D -R -S irc irssi'") (title =? "irssi"))
    , ("M-m"  , raiseMaybe (runInTerm "-title mutt" "sh -c 'screen -D -R -S mail mutt'") (title =? "mutt"))
    , ("M-S-m", runOrRaise "evolution" (className =? "Evolution"))
    , ("M-e"  , safeSpawn "pcmanfm" "--no-desktop")
    , ("M-b"  , sendMessage ToggleStruts)
    , ("M-s"  , moveTo Next NonEmptyWS)
    , ("M-d"  , moveTo Prev NonEmptyWS)
    , ("M-C-s", nextWS)
    , ("M-C-d", prevWS)
    , ("M-S-s", shiftToNext)
    , ("M-S-d", shiftToPrev)
    , ("M-f"  , nextScreen)
    , ("M-a"  , prevScreen)
    , ("M-S-f", shiftNextScreen)
    , ("M-S-a", shiftPrevScreen)
    , ("M-z"  , toggleWS)
    ] 
    ++ 
    -- Search methods
    -- mapped to mod-c for 'a căuta'
    [("M-c " ++ k,f) | (k,f) <- [ ("g", S.promptSearch largeXPConfig S.google)
                                , ("h", S.promptSearch largeXPConfig S.hoogle)
                                , ("w", S.promptSearch largeXPConfig S.wikipedia)
                                , ("d", S.promptSearch largeXPConfig S.dictionary)
                                , ("t", S.promptSearch largeXPConfig S.thesaurus)
                                , ("a", S.promptSearch largeXPConfig S.amazon)
                                , ("y", S.promptSearch largeXPConfig S.youtube)
                                , ("r", S.promptSearch largeXPConfig enro40)
                                ]]
-- vim:foldmethod=marker sw=4 sts=4 ts=4 tw=0 et ai nowrap