feat(jobrunner): add named background job manager backed by GNU screen
Adds jobrunner (short alias jr) for running, listing, inspecting, re-attaching to, and terminating detached background tasks. Unlike bkg and detach, which discard output, a jobrunner job keeps a live terminal that survives closing the shell and can be restored later with attach. Includes the __jobrunner_sessions parser shared by the function and its completions, dynamic job-name completions, and screen in the fish-deps catalog.
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# Copyright (C) 2026 Rootiest
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# Completions for the `jobrunner` background job manager.
|
||||
# `jr` inherits these via `function jr --wraps jobrunner`.
|
||||
|
||||
# Offer running jobs as name<TAB>description pairs.
|
||||
function __jobrunner_complete_jobs
|
||||
for row in (__jobrunner_sessions)
|
||||
set -l f (string split \t -- $row)
|
||||
printf '%s\t%s job (PID %s)\n' $f[1] $f[3] $f[2]
|
||||
end
|
||||
end
|
||||
|
||||
set -l subcmds run list attach kill logs help
|
||||
set -l needs_job "__fish_seen_subcommand_from attach kill logs -a --attach -k --kill -o --output"
|
||||
|
||||
# No file completions; jobs are named, not paths.
|
||||
complete -c jobrunner -f
|
||||
|
||||
# Subcommands (only as the first argument).
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a run -d 'Start a named job in the background'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a list -d 'List all managed background jobs'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a attach -d 'Re-attach interactively to a job'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a kill -d 'Terminate a running background job'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a logs -d "Print a job's output without attaching"
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a help -d 'Show usage help'
|
||||
|
||||
# Flag forms.
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-s r -l run -d 'Start a named job in the background'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-s l -l list -d 'List all managed background jobs'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-s a -l attach -d 'Re-attach interactively to a job'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-s k -l kill -d 'Terminate a running background job'
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-s o -l output -d "Print a job's output without attaching"
|
||||
complete -c jobrunner -s h -l help -d 'Show usage help'
|
||||
|
||||
# Running jobs, for the subcommands that take one.
|
||||
complete -c jobrunner -n "$needs_job" -a '(__jobrunner_complete_jobs)'
|
||||
|
||||
# A bare job name attaches to it, so offer jobs in first position too.
|
||||
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||
-a '(__jobrunner_complete_jobs)'
|
||||
|
||||
# After `run <name>`, complete the command to execute.
|
||||
complete -c jobrunner -n "__fish_seen_subcommand_from run -r --run; and test (count (commandline -opc)) -ge 3" \
|
||||
-a '(__fish_complete_subcommand)'
|
||||
Reference in New Issue
Block a user