-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path.mkshrc
391 lines (360 loc) · 10.3 KB
/
.mkshrc
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
# vi:ft=sh
\: "${EDITOR:=/bin/ed}${TERM:=vt100}${USER:=$(\\builtin ulimit -c 0; id -un \
2>/dev/null)}${HOSTNAME:=$(\\builtin ulimit -c 0; hostname 2>/dev/null)}"
[[ $HOSTNAME = ?(?(ip6-)localhost?(6)) ]] && HOSTNAME=nil; \\builtin unalias ls
\\builtin export EDITOR HOSTNAME TERM USER="${USER:-?}"
# mksh-specific from here
\: "${MKSH:=$(\\builtin whence -p mksh)}${MKSH:=/bin/mksh}"
\\builtin export MKSH
# prompts
PS4='[$EPOCHREALTIME] '; PS1='#'; (( USER_ID )) && PS1='$'; PS1=$'\001\r''${|
\\builtin typeset e=$?
(( e )) && REPLY+="$(echo -e "\033[0;31m$e|")"
REPLY+="$(echo -e "\033[34;1m${HOSTNAME%%.*}\033[31;1m")"
\\builtin typeset d=${PWD:-?}/ p=~; [[ $p = ?(*/) ]] || d=${d/#$p\//\~/}
d=${d%/}; \\builtin typeset m=${%d} n p=...; (( m > 0 )) || m=${#d}
(( m > (n = (COLUMNS/3 < 7 ? 7 : COLUMNS/3)) )) && d=${d:(-n)} || p=
REPLY+="$(echo -e "$p\033[90m:\033[33m$d")"
\\builtin return $e
} '"$(echo -e "\033[0;31m$PS1\033[0;37m") "
# utilities
\\builtin alias doch='sudo mksh -c "$(\\builtin fc -ln -1)"'
# Berkeley C shell compatible dirs, popd, and pushd functions
# Z shell compatible chpwd() hook, used to update DIRSTACK[0]
DIRSTACKBASE=$(\\builtin realpath ~/. 2>/dev/null || \
\\builtin print -nr -- "${HOME:-/}")
\\builtin set -A DIRSTACK
function chpwd {
DIRSTACK[0]=$(\\builtin realpath . 2>/dev/null || \
\\builtin print -nr -- "$PWD")
[[ $DIRSTACKBASE = ?(*/) ]] || \
DIRSTACK[0]=${DIRSTACK[0]/#$DIRSTACKBASE/\~}
\:
}
\chpwd .
cd() {
\\builtin cd "$@" || \\builtin return $?
\chpwd "$@"
}
function cd_csh {
\\builtin typeset d t=${1/#\~/$DIRSTACKBASE}
if ! d=$(\\builtin cd "$t" 2>&1); then
\\builtin print -ru2 "${1}: ${d##*cd: $t: }."
\\builtin return 1
fi
\cd "$t"
}
function dirs {
\\builtin typeset d dwidth
\\builtin typeset -i fl=0 fv=0 fn=0 cpos=0
while \\builtin getopts ":lvn" d; do
case $d {
(l) fl=1 ;;
(v) fv=1 ;;
(n) fn=1 ;;
(*) \\builtin print -ru2 'Usage: dirs [-lvn].'
\\builtin return 1 ;;
}
done
\\builtin shift $((OPTIND - 1))
if (( $# > 0 )); then
\\builtin print -ru2 'Usage: dirs [-lvn].'
\\builtin return 1
fi
if (( fv )); then
fv=0
while (( fv < ${#DIRSTACK[*]} )); do
d=${DIRSTACK[fv]}
(( fl )) && d=${d/#\~/$DIRSTACKBASE}
\\builtin print -r -- "$fv $d"
(( ++fv ))
done
else
fv=0
while (( fv < ${#DIRSTACK[*]} )); do
d=${DIRSTACK[fv]}
(( fl )) && d=${d/#\~/$DIRSTACKBASE}
(( dwidth = (${%d} > 0 ? ${%d} : ${#d}) ))
if (( fn && (cpos += dwidth + 1) >= 79 && \
dwidth < 80 )); then
\\builtin print
(( cpos = dwidth + 1 ))
fi
\\builtin print -nr -- "$d "
(( ++fv ))
done
\\builtin print
fi
\\builtin return 0
}
function popd {
\\builtin typeset d fa
\\builtin typeset -i n=1
while \\builtin getopts ":0123456789lvn" d; do
case $d {
(l|v|n) fa+=" -$d" ;;
(+*) n=2
\\builtin break ;;
(*) \\builtin print -ru2 'Usage: popd [-lvn] [+<n>].'
\\builtin return 1 ;;
}
done
\\builtin shift $((OPTIND - n))
n=0
if (( $# > 1 )); then
\\builtin print -ru2 popd: Too many arguments.
\\builtin return 1
elif [[ $1 = ++([0-9]) && $1 != +0 ]]; then
if (( (n = ${1#+}) >= ${#DIRSTACK[*]} )); then
\\builtin print -ru2 popd: Directory stack not that deep.
\\builtin return 1
fi
elif [[ -n $1 ]]; then
\\builtin print -ru2 popd: Bad directory.
\\builtin return 1
fi
if (( ${#DIRSTACK[*]} < 2 )); then
\\builtin print -ru2 popd: Directory stack empty.
\\builtin return 1
fi
\\builtin unset DIRSTACK[n]
\\builtin set -A DIRSTACK -- "${DIRSTACK[@]}"
\cd_csh "${DIRSTACK[0]}" || \\builtin return 1
\dirs $fa
}
function pushd {
\\builtin typeset d fa
\\builtin typeset -i n=1
while \\builtin getopts ":0123456789lvn" d; do
case $d {
(l|v|n) fa+=" -$d" ;;
(+*) n=2
\\builtin break ;;
(*) \\builtin print -ru2 'Usage: pushd [-lvn] [<dir>|+<n>].'
\\builtin return 1 ;;
}
done
\\builtin shift $((OPTIND - n))
if (( $# == 0 )); then
if (( ${#DIRSTACK[*]} < 2 )); then
\\builtin print -ru2 pushd: No other directory.
\\builtin return 1
fi
d=${DIRSTACK[1]}
DIRSTACK[1]=${DIRSTACK[0]}
\cd_csh "$d" || \\builtin return 1
elif (( $# > 1 )); then
\\builtin print -ru2 pushd: Too many arguments.
\\builtin return 1
elif [[ $1 = ++([0-9]) && $1 != +0 ]]; then
if (( (n = ${1#+}) >= ${#DIRSTACK[*]} )); then
\\builtin print -ru2 pushd: Directory stack not that deep.
\\builtin return 1
fi
while (( n-- )); do
d=${DIRSTACK[0]}
\\builtin unset DIRSTACK[0]
\\builtin set -A DIRSTACK -- "${DIRSTACK[@]}" "$d"
done
\cd_csh "${DIRSTACK[0]}" || \\builtin return 1
else
\\builtin set -A DIRSTACK -- placeholder "${DIRSTACK[@]}"
\cd_csh "$1" || \\builtin return 1
fi
\dirs $fa
}
# strip comments (and leading/trailing whitespace if IFS is set) from
# any file(s) given as argument, or stdin if none, and spew to stdout
function Lstripcom {
\\builtin set -o noglob
\\builtin cat "$@" | while \\builtin read _line; do
_line=${_line%%#*}
[[ -n $_line ]] && \\builtin print -r -- $_line
done
}
# toggle built-in aliases and utilities, and aliases and functions from mkshrc
function enable {
\\builtin typeset doprnt=0 mode=1 x y z rv=0
\\builtin typeset b_alias i_alias i_func nalias=0 nfunc=0 i_all
\\builtin set -A b_alias
\\builtin set -A i_alias
\\builtin set -A i_func
# accumulate mksh built-in aliases, in ASCIIbetical order
i_alias[nalias]=autoload; b_alias[nalias++]='\\builtin typeset -fu'
i_alias[nalias]=functions; b_alias[nalias++]='\\builtin typeset -f'
i_alias[nalias]=hash; b_alias[nalias++]='\\builtin alias -t'
i_alias[nalias]=history; b_alias[nalias++]='\\builtin fc -l'
i_alias[nalias]=integer; b_alias[nalias++]='\\builtin typeset -i'
i_alias[nalias]=local; b_alias[nalias++]='\\builtin typeset'
i_alias[nalias]=login; b_alias[nalias++]='\\builtin exec login'
i_alias[nalias]=nameref; b_alias[nalias++]='\\builtin typeset -n'
i_alias[nalias]=nohup; b_alias[nalias++]='nohup '
i_alias[nalias]=r; b_alias[nalias++]='\\builtin fc -e -'
i_alias[nalias]=type; b_alias[nalias++]='\\builtin whence -v'
# accumulate mksh built-in utilities, in definition order, even ifndef
i_func[nfunc++]=.
i_func[nfunc++]=:
i_func[nfunc++]='['
i_func[nfunc++]=alias
i_func[nfunc++]=break
# \\builtin cannot, by design, be overridden
i_func[nfunc++]=builtin
i_func[nfunc++]=cat
i_func[nfunc++]=cd
i_func[nfunc++]=chdir
i_func[nfunc++]=command
i_func[nfunc++]=continue
i_func[nfunc++]=echo
i_func[nfunc++]=eval
i_func[nfunc++]=exec
i_func[nfunc++]=exit
i_func[nfunc++]=export
i_func[nfunc++]=false
i_func[nfunc++]=fc
i_func[nfunc++]=getopts
i_func[nfunc++]=jobs
i_func[nfunc++]=kill
i_func[nfunc++]=let
i_func[nfunc++]=print
i_func[nfunc++]=pwd
i_func[nfunc++]=read
i_func[nfunc++]=readonly
i_func[nfunc++]=realpath
i_func[nfunc++]=rename
i_func[nfunc++]=return
i_func[nfunc++]=set
i_func[nfunc++]=shift
i_func[nfunc++]=source
i_func[nfunc++]=suspend
i_func[nfunc++]=test
i_func[nfunc++]=times
i_func[nfunc++]=trap
i_func[nfunc++]=true
i_func[nfunc++]=typeset
i_func[nfunc++]=ulimit
i_func[nfunc++]=umask
i_func[nfunc++]=unalias
i_func[nfunc++]=unset
i_func[nfunc++]=wait
i_func[nfunc++]=whence
i_func[nfunc++]=bg
i_func[nfunc++]=fg
i_func[nfunc++]=bind
i_func[nfunc++]=mknod
i_func[nfunc++]=printf
i_func[nfunc++]=sleep
i_func[nfunc++]=domainname
i_func[nfunc++]=extproc
# accumulate aliases from dot.mkshrc, in definition order
i_alias[nalias]=doch; b_alias[nalias++]='sudo mksh -c "$(\\builtin fc -ln -1)"'
i_alias[nalias]=cls; b_alias[nalias++]='\\builtin print -n \\ec'
# accumulate functions from dot.mkshrc, in definition order
i_func[nfunc++]=setenv
i_func[nfunc++]=chpwd
i_func[nfunc++]=cd
i_func[nfunc++]=cd_csh
i_func[nfunc++]=dirs
i_func[nfunc++]=popd
i_func[nfunc++]=pushd
i_func[nfunc++]=enable
# collect all identifiers, sorted ASCIIbetically
\\builtin set -sA i_all -- "${i_alias[@]}" "${i_func[@]}"
# handle options, we don't do dynamic loading
while \\builtin getopts "adf:nps" x; do
case $x {
(a)
mode=-1
;;
(d)
# deliberately causing an error, like bash-static
;|
(f)
\\builtin print -ru2 enable: dynamic loading not available
\\builtin return 2
;;
(n)
mode=0
;;
(p)
doprnt=1
;;
(s)
\\builtin set -sA i_all -- . : break continue eval \
exec exit export readonly return set shift times \
trap unset
;;
(*)
\\builtin print -ru2 enable: usage: \
"enable [-adnps] [-f filename] [name ...]"
return 2
;;
}
done
\\builtin shift $((OPTIND - 1))
# display builtins enabled/disabled/all/special?
if (( doprnt || ($# == 0) )); then
for x in "${i_all[@]}"; do
y=$(\\builtin alias "$x") || y=
[[ $y = "$x='\\\\builtin whence -p $x >/dev/null || (\\\\builtin print -r mksh: $x: not found; \\\\builtin exit 127) && \$(\\\\builtin whence -p $x)'" ]]; z=$?
case $mode:$z {
(-1:0|0:0)
\\builtin print -r -- "enable -n $x"
;;
(-1:1|1:1)
\\builtin print -r -- "enable $x"
;;
}
done
\\builtin return 0
fi
for x in "$@"; do
z=0
for y in "${i_alias[@]}" "${i_func[@]}"; do
[[ $x = "$y" ]] || \\builtin continue
z=1
\\builtin break
done
if (( !z )); then
\\builtin print -ru2 enable: "$x": not a shell builtin
rv=1
\\builtin continue
fi
if (( !mode )); then
# disable this
\\builtin alias "$x=\\\\builtin whence -p $x >/dev/null || (\\\\builtin print -r mksh: $x: not found; \\\\builtin exit 127) && \$(\\\\builtin whence -p $x)"
else
# find out if this is an alias or not, first
z=0
y=-1
while (( ++y < nalias )); do
[[ $x = "${i_alias[y]}" ]] || \\builtin continue
z=1
\\builtin break
done
if (( z )); then
# re-enable the original alias body
\\builtin alias "$x=${b_alias[y]}"
else
# re-enable the original utility/function
\\builtin unalias "$x"
fi
fi
done
\\builtin return $rv
}
PATH=~/.local/bin$PATHSEP$PATH
PATH=~/.cargo/bin$PATHSEP$PATH
PATH=~/.scripts$PATHSEP$PATH
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_DOWNLOAD_DIR="$HOME/Downloads"
export EDITOR="nvim"
export PAGER="less"
export BROWSER="librewolf"
export CHROME="/usr/bin/brave"
# export NVM_DIR="$HOME/.config/nvm"
# [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
source ~/.aliases
set -o vi
\\builtin export SHELL=$MKSH MANWIDTH=80 LESSHISTFILE=-
if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then exec startx; fi