blob: bf1f3f11649c040a67da44437220bbc8143d938b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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.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.Text as Text
import qualified Data.Text.Zipper as Z
import qualified Data.Text.Zipper as Zipper
import System.Process (callCommand)
leaveCmdline :: AppEvent ()
leaveCmdline = clearCmdline >> modify (\st -> st {stateFocusTarget = FocusMain})
enterCmdline :: AppEvent ()
enterCmdline = modify (\st -> st {stateFocusTarget = FocusCmdline})
setCmdlineText :: String -> AppEvent ()
setCmdlineText text =
applyCmdlineEdit (const $ Z.stringZipper [text] (Just 1))
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)
evaluateCommand cmd
leaveCmdline
where
trimCmd = dropWhile isSpace . dropWhileEnd isSpace . unlines
evaluateCommand :: String -> AppEvent ()
evaluateCommand ('!' : '!' : cmd) = do
cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd)
suspendAndResume' $ do
callCommand cmd'
putStrLn "Press any key to continue" >> void getChar
reloadDir
evaluateCommand ('!' : cmd) = do
cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd)
suspendAndResume' $ callCommand cmd'
reloadDir
evaluateCommand _cmd = pure ()
applyCmdlineEdit :: (Zipper.TextZipper String -> Zipper.TextZipper String) -> AppEvent ()
applyCmdlineEdit zipper = do
editor <- gets stateCmdlineEditor
let editor' = Editor.applyEdit zipper editor
modify (\s -> s {stateCmdlineEditor = editor'})
|