aboutsummaryrefslogtreecommitdiff
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
parent3eecc44479c3e3ce9dd1beecfeb794c8a541e00f (diff)
downloaddaffm-f820f302130445d8b983ab89746f6de7443c0bea.tar.gz
daffm-f820f302130445d8b983ab89746f6de7443c0bea.zip
Add %d substitution
-rw-r--r--lib/Daffm/Event.hs42
-rw-r--r--lib/Daffm/Types.hs3
-rw-r--r--notes.org3
3 files changed, 32 insertions, 16 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
diff --git a/lib/Daffm/Types.hs b/lib/Daffm/Types.hs
index aaf6083..fa9796a 100644
--- a/lib/Daffm/Types.hs
+++ b/lib/Daffm/Types.hs
@@ -1,5 +1,6 @@
module Daffm.Types where
+import Brick (EventM)
import qualified Brick.Widgets.Edit as Editor
import qualified Brick.Widgets.List as L
import qualified Data.Map as Map
@@ -35,3 +36,5 @@ data AppState = AppState
stateParentDir :: FilePath
}
deriving (Show)
+
+type AppEvent = EventM FocusTarget AppState
diff --git a/notes.org b/notes.org
index f504656..fc04398 100644
--- a/notes.org
+++ b/notes.org
@@ -5,8 +5,9 @@
- [ ] Commands
- [X] Run shell command
- [X] Command substitution %
-- [ ] Command substitution %d:cwd
+- [X] Command substitution %d:cwd
- [ ] Show file permissions
+- [ ] Error handling
** Later
- [ ] handle on open (for external integrations)
- [ ] Cmdline history