mirror of
https://gitlab.com/dwt1/dotfiles.git
synced 2026-04-23 03:20:26 +10:00
189 lines
9.9 KiB
Haskell
189 lines
9.9 KiB
Haskell
module Custom.MyKeys where
|
|
|
|
-- Custom (my personal configs)
|
|
import Custom.MyGridMenu
|
|
import Custom.MyPrompts
|
|
import Custom.MyScratchpads
|
|
import Custom.MyTreeMenu
|
|
import Custom.MyVariables
|
|
|
|
-- Base
|
|
import XMonad
|
|
import System.Exit (exitSuccess)
|
|
import qualified XMonad.StackSet as W
|
|
|
|
-- Actions
|
|
import XMonad.Actions.CopyWindow (kill1, killAllOtherCopies)
|
|
import XMonad.Actions.CycleWS (moveTo, shiftTo, WSType(..), nextScreen, prevScreen)
|
|
import XMonad.Actions.Promote
|
|
import XMonad.Actions.GridSelect
|
|
import XMonad.Actions.RotSlaves (rotSlavesDown, rotAllDown)
|
|
import qualified XMonad.Actions.TreeSelect as TS
|
|
import XMonad.Actions.WindowGo (runOrRaise)
|
|
import XMonad.Actions.WithAll (sinkAll, killAll)
|
|
import qualified XMonad.Actions.Search as S
|
|
|
|
-- Data
|
|
import Data.Maybe (isJust)
|
|
|
|
-- Hooks
|
|
import XMonad.Hooks.ManageDocks (avoidStruts, docksEventHook, manageDocks, ToggleStruts(..))
|
|
|
|
-- Layouts and modifiers
|
|
import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit)
|
|
import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS))
|
|
import XMonad.Layout.ResizableTile
|
|
import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..))
|
|
import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle))
|
|
import qualified XMonad.Layout.MultiToggle as MT (Toggle(..))
|
|
|
|
-- Prompt
|
|
import XMonad.Prompt
|
|
import XMonad.Prompt.Shell (shellPrompt)
|
|
|
|
-- Utilities
|
|
import XMonad.Util.NamedScratchpad
|
|
import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe)
|
|
import XMonad.Util.SpawnOnce
|
|
|
|
------------------------------------------------------------------------
|
|
-- KEYBINDINGS
|
|
------------------------------------------------------------------------
|
|
-- I am using the Xmonad.Util.EZConfig module which allows keybindings
|
|
-- to be written in simpler, emacs-like format.
|
|
myKeys :: [(String, X ())]
|
|
myKeys =
|
|
-- Xmonad
|
|
[ ("M-C-r", spawn "xmonad --recompile") -- Recompiles xmonad
|
|
, ("M-S-r", spawn "xmonad --restart") -- Restarts xmonad
|
|
, ("M-S-q", io exitSuccess) -- Quits xmonad
|
|
|
|
-- Open my preferred terminal
|
|
, ("M-<Return>", spawn myTerminal)
|
|
|
|
-- Run Prompt
|
|
, ("M-S-<Return>", shellPrompt dtXPConfig) -- Shell Prompt
|
|
|
|
-- Windows
|
|
, ("M-S-c", kill1) -- Kill the currently focused client
|
|
, ("M-S-a", killAll) -- Kill all windows on current workspace
|
|
|
|
-- Floating windows
|
|
, ("M-f", sendMessage (T.Toggle "floats")) -- Toggles my 'floats' layout
|
|
, ("M-<Delete>", withFocused $ windows . W.sink) -- Push floating window back to tile
|
|
, ("M-S-<Delete>", sinkAll) -- Push ALL floating windows to tile
|
|
|
|
-- Grid Select (CTRL-g followed by a key)
|
|
, ("C-g g", spawnSelected' myAppGrid) -- grid select favorite apps
|
|
, ("C-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window
|
|
, ("C-g b", bringSelected $ mygridConfig myColorizer) -- bring selected window
|
|
|
|
-- Tree Select/
|
|
-- tree select actions menu, I have 2 keybindings for this. I do this because I prefer
|
|
-- to use the "C-t t" binding but I need standard binding, rather than a key chord, to
|
|
-- use in my xmobar config (for a clickable menu). So that's why I have 2 bindings.
|
|
, ("C-t t", treeselectAction tsDefaultConfig)
|
|
, ("C-M1-t", treeselectAction tsDefaultConfig)
|
|
|
|
-- Windows navigation
|
|
, ("M-m", windows W.focusMaster) -- Move focus to the master window
|
|
, ("M-j", windows W.focusDown) -- Move focus to the next window
|
|
, ("M-k", windows W.focusUp) -- Move focus to the prev window
|
|
--, ("M-S-m", windows W.swapMaster) -- Swap the focused window and the master window
|
|
, ("M-S-j", windows W.swapDown) -- Swap focused window with next window
|
|
, ("M-S-k", windows W.swapUp) -- Swap focused window with prev window
|
|
, ("M-<Backspace>", promote) -- Moves focused window to master, others maintain order
|
|
, ("M1-S-<Tab>", rotSlavesDown) -- Rotate all windows except master and keep focus in place
|
|
, ("M1-C-<Tab>", rotAllDown) -- Rotate all the windows in the current stack
|
|
--, ("M-S-s", windows copyToAll)
|
|
, ("M-C-s", killAllOtherCopies)
|
|
|
|
-- Layouts
|
|
, ("M-<Tab>", sendMessage NextLayout) -- Switch to next layout
|
|
, ("M-C-M1-<Up>", sendMessage Arrange)
|
|
, ("M-C-M1-<Down>", sendMessage DeArrange)
|
|
, ("M-<Space>", sendMessage (MT.Toggle NBFULL) >> sendMessage ToggleStruts) -- Toggles noborder/full
|
|
, ("M-S-<Space>", sendMessage ToggleStruts) -- Toggles struts
|
|
, ("M-S-n", sendMessage $ MT.Toggle NOBORDERS) -- Toggles noborder
|
|
, ("M-<KP_Multiply>", sendMessage (IncMasterN 1)) -- Increase number of clients in master pane
|
|
, ("M-<KP_Divide>", sendMessage (IncMasterN (-1))) -- Decrease number of clients in master pane
|
|
, ("M-S-<KP_Multiply>", increaseLimit) -- Increase number of windows
|
|
, ("M-S-<KP_Divide>", decreaseLimit) -- Decrease number of windows
|
|
|
|
, ("M-h", sendMessage Shrink) -- Shrink horiz window width
|
|
, ("M-l", sendMessage Expand) -- Expand horiz window width
|
|
, ("M-C-j", sendMessage MirrorShrink) -- Shrink vert window width
|
|
, ("M-C-k", sendMessage MirrorExpand) -- Exoand vert window width
|
|
|
|
-- Workspaces
|
|
, ("M-.", nextScreen) -- Switch focus to next monitor
|
|
, ("M-,", prevScreen) -- Switch focus to prev monitor
|
|
, ("M-S-<KP_Add>", shiftTo Next nonNSP >> moveTo Next nonNSP) -- Shifts focused window to next ws
|
|
, ("M-S-<KP_Subtract>", shiftTo Prev nonNSP >> moveTo Prev nonNSP) -- Shifts focused window to prev ws
|
|
|
|
-- Scratchpads
|
|
, ("M-C-<Return>", namedScratchpadAction myScratchPads "terminal")
|
|
, ("M-C-c", namedScratchpadAction myScratchPads "mocp")
|
|
|
|
-- Controls for mocp music player.
|
|
, ("M-u p", spawn "mocp --play")
|
|
, ("M-u l", spawn "mocp --next")
|
|
, ("M-u h", spawn "mocp --previous")
|
|
, ("M-u <Space>", spawn "mocp --toggle-pause")
|
|
|
|
-- Emacs (CTRL-e followed by a key)
|
|
, ("C-e e", spawn "emacsclient -c -a ''") -- start emacs
|
|
, ("C-e b", spawn "emacsclient -c -a '' --eval '(ibuffer)'") -- list emacs buffers
|
|
, ("C-e d", spawn "emacsclient -c -a '' --eval '(dired nil)'") -- dired emacs file manager
|
|
, ("C-e i", spawn "emacsclient -c -a '' --eval '(erc)'") -- erc emacs irc client
|
|
, ("C-e m", spawn "emacsclient -c -a '' --eval '(mu4e)'") -- mu4e emacs email client
|
|
, ("C-e n", spawn "emacsclient -c -a '' --eval '(elfeed)'") -- elfeed emacs rss client
|
|
, ("C-e s", spawn "emacsclient -c -a '' --eval '(eshell)'") -- eshell within emacs
|
|
, ("C-e t", spawn "emacsclient -c -a '' --eval '(mastodon)'") -- mastodon within emacs
|
|
, ("C-e v", spawn "emacsclient -c -a '' --eval '(+vterm/here nil)'") -- vterm within emacs
|
|
-- emms is an emacs audio player. I set it to auto start playing in a specific directory.
|
|
, ("C-e a", spawn "emacsclient -c -a '' --eval '(emms)' --eval '(emms-play-directory-tree \"~/Music/Non-Classical/70s-80s/\")'")
|
|
|
|
--- My Applications (Super+Alt+Key)
|
|
, ("M-M1-a", spawn (myTerminal ++ " -e ncpamixer"))
|
|
, ("M-M1-b", spawn "surf www.youtube.com/c/DistroTube/")
|
|
, ("M-M1-e", spawn (myTerminal ++ " -e neomutt"))
|
|
, ("M-M1-f", spawn (myTerminal ++ " -e sh ./.config/vifm/scripts/vifmrun"))
|
|
, ("M-M1-i", spawn (myTerminal ++ " -e irssi"))
|
|
, ("M-M1-j", spawn (myTerminal ++ " -e joplin"))
|
|
, ("M-M1-l", spawn (myTerminal ++ " -e lynx -cfg=~/.lynx/lynx.cfg -lss=~/.lynx/lynx.lss gopher://distro.tube"))
|
|
, ("M-M1-m", spawn (myTerminal ++ " -e mocp"))
|
|
, ("M-M1-n", spawn (myTerminal ++ " -e newsboat"))
|
|
, ("M-M1-p", spawn (myTerminal ++ " -e pianobar"))
|
|
, ("M-M1-r", spawn (myTerminal ++ " -e rtv"))
|
|
, ("M-M1-t", spawn (myTerminal ++ " -e toot curses"))
|
|
, ("M-M1-w", spawn (myTerminal ++ " -e wopr report.xml"))
|
|
, ("M-M1-y", spawn (myTerminal ++ " -e youtube-viewer"))
|
|
|
|
-- Multimedia Keys
|
|
, ("<XF86AudioPlay>", spawn "cmus toggle")
|
|
, ("<XF86AudioPrev>", spawn "cmus prev")
|
|
, ("<XF86AudioNext>", spawn "cmus next")
|
|
-- , ("<XF86AudioMute>", spawn "amixer set Master toggle") -- Bug prevents it from toggling correctly in 12.04.
|
|
, ("<XF86AudioLowerVolume>", spawn "amixer set Master 5%- unmute")
|
|
, ("<XF86AudioRaiseVolume>", spawn "amixer set Master 5%+ unmute")
|
|
, ("<XF86HomePage>", spawn "firefox")
|
|
, ("<XF86Search>", safeSpawn "firefox" ["https://www.google.com/"])
|
|
, ("<XF86Mail>", runOrRaise "geary" (resource =? "thunderbird"))
|
|
, ("<XF86Calculator>", runOrRaise "gcalctool" (resource =? "gcalctool"))
|
|
, ("<XF86Eject>", spawn "toggleeject")
|
|
, ("<Print>", spawn "scrotd 0")
|
|
]
|
|
-- Appending search engine prompts to keybindings list.
|
|
-- Look at "search engines" section of this config for values for "k".
|
|
++ [("M-s " ++ k, S.promptSearch dtXPConfig' f) | (k,f) <- searchList ]
|
|
++ [("M-S-s " ++ k, S.selectSearch f) | (k,f) <- searchList ]
|
|
-- Appending some extra xprompts to keybindings list.
|
|
-- Look at "xprompt settings" section this of config for values for "k".
|
|
++ [("M-p " ++ k, f dtXPConfig') | (k,f) <- promptList ]
|
|
++ [("M-p " ++ k, f dtXPConfig' g) | (k,f,g) <- promptList' ]
|
|
-- The following lines are needed for named scratchpads.
|
|
where nonNSP = WSIs (return (\ws -> W.tag ws /= "nsp"))
|
|
nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "nsp"))
|
|
|