aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Action/Cmdline.hs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/Daffm/Action/Cmdline.hs37
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