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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
module Daffm.Types where
import Brick (EventM)
import qualified Brick.Widgets.Edit as Editor
import qualified Brick.Widgets.List as L
import Control.Applicative ((<|>))
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
import qualified Graphics.Vty as K
import qualified Graphics.Vty as V
import System.Posix.Types (FileMode, FileOffset)
data FileType
= RegularFile
| BlockDevice
| CharacterDevice
| NamedPipe
| Directory
| SymbolicLink
| UnixSocket
| UnknownFileType
deriving (Show)
type FilePathText = Text.Text
data FileInfo = FileInfo
{ fileName :: Text.Text,
filePath :: FilePathText,
fileSize :: FileOffset,
fileMode :: FileMode,
fileType :: FileType
}
deriving (Show)
data FocusTarget = FocusCmdline | FocusMain deriving (Show, Eq, Ord)
data AppState = AppState
{ stateCmdlineEditor :: CmdlineEditor,
stateCwd :: FilePathText,
stateFileSelections :: Set.Set FilePathText,
stateFiles :: L.List FocusTarget FileInfo,
stateFocusTarget :: FocusTarget,
stateKeyMap :: Keymap,
stateKeySequence :: KeySequence,
stateListPositionHistory :: Map.Map Text.Text Int,
stateOpenerScript :: Maybe Text.Text
}
deriving (Show)
type AppEvent = EventM FocusTarget AppState
type CmdlineEditor = Editor.Editor Text.Text FocusTarget
data KeyMatchResult = MatchSuccess Command | MatchPartial | MatchFailure
deriving (Show, Eq)
data Command
= CmdShell Bool Text.Text
| CmdCommandShell Text.Text
| CmdQuit
| CmdSetCmdline Text.Text
| CmdEnterCmdline
| CmdLeaveCmdline
| CmdOpenSelection
| CmdChangeDir Text.Text
| CmdReload
| CmdToggleSelection
| CmdClearSelection
| CmdGoBack
| CmdChain [Command]
| CmdNoop
deriving (Show, Eq)
type Key = V.Key
type Keymap = Map.Map [Key] Command
type KeySequence = [Key]
data Configuration = Configuration
{ configKeymap :: !Keymap,
configOpener :: !(Maybe Text.Text),
configExtend :: !(Maybe Text.Text),
configTheme :: !(Map.Map Text.Text Text.Text)
}
deriving (Show)
instance Semigroup Configuration where
a <> b =
a
{ configKeymap = configKeymap a <> configKeymap b,
configOpener = configOpener a <|> configOpener b,
configTheme = configTheme a <> configTheme b
}
defaultConfiguration :: Configuration
defaultConfiguration =
Configuration
{ configKeymap = defaultKeymaps,
configOpener = Nothing,
configTheme = Map.empty,
configExtend = Nothing
}
defaultKeymaps :: Keymap
defaultKeymaps =
Map.fromList
[ ([K.KChar 'q'], CmdQuit),
([K.KChar 'r', K.KChar 'r'], CmdReload),
([K.KChar '!'], CmdSetCmdline "!"),
([K.KChar ':'], CmdEnterCmdline),
([K.KChar 'l'], CmdOpenSelection),
([K.KChar 'h'], CmdGoBack),
([K.KEnter], CmdOpenSelection),
([K.KBS], CmdGoBack),
([K.KChar 'v'], CmdToggleSelection),
([K.KChar '\t'], CmdToggleSelection),
([K.KChar 'C'], CmdClearSelection),
([K.KChar '~'], CmdChangeDir "~"),
([K.KChar '$'], CmdShell False "$SHELL"),
([K.KChar 'g', K.KChar 'x'], CmdShell False "!xdg-open % >/dev/null 2>&1"),
([K.KChar 'g', K.KChar 'h'], CmdChangeDir "~"),
([K.KChar 'g', K.KChar 'c', K.KChar 'f', K.KChar 'g'], CmdChangeDir "~/.config/daffm")
]
|