diff options
Diffstat (limited to 'lib/Daffm/Event.hs')
| -rw-r--r-- | lib/Daffm/Event.hs | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/lib/Daffm/Event.hs b/lib/Daffm/Event.hs index f14ebd8..b9e7398 100644 --- a/lib/Daffm/Event.hs +++ b/lib/Daffm/Event.hs @@ -8,10 +8,15 @@ import qualified Brick.Widgets.List as L import Control.Monad.State (MonadIO (liftIO), MonadState, get, gets, modify, put) import Daffm.State (cacheDirPosition, loadDirInAppState) import Daffm.Types (AppState (..), FileInfo (..), FileType (..), FocusTarget (FocusCmdline, FocusMain)) +import Data.Char (isSpace) +import Data.List (dropWhileEnd) +import Data.Maybe (fromMaybe) +import qualified Data.Text as Text +import qualified Data.Text.Zipper as Z import Data.Vector ((!?)) import qualified Graphics.Vty as V import System.FilePath (takeDirectory) -import System.Process (callProcess) +import System.Process (callCommand, callProcess) type AppEvent = T.EventM FocusTarget AppState @@ -22,17 +27,24 @@ appEvent :: T.BrickEvent FocusTarget e -> AppEvent () appEvent brickevent@(T.VtyEvent event) = do focusTarget <- gets stateFocusTarget case (focusTarget, event) of - (FocusCmdline, V.EvKey V.KEsc []) -> modify (\st -> st {stateFocusTarget = FocusMain}) - (FocusMain, V.EvKey (V.KChar ':') []) -> modify (\st -> st {stateFocusTarget = FocusCmdline}) - (FocusMain, V.EvKey (V.KChar 'q') []) -> M.halt (FocusMain, V.EvKey (V.KChar 'l') []) -> openSelectedFile (FocusMain, V.EvKey (V.KChar 'h') []) -> goBackToParentDir (FocusMain, V.EvKey V.KEnter []) -> openSelectedFile (FocusMain, V.EvKey V.KBS []) -> goBackToParentDir + (FocusMain, V.EvKey (V.KChar ':') []) -> modify (\st -> st {stateFocusTarget = FocusCmdline}) + (FocusMain, V.EvKey (V.KChar 'q') []) -> M.halt + (FocusMain, V.EvKey (V.KChar 'r') [V.MCtrl]) -> reloadDir (FocusMain, _) -> do files <- gets stateFiles newFiles <- T.nestEventM' files (L.handleListEventVi L.handleListEvent event) modify (\appState -> appState {stateFiles = newFiles}) + (FocusCmdline, V.EvKey V.KEsc []) -> modify (\st -> st {stateFocusTarget = FocusMain}) + (FocusCmdline, V.EvKey V.KEnter []) -> do + gets (trimCmd . Editor.getEditContents . stateCmdlineEditor) >>= evaluateCommand + clearEditor + modify (\st -> st {stateFocusTarget = FocusMain}) + where + trimCmd = dropWhile isSpace . dropWhileEnd isSpace . unlines (FocusCmdline, _) -> do editor <- gets stateCmdlineEditor newEditor <- T.nestEventM' editor (Editor.handleEditorEvent brickevent) @@ -40,6 +52,29 @@ appEvent brickevent@(T.VtyEvent event) = do modify cacheDirPosition appEvent _ = pure () +cmdSubstitutions :: Text.Text -> AppEvent Text.Text +cmdSubstitutions cmd = do + file <- gets (maybe "" (filePath . snd) . L.listSelectedElement . stateFiles) + pure $ Text.replace "%" (Text.pack file) cmd + +evaluateCommand :: String -> AppEvent () +evaluateCommand ('!' : cmd) = do + cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd) + suspendAndResume' $ callCommand cmd' + reloadDir +evaluateCommand cmd = pure () + +clearEditor :: AppEvent () +clearEditor = do + editor <- gets stateCmdlineEditor + let editor' = Editor.applyEdit Z.clearZipper editor + modify (\s -> s {stateCmdlineEditor = editor'}) + +reloadDir :: AppEvent () +reloadDir = do + AppState {stateParentDir, stateCwd} <- get + modifyM (liftIO . loadDirInAppState stateCwd stateParentDir) + openSelectedFile :: AppEvent () openSelectedFile = do AppState {stateFiles, stateCwd} <- get |
