diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-03 11:56:27 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-03 12:05:52 +0530 |
| commit | f820f302130445d8b983ab89746f6de7443c0bea (patch) | |
| tree | a5e84324a897451c29a00cad410abd992bf0fe27 | |
| parent | 3eecc44479c3e3ce9dd1beecfeb794c8a541e00f (diff) | |
| download | daffm-f820f302130445d8b983ab89746f6de7443c0bea.tar.gz daffm-f820f302130445d8b983ab89746f6de7443c0bea.zip | |
Add %d substitution
Diffstat (limited to '')
| -rw-r--r-- | lib/Daffm/Event.hs | 42 | ||||
| -rw-r--r-- | lib/Daffm/Types.hs | 3 | ||||
| -rw-r--r-- | notes.org | 3 |
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 @@ -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 |
