aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-10-03 11:48:13 +0530
committerAkshay Nair <phenax5@gmail.com>2025-10-03 11:49:30 +0530
commit3eecc44479c3e3ce9dd1beecfeb794c8a541e00f (patch)
treeb6618a239329ac6f9f811eedc134d131c3f5a115 /lib
parent2d0abaeb779ef63ed59de136e55c63ed2fd0a4ba (diff)
downloaddaffm-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.hs43
-rw-r--r--lib/Daffm/State.hs2
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 = "",