1package main
2
3import "time"
4
5type sortMethod byte
6
7const (
8	naturalSort sortMethod = iota
9	nameSort
10	sizeSort
11	timeSort
12	atimeSort
13	ctimeSort
14	extSort
15)
16
17type sortOption byte
18
19const (
20	dirfirstSort sortOption = 1 << iota
21	hiddenSort
22	reverseSort
23)
24
25type sortType struct {
26	method sortMethod
27	option sortOption
28}
29
30var gOpts struct {
31	anchorfind     bool
32	autoquit       bool
33	dircache       bool
34	dircounts      bool
35	dironly        bool
36	drawbox        bool
37	globsearch     bool
38	icons          bool
39	ignorecase     bool
40	ignoredia      bool
41	incfilter      bool
42	incsearch      bool
43	mouse          bool
44	number         bool
45	preview        bool
46	relativenumber bool
47	smartcase      bool
48	smartdia       bool
49	waitmsg        string
50	wrapscan       bool
51	wrapscroll     bool
52	findlen        int
53	period         int
54	scrolloff      int
55	tabstop        int
56	errorfmt       string
57	filesep        string
58	ifs            string
59	previewer      string
60	cleaner        string
61	promptfmt      string
62	shell          string
63	shellflag      string
64	timefmt        string
65	truncatechar   string
66	ratios         []int
67	hiddenfiles    []string
68	info           []string
69	shellopts      []string
70	keys           map[string]expr
71	cmdkeys        map[string]expr
72	cmds           map[string]expr
73	sortType       sortType
74}
75
76func init() {
77	gOpts.anchorfind = true
78	gOpts.autoquit = false
79	gOpts.dircache = true
80	gOpts.dircounts = false
81	gOpts.dironly = false
82	gOpts.drawbox = false
83	gOpts.globsearch = false
84	gOpts.icons = false
85	gOpts.ignorecase = true
86	gOpts.ignoredia = true
87	gOpts.incfilter = false
88	gOpts.incsearch = false
89	gOpts.mouse = false
90	gOpts.number = false
91	gOpts.preview = true
92	gOpts.relativenumber = false
93	gOpts.smartcase = true
94	gOpts.smartdia = false
95	gOpts.waitmsg = "Press any key to continue"
96	gOpts.wrapscan = true
97	gOpts.wrapscroll = false
98	gOpts.findlen = 1
99	gOpts.period = 0
100	gOpts.scrolloff = 0
101	gOpts.tabstop = 8
102	gOpts.errorfmt = "\033[7;31;47m%s\033[0m"
103	gOpts.filesep = "\n"
104	gOpts.ifs = ""
105	gOpts.previewer = ""
106	gOpts.cleaner = ""
107	gOpts.promptfmt = "\033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"
108	gOpts.shell = gDefaultShell
109	gOpts.shellflag = gDefaultShellFlag
110	gOpts.timefmt = time.ANSIC
111	gOpts.truncatechar = "~"
112	gOpts.ratios = []int{1, 2, 3}
113	gOpts.hiddenfiles = []string{".*"}
114	gOpts.info = nil
115	gOpts.shellopts = nil
116	gOpts.sortType = sortType{naturalSort, dirfirstSort}
117
118	gOpts.keys = make(map[string]expr)
119
120	gOpts.keys["k"] = &callExpr{"up", nil, 1}
121	gOpts.keys["<up>"] = &callExpr{"up", nil, 1}
122	gOpts.keys["<c-u>"] = &callExpr{"half-up", nil, 1}
123	gOpts.keys["<c-b>"] = &callExpr{"page-up", nil, 1}
124	gOpts.keys["<pgup>"] = &callExpr{"page-up", nil, 1}
125	gOpts.keys["j"] = &callExpr{"down", nil, 1}
126	gOpts.keys["<down>"] = &callExpr{"down", nil, 1}
127	gOpts.keys["<c-d>"] = &callExpr{"half-down", nil, 1}
128	gOpts.keys["<c-f>"] = &callExpr{"page-down", nil, 1}
129	gOpts.keys["<pgdn>"] = &callExpr{"page-down", nil, 1}
130	gOpts.keys["h"] = &callExpr{"updir", nil, 1}
131	gOpts.keys["<left>"] = &callExpr{"updir", nil, 1}
132	gOpts.keys["l"] = &callExpr{"open", nil, 1}
133	gOpts.keys["<right>"] = &callExpr{"open", nil, 1}
134	gOpts.keys["q"] = &callExpr{"quit", nil, 1}
135	gOpts.keys["gg"] = &callExpr{"top", nil, 1}
136	gOpts.keys["<home>"] = &callExpr{"top", nil, 1}
137	gOpts.keys["G"] = &callExpr{"bottom", nil, 1}
138	gOpts.keys["<end>"] = &callExpr{"bottom", nil, 1}
139	gOpts.keys["<space>"] = &listExpr{[]expr{&callExpr{"toggle", nil, 1}, &callExpr{"down", nil, 1}}, 1}
140	gOpts.keys["v"] = &callExpr{"invert", nil, 1}
141	gOpts.keys["u"] = &callExpr{"unselect", nil, 1}
142	gOpts.keys["y"] = &callExpr{"copy", nil, 1}
143	gOpts.keys["d"] = &callExpr{"cut", nil, 1}
144	gOpts.keys["c"] = &callExpr{"clear", nil, 1}
145	gOpts.keys["p"] = &callExpr{"paste", nil, 1}
146	gOpts.keys["<c-l>"] = &callExpr{"redraw", nil, 1}
147	gOpts.keys["<c-r>"] = &callExpr{"reload", nil, 1}
148	gOpts.keys[":"] = &callExpr{"read", nil, 1}
149	gOpts.keys["$"] = &callExpr{"shell", nil, 1}
150	gOpts.keys["%"] = &callExpr{"shell-pipe", nil, 1}
151	gOpts.keys["!"] = &callExpr{"shell-wait", nil, 1}
152	gOpts.keys["&"] = &callExpr{"shell-async", nil, 1}
153	gOpts.keys["f"] = &callExpr{"find", nil, 1}
154	gOpts.keys["F"] = &callExpr{"find-back", nil, 1}
155	gOpts.keys[";"] = &callExpr{"find-next", nil, 1}
156	gOpts.keys[","] = &callExpr{"find-prev", nil, 1}
157	gOpts.keys["/"] = &callExpr{"search", nil, 1}
158	gOpts.keys["?"] = &callExpr{"search-back", nil, 1}
159	gOpts.keys["n"] = &callExpr{"search-next", nil, 1}
160	gOpts.keys["N"] = &callExpr{"search-prev", nil, 1}
161	gOpts.keys["m"] = &callExpr{"mark-save", nil, 1}
162	gOpts.keys["'"] = &callExpr{"mark-load", nil, 1}
163	gOpts.keys[`"`] = &callExpr{"mark-remove", nil, 1}
164	gOpts.keys[`r`] = &callExpr{"rename", nil, 1}
165	gOpts.keys["<c-n>"] = &callExpr{"cmd-history-next", nil, 1}
166	gOpts.keys["<c-p>"] = &callExpr{"cmd-history-prev", nil, 1}
167
168	gOpts.keys["zh"] = &setExpr{"hidden!", ""}
169	gOpts.keys["zr"] = &setExpr{"reverse!", ""}
170	gOpts.keys["zn"] = &setExpr{"info", ""}
171	gOpts.keys["zs"] = &setExpr{"info", "size"}
172	gOpts.keys["zt"] = &setExpr{"info", "time"}
173	gOpts.keys["za"] = &setExpr{"info", "size:time"}
174	gOpts.keys["sn"] = &listExpr{[]expr{&setExpr{"sortby", "natural"}, &setExpr{"info", ""}}, 1}
175	gOpts.keys["ss"] = &listExpr{[]expr{&setExpr{"sortby", "size"}, &setExpr{"info", "size"}}, 1}
176	gOpts.keys["st"] = &listExpr{[]expr{&setExpr{"sortby", "time"}, &setExpr{"info", "time"}}, 1}
177	gOpts.keys["sa"] = &listExpr{[]expr{&setExpr{"sortby", "atime"}, &setExpr{"info", "atime"}}, 1}
178	gOpts.keys["sc"] = &listExpr{[]expr{&setExpr{"sortby", "ctime"}, &setExpr{"info", "ctime"}}, 1}
179	gOpts.keys["se"] = &listExpr{[]expr{&setExpr{"sortby", "ext"}, &setExpr{"info", ""}}, 1}
180	gOpts.keys["gh"] = &callExpr{"cd", []string{"~"}, 1}
181
182	gOpts.cmdkeys = make(map[string]expr)
183
184	gOpts.cmdkeys["<space>"] = &callExpr{"cmd-insert", []string{" "}, 1}
185	gOpts.cmdkeys["<esc>"] = &callExpr{"cmd-escape", nil, 1}
186	gOpts.cmdkeys["<tab>"] = &callExpr{"cmd-complete", nil, 1}
187	gOpts.cmdkeys["<enter>"] = &callExpr{"cmd-enter", nil, 1}
188	gOpts.cmdkeys["<c-j>"] = &callExpr{"cmd-enter", nil, 1}
189	gOpts.cmdkeys["<c-n>"] = &callExpr{"cmd-history-next", nil, 1}
190	gOpts.cmdkeys["<c-p>"] = &callExpr{"cmd-history-prev", nil, 1}
191	gOpts.cmdkeys["<delete>"] = &callExpr{"cmd-delete", nil, 1}
192	gOpts.cmdkeys["<c-d>"] = &callExpr{"cmd-delete", nil, 1}
193	gOpts.cmdkeys["<backspace>"] = &callExpr{"cmd-delete-back", nil, 1}
194	gOpts.cmdkeys["<backspace2>"] = &callExpr{"cmd-delete-back", nil, 1}
195	gOpts.cmdkeys["<left>"] = &callExpr{"cmd-left", nil, 1}
196	gOpts.cmdkeys["<c-b>"] = &callExpr{"cmd-left", nil, 1}
197	gOpts.cmdkeys["<right>"] = &callExpr{"cmd-right", nil, 1}
198	gOpts.cmdkeys["<c-f>"] = &callExpr{"cmd-right", nil, 1}
199	gOpts.cmdkeys["<home>"] = &callExpr{"cmd-home", nil, 1}
200	gOpts.cmdkeys["<c-a>"] = &callExpr{"cmd-home", nil, 1}
201	gOpts.cmdkeys["<end>"] = &callExpr{"cmd-end", nil, 1}
202	gOpts.cmdkeys["<c-e>"] = &callExpr{"cmd-end", nil, 1}
203	gOpts.cmdkeys["<c-u>"] = &callExpr{"cmd-delete-home", nil, 1}
204	gOpts.cmdkeys["<c-k>"] = &callExpr{"cmd-delete-end", nil, 1}
205	gOpts.cmdkeys["<c-w>"] = &callExpr{"cmd-delete-unix-word", nil, 1}
206	gOpts.cmdkeys["<c-y>"] = &callExpr{"cmd-yank", nil, 1}
207	gOpts.cmdkeys["<c-t>"] = &callExpr{"cmd-transpose", nil, 1}
208	gOpts.cmdkeys["<c-c>"] = &callExpr{"cmd-interrupt", nil, 1}
209	gOpts.cmdkeys["<a-f>"] = &callExpr{"cmd-word", nil, 1}
210	gOpts.cmdkeys["<a-b>"] = &callExpr{"cmd-word-back", nil, 1}
211	gOpts.cmdkeys["<a-c>"] = &callExpr{"cmd-capitalize-word", nil, 1}
212	gOpts.cmdkeys["<a-d>"] = &callExpr{"cmd-delete-word", nil, 1}
213	gOpts.cmdkeys["<a-u>"] = &callExpr{"cmd-uppercase-word", nil, 1}
214	gOpts.cmdkeys["<a-l>"] = &callExpr{"cmd-lowercase-word", nil, 1}
215	gOpts.cmdkeys["<a-t>"] = &callExpr{"cmd-transpose-word", nil, 1}
216
217	gOpts.cmds = make(map[string]expr)
218
219	setDefaults()
220}
221