diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-04 18:07:30 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-04 19:10:06 +0530 |
| commit | a302dfc2aabda53446fb38e035e61ae91b28f84a (patch) | |
| tree | 67ca03f33ebf31e198ac5a883100b96cc387f264 /lib/Daffm/Action/Cmdline.hs | |
| parent | b05be850349dbb813d2af6f3ee7a2fc3bf98b8ef (diff) | |
| download | daffm-a302dfc2aabda53446fb38e035e61ae91b28f84a.tar.gz daffm-a302dfc2aabda53446fb38e035e61ae91b28f84a.zip | |
Add multi-key handling + command parsing + shell/shell! aliases
Diffstat (limited to '')
| -rw-r--r-- | lib/Daffm/Action/Cmdline.hs | 62 |
1 files changed, 9 insertions, 53 deletions
diff --git a/lib/Daffm/Action/Cmdline.hs b/lib/Daffm/Action/Cmdline.hs index 12f7a9d..34e5e41 100644 --- a/lib/Daffm/Action/Cmdline.hs +++ b/lib/Daffm/Action/Cmdline.hs @@ -1,18 +1,18 @@ module Daffm.Action.Cmdline where -import Brick (suspendAndResume') import qualified Brick.Widgets.Edit as Editor -import qualified Brick.Widgets.List as L -import Control.Monad (unless, void) -import Control.Monad.State (get, gets, modify) -import Daffm.Action.Core (reloadDir) -import Daffm.Types (AppEvent, AppState (..), FileInfo (..), FocusTarget (..)) -import Data.Char (isSpace) -import qualified Data.Set as Set +import Control.Monad.State (gets, modify) +import qualified Control.Monad.State.Strict as StateStrict +import Daffm.Types +import Daffm.Utils (trimStart) import qualified Data.Text as Text import qualified Data.Text.Zipper as Z import qualified Data.Text.Zipper as Zipper -import System.Process (callCommand, callProcess) + +getCmdlineText :: AppEvent Text.Text +getCmdlineText = StateStrict.gets cmdtext + where + cmdtext = trimStart . Text.unlines . Editor.getEditContents . stateCmdlineEditor leaveCmdline :: AppEvent () leaveCmdline = clearCmdline >> modify (\st -> st {stateFocusTarget = FocusMain}) @@ -27,50 +27,6 @@ setCmdlineText text = clearCmdline :: AppEvent () clearCmdline = applyCmdlineEdit Z.clearZipper -runCmdline :: AppEvent () -runCmdline = do - cmd <- gets (trimCmd . Editor.getEditContents . stateCmdlineEditor) - evaluateCommand cmd - leaveCmdline - where - trimCmd = Text.dropWhile isSpace . Text.dropWhileEnd isSpace . Text.unlines - -evaluateCommand :: Text.Text -> AppEvent () -evaluateCommand (Text.splitAt 2 -> ("!!", cmd)) = do - cmd' <- Text.unpack <$> cmdSubstitutions cmd - suspendAndResume' $ do - callCommand cmd' - putStrLn "Press any key to continue" >> void getChar - reloadDir -evaluateCommand (Text.splitAt 1 -> ("!", cmd)) = do - cmd' <- Text.unpack <$> cmdSubstitutions cmd - suspendAndResume' $ callCommand cmd' - reloadDir -evaluateCommand "delete" = do - (AppState {stateFileSelections, stateFiles}) <- get - let files = - if Set.null stateFileSelections - then maybe [] ((: []) . filePath . snd) $ L.listSelectedElement stateFiles - else Set.elems stateFileSelections - unless (null files) $ do - suspendAndResume' $ callProcess "rm" ("-rfi" : map Text.unpack files) - reloadDir -evaluateCommand _cmd = pure () - -cmdSubstitutions :: Text.Text -> AppEvent Text.Text -cmdSubstitutions cmd = do - (AppState {stateFiles, stateCwd, stateFileSelections}) <- get - let file = maybe "" (filePath . snd) . L.listSelectedElement $ stateFiles - let escape = (\s -> "'" <> s <> "'") . Text.replace "'" "\\'" - let selections = Set.elems stateFileSelections - -- TODO: Escaping % - let subst = - Text.replace "%" file - . Text.replace "%d" stateCwd - . Text.replace "%s" (Text.unwords $ map escape selections) - . Text.replace "%S" (Text.dropWhileEnd (== '\n') $ Text.unlines selections) - pure . subst $ cmd - applyCmdlineEdit :: (Zipper.TextZipper Text.Text -> Zipper.TextZipper Text.Text) -> AppEvent () applyCmdlineEdit zipper = do editor <- gets stateCmdlineEditor |
