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