diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-03 20:21:31 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-03 21:10:34 +0530 |
| commit | b1f56e140e6166c06a5b1f0a02aa4bc0953d6eb3 (patch) | |
| tree | 0be94058cb050c1571e0d21f806433def5d3ad49 /lib/Daffm/Action/Cmdline.hs | |
| parent | 4d669ba5d5858e47b8d5723aae89b75481a2df2f (diff) | |
| download | daffm-b1f56e140e6166c06a5b1f0a02aa4bc0953d6eb3.tar.gz daffm-b1f56e140e6166c06a5b1f0a02aa4bc0953d6eb3.zip | |
Add delete command + minor refactors
Diffstat (limited to '')
| -rw-r--r-- | lib/Daffm/Action/Cmdline.hs | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/lib/Daffm/Action/Cmdline.hs b/lib/Daffm/Action/Cmdline.hs index bf1f3f1..64977aa 100644 --- a/lib/Daffm/Action/Cmdline.hs +++ b/lib/Daffm/Action/Cmdline.hs @@ -3,16 +3,17 @@ 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 (void) +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 Data.List (dropWhileEnd) +import qualified Data.Set as Set import qualified Data.Text as Text import qualified Data.Text.Zipper as Z import qualified Data.Text.Zipper as Zipper -import System.Process (callCommand) +import System.Process (callCommand, callProcess) leaveCmdline :: AppEvent () leaveCmdline = clearCmdline >> modify (\st -> st {stateFocusTarget = FocusMain}) @@ -27,16 +28,6 @@ setCmdlineText text = clearCmdline :: AppEvent () clearCmdline = applyCmdlineEdit Z.clearZipper -cmdSubstitutions :: Text.Text -> AppEvent Text.Text -cmdSubstitutions cmd = do - (AppState {stateFiles, stateCwd}) <- get - let file = maybe "" (filePath . snd) . L.listSelectedElement $ stateFiles - -- TODO: Escaping % - let subst = - Text.replace "%" (Text.pack file) - . Text.replace "%d" (Text.pack stateCwd) - pure . subst $ cmd - runCmdline :: AppEvent () runCmdline = do cmd <- gets (trimCmd . Editor.getEditContents . stateCmdlineEditor) @@ -56,8 +47,30 @@ evaluateCommand ('!' : cmd) = do cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack 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" : 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 = Text.unwords . map (escape . Text.pack) $ Set.elems stateFileSelections + -- TODO: Escaping % + let subst = + Text.replace "%" (Text.pack file) + . Text.replace "%d" (Text.pack stateCwd) + . Text.replace "%s" selections + pure . subst $ cmd + applyCmdlineEdit :: (Zipper.TextZipper String -> Zipper.TextZipper String) -> AppEvent () applyCmdlineEdit zipper = do editor <- gets stateCmdlineEditor |
