Xmonad/Config archive/oxymor00n's xmonad.hs
From HaskellWiki
< Xmonad | Config archive(Difference between revisions)
(update) |
m |
||
| (2 intermediate revisions not shown.) | |||
| Line 2: | Line 2: | ||
<haskell> | <haskell> | ||
-- -*- haskell -*- | -- -*- haskell -*- | ||
| - | import Monad (liftM) | + | import Control.Monad (liftM) |
import XMonad | import XMonad | ||
import XMonad.Core | import XMonad.Core | ||
| 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 XMonad.Layout.Tabbed | import XMonad.Layout.Tabbed | ||
import XMonad.Layout.ResizableTile | import XMonad.Layout.ResizableTile | ||
| - | import XMonad.Hooks.DynamicLog | + | import XMonad.Layout.Grid |
| + | import XMonad.Layout.Magnifier | ||
| + | import XMonad.Layout.TabBarDecoration | ||
| + | import XMonad.Hooks.DynamicLog hiding (shorten) | ||
import XMonad.Actions.CycleWS | import XMonad.Actions.CycleWS | ||
import XMonad.Hooks.ManageDocks | import XMonad.Hooks.ManageDocks | ||
| + | import XMonad.Hooks.EwmhDesktops | ||
import XMonad.Actions.DwmPromote | import XMonad.Actions.DwmPromote | ||
| + | import XMonad.Actions.UpdatePointer | ||
import XMonad.Hooks.UrgencyHook | import XMonad.Hooks.UrgencyHook | ||
import XMonad.Util.Run (spawnPipe) | import XMonad.Util.Run (spawnPipe) | ||
| - | import System.IO | + | import System.IO |
| - | + | ||
import XMonad.Prompt | import XMonad.Prompt | ||
import XMonad.Prompt.Shell | import XMonad.Prompt.Shell | ||
| - | |||
| - | |||
| - | |||
import XMonad.Util.WorkspaceCompare | import XMonad.Util.WorkspaceCompare | ||
| - | |||
| - | |||
import XMonad.Util.EZConfig | import XMonad.Util.EZConfig | ||
| - | + | import XMonad.Actions.Warp | |
| + | import Data.Ratio | ||
myTerminal = "urxvt" | myTerminal = "urxvt" | ||
| - | myScreenLock = "/usr/bin/ | + | myScreenLock = "/usr/bin/gnome-screensaver-command -l" |
myBorderWidth = 1 | myBorderWidth = 1 | ||
myModMask = mod4Mask | myModMask = mod4Mask | ||
myNumlockMask = mod2Mask | myNumlockMask = mod2Mask | ||
| - | myWorkspaces = [" | + | myWorkspaces = ["α", "β" ,"γ", "δ", "ε", "ζ", "η", "θ", "ι"] |
myNormalBorderColor = "#111" | myNormalBorderColor = "#111" | ||
| - | myFocusedBorderColor = " | + | myFocusedBorderColor = "cadetblue3" |
| - | + | ||
myKeys = \conf -> mkKeymap conf $ | myKeys = \conf -> mkKeymap conf $ | ||
| Line 55: | Line 53: | ||
, ("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 79: | ||
, ("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 97: | ||
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)) | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
isVisible :: X (WindowSpace -> Bool) | isVisible :: X (WindowSpace -> Bool) | ||
| Line 108: | Line 105: | ||
-- Config for Prompt | -- Config for Prompt | ||
oxyXPConfig :: XPConfig | oxyXPConfig :: XPConfig | ||
| - | oxyXPConfig = defaultXPConfig { font = " | + | oxyXPConfig = defaultXPConfig { font = "xft:Consolas-12" |
| - | , bgColor = " | + | , bgColor = "Aquamarine3" |
| - | , fgColor = " | + | , fgColor = "black" |
| - | , fgHLight = " | + | , fgHLight = "black" |
| - | , bgHLight = " | + | , bgHLight = "darkslategray4" |
| - | , borderColor = " | + | , borderColor = "black" |
, promptBorderWidth = 1 | , promptBorderWidth = 1 | ||
, position = Top | , position = Top | ||
| - | , height = | + | , height = 24 |
| - | + | ||
, defaultText = [] | , defaultText = [] | ||
} | } | ||
| Line 140: | Line 136: | ||
prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible)) | prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible)) | ||
| - | myLayout = | + | myLayout = avoidStrutsOn[U] $ tabs |
| + | ||| tiled | ||
||| Mirror tiled | ||| Mirror tiled | ||
| - | ||| | + | ||| magnify Grid |
| - | + | ||
where | where | ||
-- default tiling algorithm partitions the screen into two panes | -- default tiling algorithm partitions the screen into two panes | ||
| Line 150: | Line 146: | ||
nmaster = 1 | nmaster = 1 | ||
-- Default proportion of screen occupied by master pane | -- Default proportion of screen occupied by master pane | ||
| - | ratio = | + | ratio = 8 % 13 |
-- Percent of screen to increment by when resizing panes | -- Percent of screen to increment by when resizing panes | ||
| - | delta = 3 | + | delta = 3 % 100 |
-- tabbed layout | -- tabbed layout | ||
| - | tabs = | + | tabs = tabbed shrinkText oxyDarkTheme |
| - | -- | + | -- magnification in grid |
| - | + | magnify = magnifiercz (13%10) | |
| - | + | ||
| - | + | ||
-- Configuration for Tabbed | -- Configuration for Tabbed | ||
| - | oxyTheme :: | + | oxyTheme :: Theme |
oxyTheme = defaultTheme { inactiveBorderColor = "#000" | oxyTheme = defaultTheme { inactiveBorderColor = "#000" | ||
| - | , activeBorderColor = | + | , activeBorderColor = myFocusedBorderColor |
, activeColor = "aquamarine3" | , activeColor = "aquamarine3" | ||
, inactiveColor = "DarkSlateGray4" | , inactiveColor = "DarkSlateGray4" | ||
, inactiveTextColor = "#222" | , inactiveTextColor = "#222" | ||
, activeTextColor = "#222" | , activeTextColor = "#222" | ||
| - | , fontName = "xft: | + | , fontName = "xft:Consolas-10:bold" |
| - | , decoHeight = | + | , decoHeight = 18 |
, urgentColor = "#000" | , urgentColor = "#000" | ||
, urgentTextColor = "#63b8ff" | , urgentTextColor = "#63b8ff" | ||
| + | } | ||
| + | |||
| + | oxyDarkTheme :: Theme | ||
| + | oxyDarkTheme = defaultTheme { inactiveBorderColor = "#777" | ||
| + | , activeBorderColor = myFocusedBorderColor | ||
| + | , activeColor = "#000" | ||
| + | , inactiveColor = "#444" | ||
| + | , inactiveTextColor = "aquamarine4" | ||
| + | , activeTextColor = "aquamarine1" | ||
| + | , fontName = "xft:Dejavu Sans Mono-8" | ||
| + | , decoHeight = 15 | ||
| + | , urgentColor = "#000" | ||
| + | , urgentTextColor = "#63b8ff" | ||
} | } | ||
myManageHook = composeAll | myManageHook = composeAll | ||
| - | + | [ resource =? "desktop_window" --> doIgnore | |
| + | , className =? "ClockScreenlet.py" --> doIgnore | ||
| + | , className =? "Deluge" --> doF (W.shift "9") | ||
| + | , title =? "roottail" --> doIgnore ] | ||
<+> manageDocks | <+> manageDocks | ||
-- Status bars and logging | -- Status bars and logging | ||
| - | myLogHook h = dynamicLogWithPP $ oxyPP h | + | myLogHook h = do |
| + | ewmhDesktopsLogHook | ||
| + | dynamicLogWithPP $ oxyPP h | ||
| + | updatePointer (Relative (1/20) (1/20)) | ||
oxyPP :: Handle -> PP | oxyPP :: Handle -> PP | ||
| Line 186: | Line 199: | ||
, 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" -> "MTiled" | ||
| + | "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 | + | _ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>" |
| - | + | , ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>" | |
| - | , ppHiddenNoWindows = | + | |
| - | + | ||
| - | + | ||
, ppHidden = wrap "<fc=#aaa,black> " " </fc>" | , ppHidden = wrap "<fc=#aaa,black> " " </fc>" | ||
| - | |||
, ppOutput = 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 | ||
| Line 221: | Line 243: | ||
normalBorderColor = myNormalBorderColor, | normalBorderColor = myNormalBorderColor, | ||
focusedBorderColor = myFocusedBorderColor, | focusedBorderColor = myFocusedBorderColor, | ||
| - | |||
-- key bindings | -- key bindings | ||
keys = myKeys, | keys = myKeys, | ||
| Line 230: | Line 251: | ||
logHook = myLogHook pipe | logHook = myLogHook pipe | ||
} | } | ||
| + | |||
| + | |||
</haskell> | </haskell> | ||
Current revision
Some of the other scripts I use can be found here (outdated at the moment).
-- -*- haskell -*- import Control.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.Grid import XMonad.Layout.Magnifier import XMonad.Layout.TabBarDecoration import XMonad.Hooks.DynamicLog hiding (shorten) import XMonad.Actions.CycleWS import XMonad.Hooks.ManageDocks import XMonad.Hooks.EwmhDesktops import XMonad.Actions.DwmPromote import XMonad.Actions.UpdatePointer import XMonad.Hooks.UrgencyHook import XMonad.Util.Run (spawnPipe) import System.IO import XMonad.Prompt import XMonad.Prompt.Shell 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 = "cadetblue3" 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 = avoidStrutsOn[U] $ tabs ||| tiled ||| Mirror tiled ||| 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 oxyDarkTheme -- magnification in grid magnify = magnifiercz (13%10) -- Configuration for Tabbed oxyTheme :: Theme oxyTheme = defaultTheme { inactiveBorderColor = "#000" , activeBorderColor = myFocusedBorderColor , activeColor = "aquamarine3" , inactiveColor = "DarkSlateGray4" , inactiveTextColor = "#222" , activeTextColor = "#222" , fontName = "xft:Consolas-10:bold" , decoHeight = 18 , urgentColor = "#000" , urgentTextColor = "#63b8ff" } oxyDarkTheme :: Theme oxyDarkTheme = defaultTheme { inactiveBorderColor = "#777" , activeBorderColor = myFocusedBorderColor , activeColor = "#000" , inactiveColor = "#444" , inactiveTextColor = "aquamarine4" , activeTextColor = "aquamarine1" , fontName = "xft:Dejavu Sans Mono-8" , decoHeight = 15 , urgentColor = "#000" , urgentTextColor = "#63b8ff" } myManageHook = composeAll [ resource =? "desktop_window" --> doIgnore , className =? "ClockScreenlet.py" --> doIgnore , className =? "Deluge" --> doF (W.shift "9") , title =? "roottail" --> doIgnore ] <+> manageDocks -- Status bars and logging myLogHook h = do ewmhDesktopsLogHook dynamicLogWithPP $ oxyPP h updatePointer (Relative (1/20) (1/20)) 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" -> "MTiled" "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 = 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, -- key bindings keys = myKeys, mouseBindings = myMouseBindings, -- hooks, layouts layoutHook = myLayout, manageHook = myManageHook, logHook = myLogHook pipe }
