Skip to content

Commit 35cce82

Browse files
committed
modified: README.md
modified: bin/diyship
1 parent cbf6dce commit 35cce82

File tree

2 files changed

+77
-72
lines changed

2 files changed

+77
-72
lines changed

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212

1313
### 🧾 Dependencies
1414

15-
- [Unix commands](https://en.wikipedia.org/wiki/List_of_Unix_commands) to process.
15+
- [`sh`](https://wikipedia.org/wiki/Bourne_shell) to process.
16+
- [`date`](https://wikipedia.org/wiki/Unix_time) and [`cut`](https://wikipedia.org/wiki/Cut_(Unix)) for timing (required by Bash, Zsh, Elvish and Tcsh).
17+
- [`wc`](https://wikipedia.org/wiki/Wc_(Unix)) for job counting (required by Ion).
18+
- [`cat`](https://wikipedia.org/wiki/Cat_(Unix)) for return workaround (required by Xonsh).
1619

1720
### 📥 Installation
1821

@@ -65,7 +68,7 @@ eval "$(diyship bash)"
6568
Add the following to the end of `~/.zshrc`:
6669

6770
```zsh
68-
source <(diyship zsh)
71+
eval "$(diyship zsh)"
6972
```
7073

7174
### 🐚 Fish
@@ -99,7 +102,7 @@ eval $(diyship ion)
99102
Add the following to the end of `~/.elvish/rc.elv`:
100103

101104
```elv
102-
eval (diyship elvish)
105+
eval (diyship elvish | slurp)
103106
```
104107

105108
> _Only Elvish v0.15 or higher is supported._
@@ -122,6 +125,7 @@ startup = [
122125
"diyship nushell | save ~/.cache/diyship/init.nu",
123126
"source ~/.cache/diyship/init.nu"
124127
]
128+
125129
prompt = "diyship_prompt"
126130
```
127131

bin/diyship

Lines changed: 70 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,86 +2,90 @@
22

33

44
# Values
5-
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
6-
DIYSHIP_COMMAND_LEFT="${DIYSHIP_COMMAND_LEFT:-$XDG_CONFIG_HOME/diyship/left}"
7-
DIYSHIP_COMMAND_RIGHT="${DIYSHIP_COMMAND_RIGHT:-$XDG_CONFIG_HOME/diyship/right}"
5+
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}"
6+
DIYSHIP_COMMAND_LEFT="${DIYSHIP_COMMAND_LEFT:-${XDG_CONFIG_HOME}/diyship/left}"
7+
DIYSHIP_COMMAND_RIGHT="${DIYSHIP_COMMAND_RIGHT:-${XDG_CONFIG_HOME}/diyship/right}"
88

9-
BASH_INIT="
9+
TIMING_COMMAND="date +%s%N | cut -c '-13'"
10+
JOB_COUNT_COMMAND="wc -l"
11+
RETURN_WORKAROUND_COMMAND="cat"
12+
13+
init_bash="
1014
diyship_preexec() {
11-
local PREV_LAST_ARG=\$1
15+
local PREV_LAST_ARG=\${1}
1216
13-
if [ \"\$DIYSHIP_PREEXEC_READY\" = \"true\" ]; then
17+
if [ \"\${DIYSHIP_PREEXEC_READY}\" = \"true\" ]; then
1418
DIYSHIP_PREEXEC_READY=false
15-
DIYSHIP_START_TIME=\$(date +%s%N)
19+
DIYSHIP_START_TIME=\$(${TIMING_COMMAND})
1620
fi
1721
18-
: \"\$PREV_LAST_ARG\"
22+
: \"\${PREV_LAST_ARG}\"
1923
}
2024
2125
diyship_precmd() {
2226
export DIYSHIP_STATUS=\$?
2327
24-
DIYSHIP_PIPESTATUS=(\${PIPESTATUS[@]})
28+
DIYSHIP_PIPESTATUS_TEMPORARY=(\${PIPESTATUS[@]})
2529
if [[ \"\${#BP_PIPESTATUS[@]}\" -gt \"\${#DIYSHIP_PIPESTATUS[@]}\" ]]; then
26-
DIYSHIP_PIPESTATUS=(\${BP_PIPESTATUS[@]})
30+
DIYSHIP_PIPESTATUS_TEMPORARY=(\${BP_PIPESTATUS[@]})
2731
fi
28-
export DIYSHIP_PIPESTATUS=\"\${DIYSHIP_PIPESTATUS[@]}\"
32+
export DIYSHIP_PIPESTATUS=\${DIYSHIP_PIPESTATUS_TEMPORARY[@]}
2933
3034
DIYSHIP_JOBS=0
3135
for job in \$(jobs -p); do
32-
[[ \$job ]] && ((DIYSHIP_JOBS++))
36+
[[ \${job} ]] && ((DIYSHIP_JOBS++))
3337
done
34-
export DIYSHIP_JOBS=\"\$DIYSHIP_JOBS\"
38+
export DIYSHIP_JOBS=\"\${DIYSHIP_JOBS}\"
3539
3640
\"\${diyship_precmd_user_func-:}\"
3741
38-
eval \"\$_PRESERVED_PROMPT_COMMAND\"
42+
eval \"\${_PRESERVED_PROMPT_COMMAND}\"
3943
40-
if [[ \$DIYSHIP_START_TIME ]]; then
41-
DIYSHIP_END_TIME=\$(date +%s%N)
44+
if [[ \${DIYSHIP_START_TIME} ]]; then
45+
DIYSHIP_END_TIME=\$(${TIMING_COMMAND})
4246
export DIYSHIP_DURATION=\$((DIYSHIP_END_TIME - DIYSHIP_START_TIME))
4347
fi
4448
45-
PS1=\"\$($DIYSHIP_COMMAND_LEFT)\"
49+
PS1='\$(${DIYSHIP_COMMAND_LEFT})'
4650
4751
unset DIYSHIP_START_TIME
4852
DIYSHIP_PREEXEC_READY=true
4953
}
5054
51-
if [[ \"\${__bp_imported:-}\" == \"defined\" || \$preexec_functions || \$precmd_functions ]]; then
55+
if [[ \"\${__bp_imported:-}\" == \"defined\" || \${preexec_functions} || \${precmd_functions} ]]; then
5256
diyship_preexec_all(){ diyship_preexec \"\$_\"; }
5357
preexec_functions+=(diyship_preexec_all)
5458
precmd_functions+=(diyship_precmd)
5559
else
5660
dbg_trap=\"\$(trap -p DEBUG | cut -d' ' -f3 | tr -d \')\"
57-
if [[ -z \"\$dbg_trap\" ]]; then
61+
if [[ -z \"\${dbg_trap}\" ]]; then
5862
trap 'diyship_preexec \"\$_\"' DEBUG
59-
elif [[ \"\$dbg_trap\" != 'diyship_preexec \"\$_\"' && \"\$dbg_trap\" != 'diyship_preexec_all \"\$_\"' ]]; then
63+
elif [[ \"\${dbg_trap}\" != 'diyship_preexec \"\$_\"' && \"\${dbg_trap}\" != 'diyship_preexec_all \"\$_\"' ]]; then
6064
diyship_preexec_all() {
61-
local PREV_LAST_ARG=\$1 ; \$dbg_trap; diyship_preexec; : \"\$PREV_LAST_ARG\";
65+
local PREV_LAST_ARG=\${1} ; \${dbg_trap}; diyship_preexec; : \"\${PREV_LAST_ARG}\";
6266
}
6367
trap 'diyship_preexec_all \"\$_\"' DEBUG
6468
fi
6569
66-
if [[ -z \"\$PROMPT_COMMAND\" ]]; then
70+
if [[ -z \"\${PROMPT_COMMAND}\" ]]; then
6771
PROMPT_COMMAND=\"diyship_precmd\"
68-
elif [[ \"\$PROMPT_COMMAND\" != *\"diyship_precmd\"* ]]; then
69-
_PRESERVED_PROMPT_COMMAND=\"\$PROMPT_COMMAND\"
72+
elif [[ \"\${PROMPT_COMMAND}\" != *\"diyship_precmd\"* ]]; then
73+
_PRESERVED_PROMPT_COMMAND=\"\${PROMPT_COMMAND}\"
7074
PROMPT_COMMAND=\"diyship_precmd\"
7175
fi
7276
fi
7377
74-
DIYSHIP_START_TIME=\$(date +%s%N)
78+
DIYSHIP_START_TIME=\$(${TIMING_COMMAND})
7579
7680
export DIYSHIP_SHELL=\"bash\"
7781
"
7882

79-
ZSH_INIT="
83+
init_zsh="
8084
zmodload zsh/parameter
8185
8286
if [[ \$ZSH_VERSION == ([1-4]*) ]]; then
8387
__diyship_get_time() {
84-
DIYSHIP_CAPTURED_TIME=\$(date +%s%N)
88+
DIYSHIP_CAPTURED_TIME=\$(${TIMING_COMMAND})
8589
}
8690
else
8791
zmodload zsh/datetime
@@ -93,7 +97,9 @@ fi
9397
9498
diyship_precmd() {
9599
export DIYSHIP_STATUS=\$?
96-
export DIYSHIP_PIPESTATUS=\"\${pipestatus[@]}\"
100+
101+
DIYSHIP_PIPESTATUS_TEMPORARY=(\${pipestatus[@]})
102+
export DIYSHIP_PIPESTATUS=\${DIYSHIP_PIPESTATUS_TEMPORARY[@]}
97103
98104
if (( \${+DIYSHIP_START_TIME} )); then
99105
__diyship_get_time && (( DIYSHIP_DURATION = DIYSHIP_CAPTURED_TIME - DIYSHIP_START_TIME )) && export DIYSHIP_DURATION=\"\$DIYSHIP_DURATION\"
@@ -120,6 +126,8 @@ if [[ -z \${preexec_functions[(re)diyship_preexec]} ]]; then
120126
fi
121127
122128
diyship_zle-keymap-select() {
129+
export DIYSHIP_KEYMAP=\"\$KEYMAP\"
130+
123131
zle reset-prompt
124132
}
125133
@@ -141,11 +149,11 @@ export DIYSHIP_SHELL=\"zsh\"
141149
VIRTUAL_ENV_DISABLE_PROMPT=1
142150
143151
setopt promptsubst
144-
PROMPT='\$($DIYSHIP_COMMAND_LEFT)'
145-
RPROMPT='\$($DIYSHIP_COMMAND_RIGHT)'
152+
PROMPT='\$(${DIYSHIP_COMMAND_LEFT})'
153+
RPROMPT='\$(${DIYSHIP_COMMAND_RIGHT})'
146154
"
147155

148-
FISH_INIT="
156+
init_fish="
149157
function fish_prompt
150158
set -gx DIYSHIP_STATUS \$status
151159
set -gx DIYSHIP_PIPESTATUS \$pipestatus
@@ -159,11 +167,11 @@ function fish_prompt
159167
set -gx DIYSHIP_KEYMAP insert
160168
end
161169
162-
$DIYSHIP_COMMAND_LEFT
170+
${DIYSHIP_COMMAND_LEFT}
163171
end
164172
165173
function fish_right_prompt
166-
$DIYSHIP_COMMAND_RIGHT
174+
${DIYSHIP_COMMAND_RIGHT}
167175
end
168176
169177
set -g VIRTUAL_ENV_DISABLE_PROMPT 1
@@ -173,7 +181,7 @@ builtin functions -e fish_mode_prompt
173181
set -gx DIYSHIP_SHELL \"fish\"
174182
"
175183

176-
POWERSHELL_INIT="
184+
init_powershell="
177185
#!/usr/bin/env pwsh
178186
179187
function global:prompt {
@@ -224,7 +232,7 @@ function global:prompt {
224232
\$ENV:DIYSHIP_DURATION = [math]::Round((\$lastCmd.EndExecutionTime - \$lastCmd.StartExecutionTime).TotalMilliseconds)
225233
}
226234
227-
Invoke-Native -Executable '$DIYSHIP_COMMAND_LEFT'
235+
Invoke-Native -Executable '${DIYSHIP_COMMAND_LEFT}'
228236
229237
\$global:LASTEXITCODE = \$origLastExitCode
230238
@@ -243,20 +251,20 @@ function global:prompt {
243251
\$ENV:DIYSHIP_SHELL = \"powershell\"
244252
"
245253

246-
ION_INIT="
254+
init_ion="
247255
fn PROMPT
248256
export DIYSHIP_STATUS = \$?
249257
export DIYSHIP_DURATION = \$or(\$CMD_DURATION \$ION_CMD_DURATION)
250258
export DIYSHIP_DURATION = \$((DIYSHIP_DURATION * 1000))
251-
export DIYSHIP_JOBS = \$(jobs ^| wc -l)
259+
export DIYSHIP_JOBS = \$(jobs ^| ${JOB_COUNT_COMMAND})
252260
253-
$DIYSHIP_COMMAND_LEFT
261+
${DIYSHIP_COMMAND_LEFT}
254262
end
255263
256264
export DIYSHIP_SHELL=\"ion\"
257265
"
258266

259-
ELVISH_INIT="
267+
init_elvish="
260268
set-env DIYSHIP_SHELL \"elvish\"
261269
262270
# Define Hooks
@@ -265,88 +273,81 @@ local:cmd-end-time = 0
265273
local:cmd-duration = 0
266274
267275
fn diyship-after-readline-hook [line]{
268-
cmd-start-time = (date +%s%N)
276+
cmd-start-time = (${TIMING_COMMAND})
269277
}
270278
271279
fn diyship-before-readline-hook {
272-
cmd-end-time = (date +%s%N)
280+
cmd-end-time = (${TIMING_COMMAND})
273281
cmd-duration = (- \$cmd-end-time \$cmd-start-time)
274282
}
275283
276284
edit:after-readline = [ \$@edit:after-readline \$diyship-after-readline-hook~ ]
277285
edit:before-readline = [ \$@edit:before-readline \$diyship-before-readline-hook~ ]
278286
279287
edit:prompt = {
280-
set-env DIYSHIP_DURATION \$cmd-duration
288+
set-env DIYSHIP_DURATION (to-string \$cmd-duration)
281289
set-env DIYSHIP_JOBS \$num-bg-jobs
282290
283-
$DIYSHIP_COMMAND_LEFT
291+
${DIYSHIP_COMMAND_LEFT}
284292
}
285293
286294
edit:rprompt = {
287-
set-env DIYSHIP_DURATION \$cmd-duration
295+
set-env DIYSHIP_DURATION (to-string \$cmd-duration)
288296
set-env DIYSHIP_JOBS \$num-bg-jobs
289297
290-
$DIYSHIP_COMMAND_RIGHT
298+
${DIYSHIP_COMMAND_RIGHT}
291299
}"
292300

293-
TCSH_INIT="
301+
init_tcsh="
294302
setenv DIYSHIP_SHELL tcsh;
295303
296304
set USER_PRECMD = \"\`alias precmd\`\";
297305
set USER_POSTCMD = \"\`alias postcmd\`\";
298306
299-
set DIYSHIP_PRECMD = 'set DIYSHIP_STATUS = \$status;set DIYSHIP_PATH = \"$DIYSHIP_COMMAND_LEFT\";set DIYSHIP_END_TIME = \`date +%s%N\`;set DIYSHIP_DURATION = 0;if ( \$DIYSHIP_START_TIME != -1 ) @ DIYSHIP_DURATION = \$DIYSHIP_END_TIME - \$DIYSHIP_START_TIME;set prompt = \"\`\$DIYSHIP_COMMAND_LEFT\`\";set DIYSHIP_START_TIME = -1';
300-
set DIYSHIP_POSTCMD = 'set DIYSHIP_START_TIME = \`date +%s%N\`';
307+
set DIYSHIP_PRECMD = 'setenv DIYSHIP_STATUS \$status; set DIYSHIP_PATH = \"${DIYSHIP_COMMAND_LEFT}\"; set DIYSHIP_END_TIME = \`${TIMING_COMMAND}\`; set DIYSHIP_DURATION_TEMPORARY = 0; if ( \$DIYSHIP_START_TIME != -1 ) @ DIYSHIP_DURATION_TEMPORARY = \$DIYSHIP_END_TIME - \$DIYSHIP_START_TIME; setenv DIYSHIP_DURATION \$DIYSHIP_DURATION_TEMPORARY; set prompt = \"\`${DIYSHIP_COMMAND_LEFT}\`\"; set DIYSHIP_START_TIME = -1';
308+
set DIYSHIP_POSTCMD = 'set DIYSHIP_START_TIME = \`${TIMING_COMMAND}\`';
301309
302310
alias precmd \"\$DIYSHIP_PRECMD;\$USER_PRECMD\";
303311
alias postcmd \"\$DIYSHIP_POSTCMD;\$USER_POSTCMD\";
304312
305-
set DIYSHIP_START_TIME = \`date +%s%N\`;
313+
set DIYSHIP_START_TIME = \`${TIMING_COMMAND}\`;
306314
"
307315

308-
NUSHELL_INIT="
316+
init_nushell="
309317
let-env DIYSHIP_SHELL = \"nushell\"
310318
311319
def diyship_prompt [] {
312320
let-env DIYSHIP_DURATION = \$nu.env.CMD_DURATION_MS
313321
314-
^$DIYSHIP_COMMAND_LEFT
322+
^${DIYSHIP_COMMAND_LEFT}
315323
}
316324
"
317325

318-
XONSH_INIT="
326+
init_xonsh="
319327
def diyship_prompt():
320328
last_cmd = __xonsh__.history[-1] if __xonsh__.history else None
321329
322330
\$DIYSHIP_STATUS = last_cmd.rtn if last_cmd else 0
323331
\$DIYSHIP_DURATION = round((last_cmd.ts[1] - last_cmd.ts[0]) * 1000) if last_cmd else 0
324332
\$DIYSHIP_JOBS = sum(1 for job in __xonsh__.all_jobs.values() if job['obj'] and job['obj'].poll() is None)
325333
326-
return \$($DIYSHIP_COMMAND_LEFT | cat)
334+
return \$(${DIYSHIP_COMMAND_LEFT} | ${RETURN_WORKAROUND_COMMAND})
327335
328336
\$PROMPT = diyship_prompt
329337
330338
\$DIYSHIP_SHELL = \"xonsh\"
331339
"
332340

333341
# Start
334-
case "$1" in
335-
'bash') printf '%s' "$BASH_INIT" ;;
336-
'zsh') printf '%s' "$ZSH_INIT" ;;
337-
'fish') printf '%s' "$FISH_INIT" ;;
338-
'powershell') printf '%s' "$POWERSHELL_INIT" ;;
339-
'ion') printf '%s' "$ION_INIT" ;;
340-
'elvish') printf '%s' "$ELVISH_INIT" ;;
341-
'tcsh') printf '%s' "$TCSH_INIT" ;;
342-
'nushell') printf '%s' "$NUSHELL_INIT" ;;
343-
'xonsh') printf '%s' "$XONSH_INIT" ;;
344-
*)
345-
printf '%s\n' "diyship: invalid shell -- '$SUBCOMMAND'" >&2
346-
347-
exit 1
348-
;;
349-
esac
342+
eval "init=\$init_${1}"
343+
344+
if [ -n "${init}" ]; then
345+
printf '%s' "${init}"
346+
else
347+
printf '%s\n' "diyship: invalid shell '${1}'." >&2
348+
349+
exit 1
350+
fi
350351

351352

352353
exit 0

0 commit comments

Comments
 (0)