Difference between revisions of "Xmonad/Config archive/sereven-xmonad.hs"

From HaskellWiki
Jump to navigation Jump to search
(update config to latest 0.9.2 - 0.10 version)
m (mention how to get mod4 on caps and logo keys)
Line 74: Line 74:
   
 
-- keyboard and mouse {{{
 
-- keyboard and mouse {{{
  +
-- uses mod4 on winkey and on capslock via ` Option "XkbOptions" "caps:super" '
   
 
withNavKeys (u,l,d,r) = withWindowNavigationKeys
 
withNavKeys (u,l,d,r) = withWindowNavigationKeys
Line 186: Line 187:
 
Shrink -> TallAlt i (d-i)
 
Shrink -> TallAlt i (d-i)
   
  +
layouts =
layouts = modifiers . onWorkspaces ["3", "4"] (workspaceDir cwd four) . onWorkspace "5" gimp
 
. onWorkspaces ["6", "9"] many $ four
+
modifiers . onWorkspaces ["3", "4"] (workspaceDir cwd four) . onWorkspace "5" gimp
  +
. onWorkspaces ["6", "9"] many $ four
 
where
 
where
 
modifiers =
 
modifiers =

Revision as of 14:04, 19 March 2011

{-# OPTIONS_GHC -Wall -fno-warn-missing-signatures #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-} -- for TallAlt

-- sereven's xmonad.hs (0.9.2 - 0.10) $ 2011-03-15

-- imports {{{
import XMonad hiding (keys)
import qualified XMonad.StackSet as W

-- standard libraries
import Control.Applicative ((<$>))
import Control.Monad (liftM2)
import Data.List (isInfixOf, nub)
import Data.Maybe (fromMaybe)
import System.Exit

-- xmonad-contrib
import XMonad.Actions.CycleWS (swapNextScreen, toggleOrDoSkip, nextWS, prevWS)
import XMonad.Actions.FlexibleManipulate as Flex
import XMonad.Actions.OnScreen (onlyOnScreen)
import XMonad.Actions.Search
import XMonad.Actions.WindowNavigation
import XMonad.Config.Gnome
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.SetWMName
import XMonad.Layout.IM
import XMonad.Layout.LayoutHints
import XMonad.Layout.LayoutScreens
import XMonad.Layout.LimitWindows
import XMonad.Layout.NoBorders
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Reflect (reflectHoriz)
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.WorkspaceDir
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise
import XMonad.Util.EZConfig
import XMonad.Util.Run (hPutStrLn, spawnPipe)
import XMonad.Util.Scratchpad
import XMonad.Util.WorkspaceCompare
-- }}}

wsIds = map return "123456789" ++ ["NSP"]

infixr 0 ~> -- <http://mauke.ath.cx/stuff/xmonad/xmonad.hs>
(~>) :: a -> b -> (a, b)
(~>) = (,)

-- main {{{
main = do
    dz <- spawnPipe themedDzen
    conf <- withNavKeys (xK_k, xK_h, xK_j, xK_l) $
        gnomeConfig
            { terminal           = "urxvt"
            , modMask            = mod4Mask
            , normalBorderColor  = bgColor promptConfig
            , focusedBorderColor = fgColor promptConfig
            , workspaces         = wsIds
            , logHook            = dynamicLogWithPP dzPP { ppOutput = hPutStrLn dz }
            , manageHook         = manageHooks
            , layoutHook         = layouts
            }
        `additionalKeysP` keys `additionalMouseBindings` buttons
    xmonad conf { startupHook = do
                    startupHook gnomeConfig
                    checkKeymap conf keys
                    setWMName "LG3D"
                    windows $ onlyOnScreen 1 "8"
                    }
-- }}}

-- keyboard and mouse {{{
-- uses mod4 on winkey and on capslock via ` Option "XkbOptions" "caps:super" '

withNavKeys (u,l,d,r) = withWindowNavigationKeys
    [ (mod4Mask             , u) ~> WNGo   U
    , (mod4Mask             , l) ~> WNGo   L
    , (mod4Mask             , d) ~> WNGo   D
    , (mod4Mask             , r) ~> WNGo   R
    , (mod4Mask .|. mod1Mask, u) ~> WNSwap U
    , (mod4Mask .|. mod1Mask, l) ~> WNSwap L
    , (mod4Mask .|. mod1Mask, d) ~> WNSwap D
    , (mod4Mask .|. mod1Mask, r) ~> WNSwap R ]

buttons =
    [ (mod4Mask             , button3) ~> Flex.mouseWindow Flex.discrete
    , (mod4Mask             , button4) ~> const $ windows W.swapDown
    , (mod4Mask             , button5) ~> const $ windows W.swapUp
    , (mod1Mask .|. mod4Mask, button4) ~> const nextWS
    , (mod1Mask .|. mod4Mask, button5) ~> const prevWS ]

keys =
    [ "M-M1-S-q"      ~> io (exitWith ExitSuccess)
    , "M-S-q"         ~> spawn "xmessage -- [ Shift+Mod1+Mod4+Q to exit; no gnome-session mgr] --"
    , "M-<Space>"     ~> sendMessage ToggleLayout  -- toggle fullscreen
    , "M-c"           ~> sendMessage NextLayout
    , "M-M1-."        ~> sendMessage Shrink
    , "M-M1-,"        ~> sendMessage Expand
    , "M-<F9>"        ~> layoutScreens 3 $ fixedLayout
                            [Rectangle 0 0 1600 1200, Rectangle 1600 0   1600 480
                                                    , Rectangle 1600 480 1280 720]
    , "M-<F8>"        ~> rescreen
    ]
    -- workspaces and screens -- 1 2 3 \
                              --  q w e \
                              --   a s d \ f g
    ++                        --          \ v b
    [ mask ++ [key] ~> action i
         | (key, i) <- zip "123qweasd=" wsIds
         , (mask, action) <- [ ("M-", toggled W.greedyView)
                             , ("M-M1-", toggled followShift) ] ]
    ++
    [ mask ++ [key] ~> screenWorkspace s >>= flip whenJust (windows . action)
         | (key, s) <- zip "fgb" [0..]
         , (mask, action) <- [ ("M-", W.view)
                             , ("M-M1-", W.shift) ] ]
    ++
    [ "M-v"         ~> swapNextScreen
    -- scratch term, prompts and searches
    , "M-<Tab>" ~> scratchpadSpawnActionTerminal "urxvt -pe tabbed"
    , "M-r"     ~> runOrRaisePrompt promptConfig
    , "M-M1-r"  ~> changeDir promptConfig ]
    ++
    [ "M-/ "    ++ ks ~> promptSearch promptConfig s | (ks,s) <- searches ]
    ++
    [ "M-M1-/ " ++ ks ~> selectSearch s | (ks,s) <- searches ]
  where
    searches = [ ("f"  , fgo)
               , ("r"  , rseek)
               , ("s"  , scroogle)
               , ("x"  , xm_gmane)
               , ("g"  , google)
               , ("i"  , images)
               , ("w"  , wikipedia)
               ]
    fgo      = searchEngineF "gentoo forums" $
                  wrap "http://www.google.com/search?q="
                       "+site%3Aforums.gentoo.org+-inurl%3Asearch.php" . escape
    rseek    = searchEngineF "RSeek" $
                  wrap "http://www.rseek.org/?cx=010923144343702598753%3Aboaz1reyxd4&newwindow=1&q="
                       "&sa=Search&cof=FORID%3A11&siteurl=rseek.org%252F#1666" . escape
    scroogle = searchEngine  "scroogle"
                  "https://ssl.scroogle.org/cgi-bin/nbbwssl.cgi?Gw="
    xm_gmane = searchEngine  "xmonad ml"
                  "http://search.gmane.org/?group=gmane.comp.lang.haskell.xmonad&query="

    toggled = toggleOrDoSkip ["NSP"]
    followShift = liftM2 (.) W.view W.shift
-- }}}

-- manage hook {{{
manageHooks = composeAll
    [ ("OpenOffice" `isPrefixOf`) <$> className --> doShift "3"
    , ("Gimp" `isPrefixOf`)       <$> className --> doShift "5"
    , className =? "Acroread" --> doShift "2"
    , className =? "Qjackctl" --> doFloat
    , className =? "feh"      --> doFloat
    , className =? ""         --> doFloat -- low budget gtk windows
    , className =? "XFontSel" --> doF W.shiftMaster <+> doCenterFloat
    , className =? "Xmessage" --> doF W.shiftMaster <+> doCenterFloat
    , isDialog --> doF W.shiftMaster <+> doFloat
    , scratchpadManageHook (W.RationalRect 0.43 0.575 0.53 0.34)
    , transience'
    , manageDocks
    ]
-- }}}

-- layouts {{{

-- TallAlt from <http://www.haskell.org/pipermail/xmonad/2009-July/008270.html>
data TallAlt a = TallAlt
    { tallAltIncrement :: !Rational
    , tallAltRatio :: !Rational
    } deriving (Read, Show)

instance LayoutClass TallAlt a where
    doLayout (TallAlt i d) r st =
     fmap (\(x,_) -> (x,Nothing)) $ doLayout (Tall nmaster i d) r st
        where nmaster | stlen > 3 = 2
                      | otherwise = 1
              stlen = length $ W.integrate st
    pureMessage (TallAlt i d) m = (`fmap` fromMessage m) $ \x -> case x of
        Expand -> TallAlt i (d+i)
        Shrink -> TallAlt i (d-i)

layouts =
    modifiers . onWorkspaces ["3", "4"] (workspaceDir cwd four) . onWorkspace "5" gimp
              . onWorkspaces ["6", "9"] many $ four
  where
    modifiers =
        smartBorders . toggleLayouts (noBorders Full) . layoutHintsToCenter . avoidStruts
    four = limitWindows 4 . Mirror $ TallAlt 0.03 (31/44) ||| Full
    gimp = reflectHoriz $ withIM 0.145 (Role "gimp-toolbox") four
    many = Mirror $ TallAlt 0.03 (31/44) ||| Full ||| Tall 1 0.03 (13/22)
    cwd  = "~/cet_spr/phy/labs"
-- }}}

-- prompt and dzen {{{

promptConfig = defaultXPConfig
    { font = "xft:Denmark:Thin:size=11"
    , bgColor  = "gray5"
    , fgColor  = "wheat3"
    , fgHLight = "DodgerBlue3"
    , bgHLight = "black"
    , promptBorderWidth = 0
    , height   = 24
    , historyFilter = nub
    , showCompletionOnTab = True
    }

themedDzen = "dzen2 -xs 1 -x 25 -ta l -e 'onstart=lower'"
      ++ " -bg " ++ "'" ++ bgColor promptConfig ++ "'"
      ++ " -fg " ++ "'" ++ fgColor promptConfig ++ "'"
      ++ " -fn " ++ "'" ++ drop 4 (font promptConfig) ++ "'" -- dzen doesn't use xft prefix
      ++ " -h "  ++ show (height promptConfig + 2)

dzPP  = defaultPP
    { ppCurrent         = \i -> wsColorCurrent i (wrap "|" "|" (wsIcon i)) ++ "^p(6;)"
    , ppVisible         = \i -> wsColorVisible i (wrap "|" "|" (wsIcon i)) ++ "^p(6;)"
    , ppHidden          = fg "wheat4" . wsIcon
    , ppHiddenNoWindows = fg "gray28" . wsIcon
    , ppWsSep           = "^p(6;)"
    , ppTitle           = take 108 . dzenEscape
    , ppSep             = ""
    , ppSort            = getSortByXineramaRule -- ensure wsIds alphabetical
    , ppOrder           = \(ws:_:t:_) ->  ["^p(18;)", ws, "^p(30;).: ", t, " :."]
    }
  where
    fg c = dzenColor c ""
    wsIcon = wrap "^i(" ")" . ("/home/gvg/.config/dzen/icons/" ++) . wrap "ws-" ".xbm"
    wsColorCurrent i =
        fg . fromMaybe "wheat2" . lookup i . zip wsIds $
                concatMap (replicate 3) ["DarkOrchid1", "DodgerBlue1", "OliveDrab2"]
    wsColorVisible i =
        fg . fromMaybe "wheat4" . lookup i . zip wsIds $
                concatMap (replicate 3) ["DarkOrchid3", "DodgerBlue4", "OliveDrab4"]
-- }}}

-- vim:foldmethod=marker