diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-03 11:48:13 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-03 11:49:30 +0530 |
| commit | 3eecc44479c3e3ce9dd1beecfeb794c8a541e00f (patch) | |
| tree | b6618a239329ac6f9f811eedc134d131c3f5a115 /lib | |
| parent | 2d0abaeb779ef63ed59de136e55c63ed2fd0a4ba (diff) | |
| download | daffm-3eecc44479c3e3ce9dd1beecfeb794c8a541e00f.tar.gz daffm-3eecc44479c3e3ce9dd1beecfeb794c8a541e00f.zip | |
Add run shell command via cmdline + selected file substitution
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Daffm/Event.hs | 43 | ||||
| -rw-r--r-- | lib/Daffm/State.hs | 2 |
2 files changed, 40 insertions, 5 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 diff --git a/lib/Daffm/State.hs b/lib/Daffm/State.hs index cfa9aeb..13fb613 100644 --- a/lib/Daffm/State.hs +++ b/lib/Daffm/State.hs @@ -17,7 +17,7 @@ mkEmptyAppState :: AppState mkEmptyAppState = AppState { stateFiles = L.list FocusMain (Vec.fromList []) 1, - stateCmdlineEditor = Editor.editor FocusCmdline Nothing "", + stateCmdlineEditor = Editor.editor FocusCmdline (Just 1) "", stateFocusTarget = FocusMain, stateListPositionCache = Map.empty, stateCwd = "", |
