Advertisement
Guest User

TheLinuxCast Xmonad Config

a guest
Apr 8th, 2024
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- IMPORTS
  2.  
  3. -- base
  4. import XMonad
  5. import XMonad.Config.Desktop
  6. import qualified XMonad.StackSet as W
  7. import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, docksEventHook, docks)
  8. import XMonad.Util.NamedScratchpad
  9. -- actions
  10. import XMonad.Actions.WithAll (sinkAll, killAll)
  11. import XMonad.Actions.CycleWS (moveTo, shiftTo, WSType(..), nextScreen, prevScreen)
  12. import Colors.GruvboxDarkShapes
  13.  
  14. -- utils
  15. import XMonad.Util.Run(spawnPipe)
  16. import XMonad.Util.EZConfig(additionalKeysP)
  17. import XMonad.Actions.Warp
  18.  
  19. -- data
  20. import qualified Data.Map as M
  21. import Data.Monoid
  22. import Data.Ratio ((%)) -- for video
  23. -- hooks
  24. import XMonad.Hooks.EwmhDesktops
  25. import XMonad.Hooks.DynamicLog
  26. import XMonad.Hooks.ManageHelpers (isFullscreen, isDialog,  doFullFloat, doCenterFloat, doRectFloat)
  27. import XMonad.Util.SpawnOnce
  28. -- layout
  29. import XMonad.Layout.Renamed (renamed, Rename(Replace))
  30. import XMonad.Layout.NoBorders
  31. import XMonad.Layout.Spacing
  32. import XMonad.Layout.GridVariants
  33. import XMonad.Layout.ResizableTile
  34. import XMonad.Layout.BinarySpacePartition
  35. import XMonad.Hooks.InsertPosition (insertPosition, Focus(Newer), Position(End))
  36.  
  37. -- system
  38. import System.Exit (exitSuccess)
  39. import System.IO (hPutStrLn)
  40.  
  41. -- variables
  42. myTerminal = "kitty"                   -- default terminal
  43.  
  44. myBorderWidth = 3                   -- width of window border
  45. myModMask = mod4Mask                -- default mod key
  46.  
  47. myNormColor = colorBack             -- unfocus window border
  48. myFocusColor = blue            -- focus window border
  49.  
  50. -- workspace
  51. xmobarEscape = concatMap doubleLts
  52.   where doubleLts '<' = "<<"
  53.         doubleLts x   = [x]
  54.  
  55. --myWorkspaces = clickable . (map xmobarEscape) $ [" 1 "," 2 "," 3 "," 4 "," 5 "," 6 "," 7 "," 8 "," 9 "]
  56. myWorkspaces = clickable . (map xmobarEscape) $ [" \984819 "," \62601 "," \58930 "," \987057 "," \983502 "," \984423 "," \59007 "," \58878 "," \984687 "]
  57. --myWorkspaces = clickable . (map xmobarEscape) $ [" \61820 "," \62057 "," \61728 "," \61485 "," \61729 "," \61734 "," \62081 "," \61799 "," \61459 "]
  58.   where
  59.         clickable l = [ "<action=xdotool key super+" ++ show (n) ++ ">" ++ ws ++ "</action>" |
  60.                       (i,ws) <- zip [1..9] l,
  61.                       let n = i ]
  62.  
  63. --windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset
  64.  
  65. -- window rules
  66. myManageHook = composeAll
  67.     [ className =? "gpick"   --> doFloat
  68.     , className =? "Zenity" --> doFloat
  69.     , title =? "pulsemixer" --> doRectFloat (W.RationalRect (1 % 4) (1 % 4) (1 % 2) (1 % 2))
  70.     , isFullscreen --> doFullFloat
  71.     ]
  72.  
  73. --startuphook
  74. myStartupHook :: X ()
  75. myStartupHook = do
  76.    spawnOnce "~/.config/xmonad/scripts/autostart.sh"
  77.  
  78.  
  79. -- scratchPads
  80. scratchpads :: [NamedScratchpad]
  81. scratchpads = [
  82. -- run htop in xterm, find it by title, use default floating window placement
  83.     NS "term2" "kitty -T term2" (title =? "term2")
  84.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  85.     NS "term1" "kitty -T term1" (title =? "term1")
  86.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  87.     NS "pulse" "kitty -T pulse -e pulsemixer" (title =? "pulse")
  88.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  89.     NS "music" "kitty -T music -e ncspot" (title =? "music")
  90.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  91.     NS "news" "kitty -T news -e newsboat" (title =? "news")
  92.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  93.     NS "mail" "kitty -T mail -e neomutt" (title =? "mail")
  94.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6)),
  95.     NS "yazi" "kitty --class yazi -e yazi" (className =? "yazi")
  96.         (customFloating $ W.RationalRect (1/12) (1/6) (5/6) (4/6))
  97.   ]
  98.  
  99. -- keybinds
  100. myKeys =
  101.     [ ("M-S-r", spawn "xmonad --recompile; xmonad --restart")    
  102.     , ("M-<Escape>", io exitSuccess)                          
  103.     , ("M-<Return>", spawn myTerminal)                          
  104.     , ("M-d", spawn "rofi -show drun")                          
  105.     , ("M-q", kill)                                              
  106.     , ("M-S-q", killAll)                                        
  107.     , ("M-<Tab>", sequence_ [nextScreen, warpToWindow (1%2) (1%2)])
  108.     , ("M-S-<Tab>", sequence_ [prevScreen, warpToWindow (1%2) (1%2)])
  109.     , ("M-h", sendMessage Shrink)                                
  110.     , ("M-l", sendMessage Expand)                                
  111.     , ("M-S-.", sendMessage (IncMasterN (-1)))                    
  112.     , ("M-S-,", sendMessage (IncMasterN 1))                      
  113.     , ("M-p", windows W.focusMaster)                              
  114.     , ("M-j", windows W.focusDown)                                
  115.     , ("M-k", windows W.focusUp)                                  
  116.     , ("M-<Space>", sendMessage NextLayout)                      
  117.     , ("M-t", withFocused $ windows . W.sink)                    
  118.     , ("M-S-t", sinkAll)                                          
  119. -- Scratchpads
  120.     , ("M-n", namedScratchpadAction scratchpads "term1")
  121.     , ("M-S-n", namedScratchpadAction scratchpads "term2")                  
  122.     , ("M-v", namedScratchpadAction scratchpads "pulse")                    
  123.     , ("M-c", namedScratchpadAction scratchpads "yazi")                  
  124.     , ("M-S-m", namedScratchpadAction scratchpads "music")
  125.     , ("M-m", namedScratchpadAction scratchpads "mail")
  126.     , ("M-b", namedScratchpadAction scratchpads "news")                    
  127. -- Apps
  128.     ]
  129.  
  130.  
  131.  
  132. -- layout
  133. myLayout = avoidStruts (tiled ||| full ||| grid ||| bsp)
  134.     where
  135.         -- full
  136.         full = renamed [Replace "F"]
  137.                 $ noBorders (Full)
  138.         -- tiled
  139.         tiled = renamed [Replace "||"]
  140.                 $ spacingRaw False (Border 10 0 10 0) True (Border 0 10 0 10) True
  141.                 $ ResizableTall 1 (3/100) (1/2) []
  142.         -- grid
  143.         grid = renamed [Replace "#"]
  144.                 $ spacingRaw True (Border 10 0 10 0) True (Border 0 10 0 10) True
  145.                 $ Grid (16/10)
  146.         -- bsp
  147.         bsp = renamed [Replace "BSP"]
  148.                 $ emptyBSP
  149.         -- default number of windows in master pane
  150.         nmaster = 1
  151.         -- default proportion of screen occupied by master pane
  152.         ratio = 1/2
  153.         -- percent of screen to increment by when resizing panes
  154.         delta = 3/100
  155.  
  156. -- main
  157. main = do
  158.     xmproc0 <- spawnPipe ("xmobar -x 0 $HOME/.config/xmobar/" ++ colorscheme ++ "-xmobarrc")
  159.     xmproc1 <- spawnPipe ("xmobar -x 1 $HOME/.config/xmobar/" ++ colorscheme ++ "-xmobarrc")
  160.     xmproc2 <- spawnPipe ("xmobar -x 2 $HOME/.config/xmobar/" ++ colorscheme ++ "-xmobarrc")
  161.     xmonad $ ewmh $ docks $ def
  162.         { manageHook = ( isFullscreen --> doFullFloat ) <+> ( isDialog --> doF W.swapUp ) <+> myManageHook <+>  namedScratchpadManageHook scratchpads <+> manageHook desktopConfig <+> manageDocks <+> insertPosition End Newer
  163.         , terminal = myTerminal
  164.         , workspaces = myWorkspaces
  165.         , borderWidth = myBorderWidth
  166.         , startupHook = myStartupHook
  167.         , normalBorderColor = myNormColor
  168.         , focusedBorderColor = myFocusColor
  169.         , layoutHook = smartBorders $ myLayout
  170.         , logHook = dynamicLogWithPP . filterOutWsPP [scratchpadWorkspaceTag] $ xmobarPP  
  171.                         { ppOutput = \x -> hPutStrLn xmproc0 x  >> hPutStrLn xmproc1 x >> hPutStrLn xmproc2 x
  172.  
  173.                         , ppCurrent = xmobarColor yellow "" . wrap "" ""
  174.                         , ppVisible = xmobarColor green ""
  175.                         , ppHidden = xmobarColor magenta "" . wrap "" ""
  176. --                        , ppHiddenNoWindows = xmobarColor  myppHiddenNoWindows ""
  177.                         , ppTitle = xmobarColor yellow "" . shorten 45
  178.                         , ppSep = " - "
  179.                         , ppUrgent = xmobarColor red "" . wrap "!" "!"
  180.                         , ppOrder  = \(ws:_:t:_) -> [ws,t]
  181.                         }
  182.         , modMask = myModMask
  183.         }
  184.         `additionalKeysP` myKeys
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement