mirror of
https://gitlab.com/dwt1/dotfiles.git
synced 2026-04-22 11:00:27 +10:00
160 lines
6.5 KiB
Haskell
160 lines
6.5 KiB
Haskell
module Custom.MyPrompts where
|
|
|
|
-- imports
|
|
import XMonad
|
|
import Control.Arrow (first)
|
|
import Custom.MyVariables
|
|
import Data.Char (isSpace)
|
|
import XMonad.Prompt
|
|
import XMonad.Prompt.Input
|
|
import XMonad.Prompt.FuzzyMatch
|
|
import XMonad.Prompt.Man
|
|
import XMonad.Prompt.Pass
|
|
import XMonad.Prompt.Shell (shellPrompt)
|
|
import XMonad.Prompt.Ssh
|
|
import XMonad.Prompt.XMonad
|
|
import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe)
|
|
import qualified Data.Map as M
|
|
import qualified XMonad.Actions.Search as S
|
|
import qualified XMonad.StackSet as W
|
|
|
|
------------------------------------------------------------------------
|
|
-- XPROMPT SETTINGS
|
|
------------------------------------------------------------------------
|
|
dtXPConfig :: XPConfig
|
|
dtXPConfig = def
|
|
{ font = myFont
|
|
, bgColor = "#292d3e"
|
|
, fgColor = "#d0d0d0"
|
|
, bgHLight = "#c792ea"
|
|
, fgHLight = "#000000"
|
|
, borderColor = "#535974"
|
|
, promptBorderWidth = 0
|
|
, promptKeymap = dtXPKeymap
|
|
, position = Top
|
|
-- , position = CenteredAt { xpCenterY = 0.3, xpWidth = 0.3 }
|
|
, height = 20
|
|
, historySize = 256
|
|
, historyFilter = id
|
|
, defaultText = []
|
|
, autoComplete = Just 100000 -- set Just 100000 for .1 sec
|
|
, showCompletionOnTab = False
|
|
-- , searchPredicate = isPrefixOf
|
|
, searchPredicate = fuzzyMatch
|
|
, alwaysHighlight = True
|
|
, maxComplRows = Nothing -- set to Just 5 for 5 rows
|
|
}
|
|
|
|
-- The same config above minus the autocomplete feature which is annoying
|
|
-- on certain Xprompts, like the search engine prompts.
|
|
dtXPConfig' :: XPConfig
|
|
dtXPConfig' = dtXPConfig
|
|
{ autoComplete = Nothing
|
|
}
|
|
|
|
-- A list of all of the standard Xmonad prompts and a key press assigned to them.
|
|
-- These are used in conjunction with keybinding I set later in the config.
|
|
promptList :: [(String, XPConfig -> X ())]
|
|
promptList = [ ("m", manPrompt) -- manpages prompt
|
|
, ("p", passPrompt) -- get passwords (requires 'pass')
|
|
, ("g", passGeneratePrompt) -- generate passwords (requires 'pass')
|
|
, ("r", passRemovePrompt) -- remove passwords (requires 'pass')
|
|
, ("s", sshPrompt) -- ssh prompt
|
|
, ("x", xmonadPrompt) -- xmonad prompt
|
|
]
|
|
|
|
-- Same as the above list except this is for my custom prompts.
|
|
promptList' :: [(String, XPConfig -> String -> X (), String)]
|
|
promptList' = [ ("c", calcPrompt, "qalc") -- requires qalculate-gtk
|
|
]
|
|
|
|
------------------------------------------------------------------------
|
|
-- CUSTOM PROMPTS
|
|
------------------------------------------------------------------------
|
|
-- calcPrompt requires a cli calculator called qalcualte-gtk.
|
|
-- You could use this as a template for other custom prompts that
|
|
-- use command line programs that return a single line of output.
|
|
calcPrompt :: XPConfig -> String -> X ()
|
|
calcPrompt c ans =
|
|
inputPrompt c (trim ans) ?+ \input ->
|
|
liftIO(runProcessWithInput "qalc" [input] "") >>= calcPrompt c
|
|
where
|
|
trim = f . f
|
|
where f = reverse . dropWhile isSpace
|
|
|
|
------------------------------------------------------------------------
|
|
-- XPROMPT KEYMAP (emacs-like key bindings for xprompts)
|
|
------------------------------------------------------------------------
|
|
dtXPKeymap :: M.Map (KeyMask,KeySym) (XP ())
|
|
dtXPKeymap = M.fromList $
|
|
map (first $ (,) controlMask) -- control + <key>
|
|
[ (xK_z, killBefore) -- kill line backwards
|
|
, (xK_k, killAfter) -- kill line forwards
|
|
, (xK_a, startOfLine) -- move to the beginning of the line
|
|
, (xK_e, endOfLine) -- move to the end of the line
|
|
, (xK_m, deleteString Next) -- delete a character foward
|
|
, (xK_b, moveCursor Prev) -- move cursor forward
|
|
, (xK_f, moveCursor Next) -- move cursor backward
|
|
, (xK_BackSpace, killWord Prev) -- kill the previous word
|
|
, (xK_y, pasteString) -- paste a string
|
|
, (xK_g, quit) -- quit out of prompt
|
|
, (xK_bracketleft, quit)
|
|
]
|
|
++
|
|
map (first $ (,) altMask) -- meta key + <key>
|
|
[ (xK_BackSpace, killWord Prev) -- kill the prev word
|
|
, (xK_f, moveWord Next) -- move a word forward
|
|
, (xK_b, moveWord Prev) -- move a word backward
|
|
, (xK_d, killWord Next) -- kill the next word
|
|
, (xK_n, moveHistory W.focusUp') -- move up thru history
|
|
, (xK_p, moveHistory W.focusDown') -- move down thru history
|
|
]
|
|
++
|
|
map (first $ (,) 0) -- <key>
|
|
[ (xK_Return, setSuccess True >> setDone True)
|
|
, (xK_KP_Enter, setSuccess True >> setDone True)
|
|
, (xK_BackSpace, deleteString Prev)
|
|
, (xK_Delete, deleteString Next)
|
|
, (xK_Left, moveCursor Prev)
|
|
, (xK_Right, moveCursor Next)
|
|
, (xK_Home, startOfLine)
|
|
, (xK_End, endOfLine)
|
|
, (xK_Down, moveHistory W.focusUp')
|
|
, (xK_Up, moveHistory W.focusDown')
|
|
, (xK_Escape, quit)
|
|
]
|
|
|
|
------------------------------------------------------------------------
|
|
-- SEARCH ENGINES
|
|
------------------------------------------------------------------------
|
|
-- Xmonad has several search engines available to use located in
|
|
-- XMonad.Actions.Search. Additionally, you can add other search engines
|
|
-- such as those listed below.
|
|
archwiki, ebay, news, reddit, urban :: S.SearchEngine
|
|
|
|
archwiki = S.searchEngine "archwiki" "https://wiki.archlinux.org/index.php?search="
|
|
ebay = S.searchEngine "ebay" "https://www.ebay.com/sch/i.html?_nkw="
|
|
news = S.searchEngine "news" "https://news.google.com/search?q="
|
|
reddit = S.searchEngine "reddit" "https://www.reddit.com/search/?q="
|
|
urban = S.searchEngine "urban" "https://www.urbandictionary.com/define.php?term="
|
|
|
|
-- This is the list of search engines that I want to use. Some are from
|
|
-- XMonad.Actions.Search, and some are the ones that I added above.
|
|
searchList :: [(String, S.SearchEngine)]
|
|
searchList = [ ("a", archwiki)
|
|
, ("d", S.duckduckgo)
|
|
, ("e", ebay)
|
|
, ("g", S.google)
|
|
, ("h", S.hoogle)
|
|
, ("i", S.images)
|
|
, ("n", news)
|
|
, ("r", reddit)
|
|
, ("s", S.stackage)
|
|
, ("t", S.thesaurus)
|
|
, ("v", S.vocabulary)
|
|
, ("b", S.wayback)
|
|
, ("u", urban)
|
|
, ("w", S.wikipedia)
|
|
, ("y", S.youtube)
|
|
, ("z", S.amazon)
|
|
] |