add xmonad config

This commit is contained in:
Max Hohlfeld 2022-11-04 18:21:01 +01:00
parent 4d80939288
commit bfde774848
6 changed files with 422 additions and 4 deletions

View File

@ -234,6 +234,11 @@ lsp.csharp_ls.setup {
on_attach = on_attach, on_attach = on_attach,
} }
lsp.hls.setup {
capabilities = capabilities,
on_attach = on_attach,
}
-- Autopairs -- Autopairs
require'nvim-ts-autotag'.setup() require'nvim-ts-autotag'.setup()
require'nvim-autopairs'.setup{} require'nvim-autopairs'.setup{}

View File

@ -58,6 +58,8 @@
- typescript-language-server # JavaScript, TypeScript - typescript-language-server # JavaScript, TypeScript
- ccls # C, C++ - ccls # C, C++
- yaml-language-server # YAML - yaml-language-server # YAML
- ansible-lint # partly required for ansible
- haskell-language-server # Haskell
# TODO ansible-language-server AUR # TODO ansible-language-server AUR
# TODO csharp-ls dotnet tool # TODO csharp-ls dotnet tool
# TODO vscode-langservers-extracted AUR # TODO vscode-langservers-extracted AUR

View File

@ -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", "<fc=#dca3a3><dev>:</fc> ↓ <rx> | ↑ <tx> kbps"] 10
, Run BatteryP ["BAT0"] ["-t", "<fc=#8c8cbc>Bat:</fc> <left>% <acstatus>"] 600
, Run Date "<fc=#dca3a3>%a, %d.%m.%Y</fc> - <fc=#ffcfaf>%H:%M</fc>" "date" 10
, Run Kbd [("de", "de"), ("de(dsb_qwertz)", "dsb"), ("ru(phonetic)", "ru")]
, Run Memory ["-t", "<fc=#7f9f7f>RAM:</fc> <usedratio>%"] 10
, Run MultiCpu ["-t", "<fc=#ffcfaf>CPU:</fc> <total>%"] 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% | <fc=#8cd0d3>%uname%</fc> | <fc=#efef8f>%kbd%</fc> | %battery% | <fc=#7f9f7f>Vol:</fc> %vol% | <fc=#8cd0d3>MicMute:</fc> %mic% | %date% | "
}

View File

@ -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-<Return>", 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-<Return>", spawn (myTerminal))
-- open browser
, ("M-b", spawn "firefox")
-- media keys
, ("<XF86AudioMute>", spawn "pamixer -t")
, ("<XF86AudioLowerVolume>", spawn "pamixer -d 5")
, ("<XF86AudioRaiseVolume>", spawn "pamixer -i 5")
, ("<XF86AudioMicMute>", 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-<Space>", 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

View File

@ -8,15 +8,25 @@
state: present state: present
tags: pc tags: pc
- name: Build and install custom st, dmenu and slock # - name: Build and install custom st, dmenu and slock
tags: pc # tags: pc
- name: Create config directories - name: Create config directories
ansible.builtin.file: ansible.builtin.file:
path: {{ item }} path: "{{ item }}"
state: directory state: directory
mode: '0755' mode: '0755'
with_items: with_items:
- ~/.config/xmonad - ~/.config/xmonad
- ~/.config/xmobar - ~/.config/xmobar
tags: pc 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

View File

@ -2,4 +2,7 @@
- name: Dotfile Playbook - name: Dotfile Playbook
hosts: localhost hosts: localhost
roles: roles:
- nvim - role: nvim
tags: nvim
- role: xmonad
tags: xmonad