Xmonad/Config archive/webframp's xmonad.hs

From HaskellWiki
< Xmonad‎ | Config archive
Revision as of 00:17, 8 October 2008 by Webframp (talk | contribs) (initial page creation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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
-- Last Modified: 2008 Oct 07 Tue - 16:44:26
-----------------------------------------------------------------------

-- Imports {{{
import XMonad
import XMonad 
-- Hooks
import XMonad.Hooks.DynamicLog (dynamicLogWithPP, PP(..), defaultPP, wrap, pad, shorten, dzenColor, dzenEscape)
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
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 (additionalKeys, additionalKeysP, removeKeys, removeKeysP, mkKeymap, checkKeymap)
-- Layouts 
import XMonad.Layout.Magnifier
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.ResizableTile
--import XMonad.Layout.PerWorkspace
import System.IO
import System.Exit
import Data.Char
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
        , defaultText       = ""
        , autoComplete      = Nothing
        }

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