diff --git a/roles/nvim/files/init_pc.lua b/roles/nvim/files/init_pc.lua
index c55120f..21e1a95 100644
--- a/roles/nvim/files/init_pc.lua
+++ b/roles/nvim/files/init_pc.lua
@@ -234,6 +234,11 @@ lsp.csharp_ls.setup {
on_attach = on_attach,
}
+lsp.hls.setup {
+ capabilities = capabilities,
+ on_attach = on_attach,
+}
+
-- Autopairs
require'nvim-ts-autotag'.setup()
require'nvim-autopairs'.setup{}
diff --git a/roles/nvim/tasks/main.yml b/roles/nvim/tasks/main.yml
index be96f78..a91fe7c 100644
--- a/roles/nvim/tasks/main.yml
+++ b/roles/nvim/tasks/main.yml
@@ -58,6 +58,8 @@
- typescript-language-server # JavaScript, TypeScript
- ccls # C, C++
- yaml-language-server # YAML
+ - ansible-lint # partly required for ansible
+ - haskell-language-server # Haskell
# TODO ansible-language-server AUR
# TODO csharp-ls dotnet tool
# TODO vscode-langservers-extracted AUR
diff --git a/roles/xmonad/files/xmobarrc_t460p b/roles/xmonad/files/xmobarrc_t460p
new file mode 100644
index 0000000..4b82bac
--- /dev/null
+++ b/roles/xmonad/files/xmobarrc_t460p
@@ -0,0 +1,22 @@
+Config { font = "xft:Iosevka-Regular:size=11:antialias=true"
+ , bgColor = "#3f3f3f"
+ , fgColor = "#dcdccc"
+ , position = Top
+ , border = FullB
+ , borderColor = "#dcdccc"
+ , lowerOnStart = True
+ , commands = [Run DynNetwork ["-t", ": ↓ | ↑ kbps"] 10
+ , Run BatteryP ["BAT0"] ["-t", "Bat: % "] 600
+ , Run Date "%a, %d.%m.%Y - %H:%M" "date" 10
+ , Run Kbd [("de", "de"), ("de(dsb_qwertz)", "dsb"), ("ru(phonetic)", "ru")]
+ , Run Memory ["-t", "RAM: %"] 10
+ , Run MultiCpu ["-t", "CPU: %"] 10
+ , Run Com "uname" ["-r"] "" 0
+ , Run Com "pamixer" ["--get-volume-human"] "vol" 1
+ , Run Com "pamixer" ["--default-source", "--get-mute"] "mic" 1
+ , Run StdinReader
+ ]
+ , sepChar = "%"
+ , alignSep = "}{"
+ , template = " | %StdinReader% }{ %dynnetwork% | %multicpu% | %memory% | %uname% | %kbd% | %battery% | Vol: %vol% | MicMute: %mic% | %date% | "
+ }
diff --git a/roles/xmonad/files/xmonad_t460p.hs b/roles/xmonad/files/xmonad_t460p.hs
new file mode 100644
index 0000000..0d93a2d
--- /dev/null
+++ b/roles/xmonad/files/xmonad_t460p.hs
@@ -0,0 +1,376 @@
+{-# OPTIONS_GHC -Wno-missing-signatures #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+{-# LANGUAGE BlockArguments #-}
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE PostfixOperators #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+
+-- 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.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
+
+
+-- colours
+white :: String = "#dcdccc"
+yellow :: String = "#efef8f"
+orange :: String = "#ffcfaf"
+red :: String = "#dca3a3"
+blue :: String = "#8cd0d3"
+darkBlue :: String = "#8c8cbc"
+green :: String = "#7f9f7f"
+grey :: String = "#3f3f3f"
+darkGrey :: String = "#262626"
+
+-- variables
+myTerminal = "st"
+myBorderWidth = 1
+myModMask = mod4Mask
+
+-- scratchpads
+myScratchpads :: [NamedScratchpad]
+myScratchpads =
+ [ NS "keepassxc" "keepassxc ~/db.kdbx" (title =? "it factum Max Hohlfeld - KeePassXC" <||> title =? "db.kdbx [Gesperrt] - KeePassXC") defaultFloating
+ , NS "nnn" "st -t nnn -e nnnwrapper" (title =? "nnn") (customFloating $ W.RationalRect (1/4) (1/6) (2/4) (4/6))
+ , NS "vimwiki" "st -t vimwiki -e vwwrapper" (title =? "vimwiki") (customFloating $ W.RationalRect (1/6) (1/6) (2/3) (2/3))
+ ]
+
+-- Topic Space
+topicItems :: [TopicItem]
+topicItems =
+ [ noAction "1" "~/"
+ , noAction "2" "~/"
+ , noAction "3" "~/"
+ , noAction "4" "~/"
+ , noAction "5" "~/"
+ , TI "dots" "~/dotfiles" spawnShell
+ , TI "IHD_Backend" "~/projekte/IHD/Tractatio_Backend/" (spawnShell *> spawnShell *> spawnShell)
+ , TI "IHD_Frontend" "~/projekte/IHD/Demonstrare_Frontend/" (spawnShell *> spawnShell *> spawnShell)
+ ]
+
+myTopicConfig :: TopicConfig
+myTopicConfig = def
+ { topicDirs = tiDirs topicItems
+ , topicActions = tiActions topicItems
+ , defaultTopicAction = const (pure ()) -- by default, do nothing
+ , defaultTopic = "1" -- fallback
+ }
+
+spawnShellInTopic :: X ()
+-- spawnShellInTopic = currentTopicDir myTopicConfig >>= spawn(myTerminal) ++ " -d "
+spawnShellInTopic = proc $ inTerm >-> execute "nvim" >-$ currentTopicDir myTopicConfig
+
+-- spawnTermInTopic :: X ()
+-- spawnTermInTopic = proc $ termInDir >-$ currentTopicDir topicConfig
+
+-- | Execute a program in the topic directory (inside a terminal).
+-- executeInTopic :: String -> X ()
+-- executeInTopic p = proc $ (termInDir >-$ currentTopicDir topicConfig) >-> executeNoQuote p
+
+-- | Spawn editor in the current topic directory.
+-- spawnEditorInTopic :: X ()
+-- spawnEditorInTopic = proc $ inEditor >-$ currentTopicDir topicConfig
+--
+spawnShell :: X ()
+spawnShell = currentTopicDir myTopicConfig >>= spawnShellIn
+-- spawnShell = currentTopicDir myTopicConfig >>= \dir -> spawnShellInTopic $ dir " dsfsdf"
+-- spawnShell = ((spawnShellInTopic "dsf") " dsfsdf")
+
+spawnShellIn :: Dir -> X ()
+spawnShellIn dir = spawn $ "st -d " ++ dir
+
+spawnCommand :: String -> X()
+spawnCommand cmd = spawn $ "st -d" ++ cmd
+
+-- getDir :: X Dir -> String
+-- getDir (X dir) = dir
+
+-- combine :: String -> String
+-- combine str = currentTopicDir myTopicConfig . getDir
+-- getDir =
+
+spawnShellInAndExe :: String -> String -> X ()
+spawnShellInAndExe cmd dir = spawn $ "st -d" ++ dir ++ " -e" ++ cmd
+
+goto :: Topic -> X ()
+goto = switchTopic myTopicConfig
+
+promptedGoto :: X ()
+promptedGoto = workspacePrompt topicPrompt goto
+
+promptedShift :: X ()
+promptedShift = workspacePrompt topicPrompt $ windows . W.shift
+
+toggleTopic :: X ()
+toggleTopic = switchNthLastFocusedByScreen myTopicConfig 1
+
+topicPrompt :: XPConfig
+topicPrompt = def
+ { historySize = 0 -- No history in the prompt.
+ , fgColor = white
+ , fgHLight = "#3f3f3f"
+ , bgHLight = red
+ , alwaysHighlight = True -- Current best match
+ , height = 25
+ , position = Top
+ , promptBorderWidth = myBorderWidth -- Fit in with rest of config
+ , borderColor = red
+ , maxComplRows = Just 5 -- Max rows to show in completion window
+ , searchPredicate = fuzzyMatch
+ , sorter = fuzzySort
+ }
+
+
+-- custom keybinds
+myAdditionalKeys :: [(String, X ())]
+myAdditionalKeys =
+ -- xmonad specific
+ [ ("M-q", spawn "xmonad --recompile; xmonad --restart")
+
+ -- dmenu prompts
+ , ("M-", spawn "dm-recent-aliases")
+ , ("M-p s", spawn "dm-screenshot")
+ , ("M-p c", spawn "dm-confedit")
+ , ("M-p k", spawn "dm-kill")
+
+ -- scratchpads
+ , ("M-n", namedScratchpadAction myScratchpads "nnn")
+ , ("M-S-a", namedScratchpadAction myScratchpads "keepassxc")
+ , ("M-v", namedScratchpadAction myScratchpads "vimwiki")
+
+ -- open terminal
+ , ("M-S-", spawn (myTerminal))
+
+ -- open browser
+ , ("M-b", spawn "firefox")
+
+ -- media keys
+ , ("", spawn "pamixer -t")
+ , ("", spawn "pamixer -d 5")
+ , ("", spawn "pamixer -i 5")
+ , ("", spawn "pamixer --default-source -t")
+
+ -- lock screen
+ , ("M-S-l", spawn "slock")
+
+ -- mute mic
+ , ("M-S-m", spawn "amixer sset Capture toggle")
+
+ , ("M-z", promptedGoto)
+ , ("M-S-z", promptedShift)
+ , ("M-S-", toggleTopic)
+
+ -- close windows
+ , ("M-S-c", kill)
+ ]
+ ++
+ [ ("M-" ++ m ++ k, f i)
+ | (i, k) <- zip (topicNames topicItems) (map show [1 .. 9 :: Int])
+ , (f, m) <- [(goto, ""), (windows . W.shift, "S-")]
+ ]
+
+-- default keybinds
+myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
+
+ [
+ -- Rotate through the available layout algorithms
+ ((modm, xK_space ), sendMessage NextLayout)
+
+ -- Reset the layouts on the current workspace to default
+ -- , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
+
+ -- Resize viewed windows to the correct size
+ -- , ((modm, xK_n ), refresh)
+
+ -- Move focus to the next window
+ , ((modm, xK_Tab ), windows W.focusDown)
+
+ -- Move focus to the next window
+ , ((modm, xK_j ), windows W.focusDown)
+
+ -- Move focus to the previous window
+ , ((modm, xK_k ), windows W.focusUp )
+
+ -- Move focus to the master window
+ -- , ((modm, xK_m ), windows W.focusMaster )
+
+ -- Swap the focused window and the master window
+ , ((modm, xK_Return), windows W.swapMaster)
+
+ -- Swap the focused window with the next window
+ , ((modm .|. shiftMask, xK_j ), windows W.swapDown )
+
+ -- Swap the focused window with the previous window
+ , ((modm .|. shiftMask, xK_k ), windows W.swapUp )
+
+ -- Shrink the master area
+ , ((modm, xK_h ), sendMessage Shrink)
+
+ -- Expand the master area
+ , ((modm, xK_l ), sendMessage Expand)
+
+ -- Push window back into tiling
+ , ((modm, xK_t ), withFocused $ windows . W.sink)
+
+ -- Increment the number of windows in the master area
+ , ((modm , xK_comma ), sendMessage (IncMasterN 1))
+
+ -- Deincrement the number of windows in the master area
+ , ((modm , xK_period), sendMessage (IncMasterN (-1)))
+
+ -- Toggle the status bar gap
+ -- Use this binding with avoidStruts from Hooks.ManageDocks.
+ -- See also the statusBar function from Hooks.DynamicLog.
+ --
+ , ((modm .|. shiftMask, xK_b ), sendMessage ToggleStruts)
+
+ -- Quit xmonad
+ -- , ((modm .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
+
+ ]
+ ++
+
+ --
+ -- mod-[1..9], Switch to workspace N
+ -- mod-shift-[1..9], Move client to workspace N
+ --
+ -- [((m .|. modm, k), windows $ f i)
+ -- | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
+ -- , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
+ -- ++
+
+ --
+ -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
+ -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
+ --
+ [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
+ | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
+ , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
+
+
+
+-- 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 = onWorkspace "6" full $ avoidStruts $ onWorkspace "5" steamThreeCol $ tiled ||| full ||| threeCol
+ where
+ tiled = renamed [CutWordsLeft 1] $ smartBorders $ mySpacing 6 $ Tall 1 (3/100) (1/2)
+ steamThreeCol = renamed [Replace "Three Col"] $ noBorders $ mySpacing 3 $ ThreeCol 1 (3/100) (5/8)
+ threeCol = renamed [Replace "Three Col"] $ smartBorders $ mySpacing 6 $ ThreeCol 1 (3/100) (1/2)
+ full = smartBorders $ Full
+
+-- 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 "5" ]
+ , [ ( className =? "Steam" <&&> title *!? "Friends List" <||> title *!? "News" ) --> doF W.swapDown ]
+ , [ title =? t <&&> title *!? t --> doShift "6" | 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 =? "it factum Max Hohlfeld - KeePassXC" <||> title =? "db.kdbx [Gesperrt] - KeePassXC" --> floating)
+ where floating = customFloating $ W.RationalRect (1/8) (1/8) (3/4) (3/4)
+
+------------------------------------------------------------------------
+-- Status bars and logging
+
+-- Perform an arbitrary action on each internal state change or X event.
+-- See the 'XMonad.Hooks.DynamicLog' extension for examples.
+--
+-- myLogHook = return ()
+
+-- Startup hook
+myStartupHook = do
+ setWMName "LG3D"
+ setDefaultCursor xC_left_ptr
+ --spawnOnce("redshift -c /home/max/.config/redshift/redshiftrc")
+ spawnOnce("feh --bg-fill ~/bg.jpg ~/bg.jpg")
+
+-- Main
+main = do
+ xmproc0 <- spawnPipe "xmobar -x 0 /home/max/.config/xmobar/xmobarrc"
+ xmproc1 <- spawnPipe "xmobar -x 1 /home/max/.config/xmobar/xmobarrc"
+ xmonad $ spawnExternalProcess def $ docks def {
+ -- simple stuff
+ terminal = myTerminal,
+ borderWidth = myBorderWidth,
+ modMask = myModMask,
+ workspaces = topicNames topicItems,
+ normalBorderColor = white,
+ focusedBorderColor = red,
+
+ -- key bindings
+ keys = myKeys,
+
+ -- 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 = \x -> hPutStrLn xmproc0 x >> hPutStrLn xmproc1 x
+ }),
+ startupHook = myStartupHook
+ } `additionalKeysP` myAdditionalKeys
diff --git a/roles/xmonad/tasks/main.yml b/roles/xmonad/tasks/main.yml
index fa2db4e..8cd950f 100644
--- a/roles/xmonad/tasks/main.yml
+++ b/roles/xmonad/tasks/main.yml
@@ -8,15 +8,25 @@
state: present
tags: pc
-- name: Build and install custom st, dmenu and slock
- tags: pc
+# - name: Build and install custom st, dmenu and slock
+# tags: pc
- name: Create config directories
ansible.builtin.file:
- path: {{ item }}
+ path: "{{ item }}"
state: directory
mode: '0755'
with_items:
- ~/.config/xmonad
- ~/.config/xmobar
tags: pc
+
+- name: Copy over T460p config files
+ ansible.builtin.copy:
+ src: "{{ item.src }}"
+ dest: "{{ item.dest }}"
+ mode: '0644'
+ with_items:
+ - { src: xmonad_t460p.hs, dest: ~/.config/xmonad/xmonad.hs }
+ - { src: xmobarrc_t460p, dest: ~/.config/xmobar/xmobarrc }
+ tags: t460p
diff --git a/site.yml b/site.yml
index 8cab2fa..bf2e129 100644
--- a/site.yml
+++ b/site.yml
@@ -2,4 +2,7 @@
- name: Dotfile Playbook
hosts: localhost
roles:
- - nvim
+ - role: nvim
+ tags: nvim
+ - role: xmonad
+ tags: xmonad