configs/home/.zsh-distrobox/themes/spaceship-prompt/lib/worker.zsh

70 lines
1.8 KiB
Bash

#!/usr/bin/env zsh
# ------------------------------------------------------------------------------
# WORKER
# Spaceship wrapper around zsh-async
# ------------------------------------------------------------------------------
# Unique array of async jobs
typeset -ahU SPACESHIP_JOBS=()
# Load zsh-async if not loaded yet
spaceship::worker::load() {
if ! (( ASYNC_INIT_DONE )); then
builtin source "$SPACESHIP_ROOT/async.zsh"
spaceship::precompile "$SPACESHIP_ROOT/async.zsh"
fi
}
# Lower worker priority to avoid slowing down the prompt
spaceship::worker::renice() {
if command -v renice >/dev/null; then
command renice +15 -p $$
fi
if command -v ionice >/dev/null; then
command ionice -c 3 -p $$
fi
}
# This should be called to in callback to update the job counter
spaceship::worker::callback() {
SPACESHIP_JOBS=("${(@)SPACESHIP_JOBS:#${1}}")
}
# Start the worker and prepare the environment
spaceship::worker::init() {
if spaceship::is_prompt_async; then
SPACESHIP_JOBS=()
# restart worker
async_stop_worker "spaceship"
async_start_worker "spaceship" -n -u
# setopt before call register to avoid callback by async_worker_eval
async_worker_eval "spaceship" setopt extendedglob
async_worker_eval "spaceship" spaceship::worker::renice
async_register_callback "spaceship" spaceship::core::async_callback
fi
}
# Flush jobs for stopped worker
spaceship::worker::flush() {
if spaceship::is_prompt_async; then
async_flush_jobs "spaceship"
fi
}
# Eval command inside the worker
spaceship::worker::eval() {
if spaceship::is_prompt_async; then
async_worker_eval "spaceship" "$@"
fi
}
# Run a job in a worker
spaceship::worker::run() {
if spaceship::is_prompt_async; then
SPACESHIP_JOBS+=("$1")
async_job "spaceship" "$@"
fi
}