diff --git a/justfile b/justfile index b6c3d6a..f7a8fae 100644 --- a/justfile +++ b/justfile @@ -4,14 +4,14 @@ default: just --list sync-qwerty tags=allTags: - ansible-playbook site.yml -K -t "pc,qwerty,{{tags}}" + ANSIBLE_LOCALHOST_WARNING=false ansible-playbook site.yml -K -t "pc,qwerty,{{tags}}" sync-x220 tags=allTags: - ansible-playbook site.yml -K -t "pc,x220,{{tags}}" + ANSIBLE_LOCALHOST_WARNING=false ansible-playbook site.yml -K -t "pc,x220,{{tags}}" sync-t460p tags=allTags: - ansible-playbook site.yml -K -t "pc,t460p,{{tags}}" + ANSIBLE_LOCALHOST_WARNING=false ansible-playbook site.yml -K -t "pc,t460p,{{tags}}" sync-server tags=allTags: - ansible-playbook site.yml -K -t "server,{{tags}}" + ANSIBLE_LOCALHOST_WARNING=false ansible-playbook site.yml -K -t "server,{{tags}}" diff --git a/roles/xmonad/files/alacritty.yml b/roles/xmonad/files/alacritty.yml new file mode 100644 index 0000000..4e8f671 --- /dev/null +++ b/roles/xmonad/files/alacritty.yml @@ -0,0 +1,53 @@ +env: + TERM: xterm-256color + +font: + normal: + family: Iosevka + style: Regular + + bold: + family: Iosevka + style: Bold + + italic: + family: Iosevka + style: Italic + + bold_italic: + family: Iosevka + style: Bold Italic + + size: 11 + +colors: + primary: + background: '#3a3a3a' + foreground: '#d7d7d7' + + bright_foreground: '#ffffff' + bright_background: '#7f9f7f' + + cursor: + text: '#000000' + cursor: '#d7d7d7' + + normal: + black: "#3a3a3a" + red : "#cc9393" + green: "#7f9f7f" + yellow: "#d0bf8f" + blue: "#6ca0a3" + magenta: "#dc8cc3" + cyan: "#93e0e3" + white: "#dcdccc" + + bright: + black: "#7f9f7f" + red: "#d78787" + green: "#bfebbf" + yellow: "#f0dfaf" + blue: "#8cd0d3" + magenta: "#dc8cc3" + cyan: "#93e0e3" + white: "#ffffff" diff --git a/roles/xmonad/files/xmonad_qwerty.hs b/roles/xmonad/files/xmonad_qwerty.hs new file mode 100644 index 0000000..21494a3 --- /dev/null +++ b/roles/xmonad/files/xmonad_qwerty.hs @@ -0,0 +1,259 @@ +{-# LANGUAGE BlockArguments #-} +-- Imports +import XMonad +import Data.Monoid +import System.Exit +import XMonad.Util.Run +import XMonad.Util.SpawnOnce +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.ManageDocks +import XMonad.Layout.Spacing +import XMonad.Layout.ThreeColumns +import XMonad.Layout.LayoutModifier +import XMonad.Layout.Renamed +import XMonad.Hooks.SetWMName +import XMonad.Util.Cursor +import XMonad.Layout.NoBorders +import XMonad.Layout.PerWorkspace +import XMonad.Layout.LimitWindows +import XMonad.Hooks.EwmhDesktops +import XMonad.Util.EZConfig +import XMonad.Util.NamedScratchpad +import XMonad.Actions.TopicSpace +import XMonad.Prompt +import XMonad.Prompt.FuzzyMatch +import XMonad.Prompt.Workspace +import XMonad.Hooks.WorkspaceHistory (workspaceHistoryHook) +import XMonad.Hooks.DynamicProperty +import qualified XMonad.StackSet as W +import qualified Data.Map as M +import Text.Regex.Posix + +import XMonad.Util.WorkspaceCompare ( getSortByIndex, filterOutWs ) + +-- variables +myTerminal = "alacritty" +myBorderWidth = 1 +myNormalBorderColor = "#dcdccc" +myFocusedBorderColor = "#dca3a3" +myModMask = mod4Mask + +-- scratchpads +myScratchpads :: [NamedScratchpad] +myScratchpads = + [ NS "cmus" "st -n cmus -e cmus" (resource =? "cmus") (customFloating $ W.RationalRect (1/6) (1/6) (4/6) (4/6)) + , NS "nnn" "st -t nnn -e nnnwrapper" (title =? "nnn") (customFloating $ W.RationalRect (1/4) (1/6) (2/4) (4/6)) + , NS "neomutt" "st -t neomutt -e neomutt -f posteo-Inbox" (title =? "neomutt") (customFloating $ W.RationalRect (1/10) (1/10) (8/10) (8/10)) + , NS "vimwiki" "st -t vimwiki -e vwwrapper" (title =? "vimwiki") (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3)) + , NS "keepassxc" "keepassxc ~/dokumente/Database.kdbx" (title =? "Database.kdbx - KeePassXC" <||> title =? "Database.kdbx [Gesperrt] - KeePassXC") defaultFloating + , NS "discord" "firejail discord" (title *!? "Discord") (customFloating $ W.RationalRect (1/10) (1/10) (8/10) (8/10)) + ] + +-- Topic Space +topicItems :: [TopicItem] +topicItems = + [ noAction "1" "~/" + , noAction "2" "~/" + , noAction "3" "~/" + , noAction "4" "~/" + , noAction "5" "~/" + , TI "recipes" "~/recipes" (switchToLayout "Programming" *> spawnShellAndExecute "hugo server" *> proc (inProgram "librewolf") *> spawnEditor) + , TI "alkaa" "~/alkaa" (switchToLayout "Programming" *> spawnShell *> spawnEditor) + , TI "steam" "~" (switchToLayout "Steam" *> spawn "steam") + , TI "game" "~" (switchToLayout "Full") + , TI "micro" "~/projekte/microcontroller" (switchToLayout "Programming" *> spawnShell *> spawnEditor) + ] + +myTopicConfig :: TopicConfig +myTopicConfig = def + { topicDirs = tiDirs topicItems + , topicActions = tiActions topicItems + , defaultTopicAction = const (pure ()) -- by default, do nothing + , defaultTopic = "1" -- fallback + } + +spawnShell :: X () +spawnShell = proc $ termInDir >-$ currentTopicDir myTopicConfig + +spawnEditor :: X () +spawnEditor = proc $ (termInDir >-$ currentTopicDir myTopicConfig) >-> execute "nvim" + +switchToLayout :: String -> X () +switchToLayout = sendMessage . JumpToLayout + +spawnShellAndExecute :: String -> X () +spawnShellAndExecute cmd = proc $ (termInDir >-$ currentTopicDir myTopicConfig) >-> execute cmd + +toggleTopic :: X () +toggleTopic = switchNthLastFocusedByScreen myTopicConfig 1 + +myWorkSpacePrompt :: XPConfig -> (String -> X ()) -> X () +myWorkSpacePrompt c job = do ws <- gets (W.workspaces . windowset) + sort <- getSortByIndex + let filter = filterOutWs ["1", "2", "3", "4", "5", "NSP"] + let ts = map W.tag $ filter ws + mkXPrompt (Wor "") c (mkComplFunFromList' c ts) job + +topicPrompt :: XPConfig +topicPrompt = def + { historySize = 20 -- No history in the prompt. + , fgColor = "#dcdccc" + , fgHLight = "#3f3f3f" + , bgHLight = "#dca3a3" + , alwaysHighlight = True -- Current best match + , font = "xft:Iosevka-11" + , height = 25 + , position = Top + , promptBorderWidth = myBorderWidth -- Fit in with rest of config + , borderColor = "#dca3a3" + , maxComplRows = Just 5 -- Max rows to show in completion window + , searchPredicate = fuzzyMatch + , sorter = fuzzySort + } + +-- keybindings +myAdditionalKeys :: [(String, X ())] +myAdditionalKeys = + -- xmonad specific + [ ("M-q", spawn "xmonad --recompile; xmonad --restart") + , ("M-S-c", kill) + , ("M-j", windows W.focusDown) + , ("M-k", windows W.focusUp) + , ("M-S-j", windows W.swapDown) + , ("M-S-k", windows W.swapUp) + , ("M-h", sendMessage Shrink) + , ("M-j", sendMessage Expand) + , ("M-,", sendMessage (IncMasterN 1)) + , ("M-S-,", sendMessage (IncMasterN (-1))) + , ("M-.", sendMessage ToggleStruts) + + -- dmenu prompts + , ("M-", spawn "dm-recent-aliases") + , ("M-p s", spawn "dm-screenshot") + , ("M-p k", spawn "dm-kill") + + -- scratchpads + , ("M-s c", namedScratchpadAction myScratchpads "cmus") + , ("M-s m", namedScratchpadAction myScratchpads "neomutt") + , ("M-s v", namedScratchpadAction myScratchpads "vimwiki") + , ("M-s d", namedScratchpadAction myScratchpads "discord") + + , ("M-S-a", namedScratchpadAction myScratchpads "keepassxc") + , ("M-n", namedScratchpadAction myScratchpads "nnn") + + -- some shortcuts for prorgrams + , ("M-S-", spawnShell) + , ("M-b", spawn "librewolf") + + -- layout + , ("M-t t", switchToLayout "Tall") + , ("M-t h", switchToLayout "Programming") + , ("M-t f", switchToLayout "Full") + + , ("M-S-f", withFocused $ windows . W.sink) + + -- media keys + , ("", spawn "amixer sset Master toggle") + , ("", spawn "amixer sset Master 5%- unmute") + , ("", spawn "amixer sset Master 5%+ unmute") + , ("", spawn "amixer sset Capture toggle") + , ("M-S-m", spawn "amixer sset Capture toggle") + + -- lock screen + , ("M-S-l", spawn "slock") + + -- workspace switching + , ("M-", toggleTopic) + , ("M-", myWorkSpacePrompt topicPrompt (switchTopic myTopicConfig)) + , ("M-S-", myWorkSpacePrompt topicPrompt (windows . W.shift)) + + ] + ++ + -- use 1-5 for switching (Shift Mod shifts into) workspaces 1-5 + [ ("M-" ++ m ++ k, f i) + | (i, k) <- zip (topicNames topicItems) (map show [1 .. 5 :: Int]) + , (f, m) <- [(switchTopic myTopicConfig, ""), (windows . W.shift, "S-")] + ] + +-- Layouts +mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a +mySpacing i = spacingRaw True (Border i i i i) True (Border i i i i) True + +myLayout = avoidStruts $ tiling ||| hacking ||| full ||| steam + where + tiling = renamed [Replace "Tall"] $ smartBorders $ mySpacing 6 $ Tall 1 (3/100) (1/2) + hacking = renamed [Replace "Programming"] $ smartBorders $ mySpacing 6 $ Tall 1 (3/100) (5/8) + full = noBorders Full + steam = renamed [Replace "Steam"] $ noBorders $ mySpacing 3 $ limitWindows 2 $ ThreeCol 1 (3/100) (5/8) + +-- Regex lifted up to use in manageHook +(*!?) :: Functor f => f String -> String -> f Bool +q *!? x = fmap (=~ x) q + +-- window rules +myManageHook = composeAll . concat $ + [ [ resource =? "desktop_window" --> doIgnore ] + , [ resource =? "kdesktop" --> doIgnore ] + , [ ( className =? "LibreWolf" <&&> role =? "Organizer" ) --> doFloat ] + + -- Steam and games + , [ className =? "Steam" --> doShift "steam" ] + , [ ( className =? "Steam" <&&> title *!? "Friends List" <||> title *!? "News" ) --> doF W.swapDown ] + , [ title =? t <&&> title *!? t --> doShift "game" | t <- myGames ] + + -- float specific classes + , [ className =? c --> doFloat | c <- myFloatingClasses ] + + -- scratchpads + , [ namedScratchpadManageHook myScratchpads ] + ] + where + role = stringProperty "WM_WINDOW_ROLE" + myFloatingClasses = ["Gimp", "Origin"] + myGames = ["Grim Dawn", "Der Herr der Ringe Onlineā„¢", "Dota 2", "Project Zomboid", "Valheim", "Factorio", "Path of Exile", "Paradox Launcher", "Europa Universalis IV", "Bannerlord"] + +------------------------------------------------------------------------ +-- Event handling + +-- * EwmhDesktops users should change this to ewmhDesktopsEventHook +-- +-- Defines a custom handler function for X Events. The function should +-- return (All True) if the default handler is to be run afterwards. To +-- combine event hooks use mappend or mconcat from Data.Monoid. +-- +myEventHook = dynamicPropertyChange "WM_NAME" (title =? "Database.kdbx - KeePassXC" <||> title =? "Database.kdbx [Gesperrt] - KeePassXC" --> floating) + where floating = customFloating $ W.RationalRect (1/8) (1/8) (3/4) (3/4) + +-- Startup hook +myStartupHook = do + setWMName "LG3D" + setDefaultCursor xC_left_ptr + spawnOnce("redshift -c /home/max/.config/redshift/redshiftrc") + spawnOnce("feh --bg-fill ~/bilder/bg.jpg") + spawnOnce("/usr/bin/syncthing -no-browser -logfile=default") + +-- Main +main = do + xmproc <- spawnPipe "xmobar /home/max/.config/xmobar/xmobarrc" + xmonad $ spawnExternalProcess def $ docks $ def { + -- simple stuff + terminal = myTerminal, + borderWidth = myBorderWidth, + modMask = myModMask, + workspaces = topicNames topicItems, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + -- hooks, layouts + layoutHook = myLayout, + manageHook = myManageHook, + handleEventHook = myEventHook, + logHook = workspaceHistoryHook >> (dynamicLogWithPP $ filterOutWsPP ["NSP"] $ xmobarPP { + ppCurrent = xmobarColor "#dca3a3" "" . wrap "[ " " ]", + ppHidden = xmobarColor "#8cd0d3" "", + ppLayout = xmobarColor "#8c8cbc" "", + ppTitle = xmobarColor "#ffcfaf" "" . shorten 100, + ppSep = " | ", + ppOutput = hPutStrLn xmproc + }), + startupHook = myStartupHook + } `additionalKeysP` myAdditionalKeys diff --git a/roles/xmonad/tasks/main.yml b/roles/xmonad/tasks/main.yml index a1c7820..de22cda 100644 --- a/roles/xmonad/tasks/main.yml +++ b/roles/xmonad/tasks/main.yml @@ -22,6 +22,13 @@ - ~/.config/xmobar tags: pc +- name: Copy over alacritty config + ansible.builtin.copy: + src: alacritty.yml + dest: ~/.config/alacritty.yml + mode: '0644' + tags: pc + - name: Copy over T460p config files ansible.builtin.copy: src: "{{ item.src }}" diff --git a/site.yml b/site.yml index 4fcd886..177b4b5 100644 --- a/site.yml +++ b/site.yml @@ -1,5 +1,6 @@ --- - name: Dotfile Playbook + connection: local hosts: localhost # roles: # - role: nvim