aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Event.hs
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-10-03 11:56:27 +0530
committerAkshay Nair <phenax5@gmail.com>2025-10-03 12:05:52 +0530
commitf820f302130445d8b983ab89746f6de7443c0bea (patch)
treea5e84324a897451c29a00cad410abd992bf0fe27 /lib/Daffm/Event.hs
parent3eecc44479c3e3ce9dd1beecfeb794c8a541e00f (diff)
downloaddaffm-f820f302130445d8b983ab89746f6de7443c0bea.tar.gz
daffm-f820f302130445d8b983ab89746f6de7443c0bea.zip
Add %d substitution
Diffstat (limited to 'lib/Daffm/Event.hs')
-rw-r--r--lib/Daffm/Event.hs42
1 files changed, 27 insertions, 15 deletions
diff --git a/lib/Daffm/Event.hs b/lib/Daffm/Event.hs
index b9e7398..96cbe0d 100644
--- a/lib/Daffm/Event.hs
+++ b/lib/Daffm/Event.hs
@@ -7,19 +7,17 @@ import qualified Brick.Widgets.Edit as Editor
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 Daffm.Types (AppEvent, AppState (..), FileInfo (..), FileType (..), FocusTarget (..))
import Data.Char (isSpace)
import Data.List (dropWhileEnd)
-import Data.Maybe (fromMaybe)
import qualified Data.Text as Text
+import Data.Text.Array (run)
import qualified Data.Text.Zipper as Z
import Data.Vector ((!?))
import qualified Graphics.Vty as V
import System.FilePath (takeDirectory)
import System.Process (callCommand, callProcess)
-type AppEvent = T.EventM FocusTarget AppState
-
modifyM :: (MonadState s m) => (s -> m s) -> m ()
modifyM f = get >>= f >>= put
@@ -31,20 +29,15 @@ appEvent brickevent@(T.VtyEvent event) = do
(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 ':') []) -> enterCmdline
(FocusMain, V.EvKey (V.KChar 'q') []) -> M.halt
(FocusMain, V.EvKey (V.KChar 'r') [V.MCtrl]) -> reloadDir
+ (FocusCmdline, V.EvKey V.KEsc []) -> leaveCmdline
+ (FocusCmdline, V.EvKey V.KEnter []) -> runCmdline
(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)
@@ -52,17 +45,36 @@ appEvent brickevent@(T.VtyEvent event) = do
modify cacheDirPosition
appEvent _ = pure ()
+leaveCmdline :: AppEvent ()
+leaveCmdline = clearEditor >> modify (\st -> st {stateFocusTarget = FocusMain})
+
+enterCmdline :: AppEvent ()
+enterCmdline = modify (\st -> st {stateFocusTarget = FocusCmdline})
+
cmdSubstitutions :: Text.Text -> AppEvent Text.Text
cmdSubstitutions cmd = do
- file <- gets (maybe "" (filePath . snd) . L.listSelectedElement . stateFiles)
- pure $ Text.replace "%" (Text.pack file) cmd
+ appState <- get
+ let file = maybe "" (filePath . snd) . L.listSelectedElement . stateFiles $ appState
+ -- TODO: Escaping %
+ let subst =
+ Text.replace "%" (Text.pack file)
+ . Text.replace "%d" (Text.pack $ stateCwd appState)
+ pure . subst $ cmd
+
+runCmdline :: AppEvent ()
+runCmdline = do
+ cmd <- gets (trimCmd . Editor.getEditContents . stateCmdlineEditor)
+ evaluateCommand cmd
+ leaveCmdline
+ where
+ trimCmd = dropWhile isSpace . dropWhileEnd isSpace . unlines
evaluateCommand :: String -> AppEvent ()
evaluateCommand ('!' : cmd) = do
cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd)
suspendAndResume' $ callCommand cmd'
reloadDir
-evaluateCommand cmd = pure ()
+evaluateCommand _cmd = pure ()
clearEditor :: AppEvent ()
clearEditor = do