feat: misc stuff

This commit is contained in:
Barrett Ruth 2026-03-08 18:13:09 -04:00
parent 372d315cc8
commit be6b1e23c5
Signed by: barrett
GPG key ID: A6C96C9349D2FC81
7 changed files with 36 additions and 2570 deletions

View file

@ -55,9 +55,40 @@ For each approved issue:
to verify the fix works (no surprises — user already knows what to expect)
5. /gc — conventional commit on fix/<short> branch
6. /pr — push, create PR targeting `barrettruth/canola.nvim` with Problem/Solution body
7. Update doc/upstream.md — status → fixed, add PR + commit link
7. Update `doc/upstream.md` (see upstream.md rules below)
8. /gc + push the upstream.md change on same branch
## `doc/upstream.md` rules
The tracker is organized into grouped tables — each issue/PR appears in
exactly ONE section. Never duplicate entries across sections.
### Sections
- **Upstream PRs** — single table for all upstream PRs (cherry-picked,
deferred, not actionable, not applicable). Status is a column.
- **Issues** — single table, all issues sorted by number. Columns:
Issue, Description, Status. Each issue appears exactly once.
### Status values (Issues table)
- `open` — unresolved
- `fixed` — fixed in this fork. Append PR link: `fixed (#NN)`
- `cherry-picked` — resolved by cherry-picking upstream PR: `cherry-picked (#NN)`
- `not actionable` — won't fix. Append reason: `not actionable — reason`
### When fixing an issue
1. Change the issue's status from `open` to `fixed (#NN)` with our fork's PR
2. Never include commit hashes — only PR numbers (stable across rebases)
3. Never include priority markers (P0/P1/P2)
### Link format
- Upstream issues: `[#NNN](https://github.com/stevearc/oil.nvim/issues/NNN)`
- Upstream PRs: `[#NNN](https://github.com/stevearc/oil.nvim/pull/NNN)`
- Fork PRs: `[#NNN](https://github.com/barrettruth/canola.nvim/pull/NNN)`
## Subagent Research Prompt Template
"Research upstream oil.nvim issue #NNN for the canola.nvim fork.

View file

@ -230,6 +230,7 @@ return {
extra_filetypes = { 'diff' },
hide_prefix = false,
highlights = {
-- blend_alpha = 0.9,
gutter = true,
vim = {
enabled = true,

View file

@ -47,7 +47,7 @@ vim.o.relativenumber = true
vim.o.signcolumn = 'no'
vim.o.statuscolumn = '%s%C %=%{v:relnum?v:relnum:v:lnum} '
vim.o.statusline = " %{len(expand('%'))?expand('%:~').' ':''}%h%m%r%=%c:%l/%L "
vim.o.statusline = " %{len(expand('%'))?expand('%:~').' ':''}%h%m%r%=%c:%l/%L %{&ft!=''?&ft:&bt} "
vim.opt.path:append('**')

View file

@ -91,6 +91,3 @@ unbind c; bind c run 'mux code'
unbind s; bind s run 'mux shell'
unbind g; bind g run 'mux git'
unbind m; bind m run 'mux misc'
set -g lock-after-time 300
set -g lock-command "pipes -p 2"

File diff suppressed because one or more lines are too long

View file

@ -128,6 +128,7 @@
"nvidia-settings"
"tailscale"
"libfprint-2-tod1-goodix"
"brgenml1lpr"
]
);
}

View file

@ -1,379 +0,0 @@
#!/usr/bin/env bash
# pipes.sh: Animated pipes terminal screensaver.
# https://github.com/pipeseroni/pipes.sh
#
# Copyright (c) 2015-2018 Pipeseroni/pipes.sh contributors
# Copyright (c) 2013-2015 Yu-Jie Lin
# Copyright (c) 2010 Matthew Simpson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
VERSION=1.3.0
M=32768 # Bash RANDOM maximum + 1
p=1 # number of pipes
f=75 # frame rate
s=13 # probability of straight fitting
r=2000 # characters limit
t=0 # iteration counter for -r character limit
w=80 # terminal size
h=24
# ab -> sets[][idx] = a*4 + b
# 0: up, 1: right, 2: down, 3: left
# 00 means going up , then going up -> ┃
# 12 means going right, then going down -> ┓
sets=(
"┃┏ ┓┛━┓ ┗┃┛┗ ┏━"
"│╭ ╮╯─╮ ╰│╯╰ ╭─"
"│┌ ┐┘─┐ └│┘└ ┌─"
"║╔ ╗╝═╗ ╚║╝╚ ╔═"
"|+ ++-+ +|++ +-"
"|/ \/-\ \|/\ /-"
".. .... .... .."
".o oo.o o.oo o."
"-\ /\|/ /-\/ \|" # railway
"╿┍ ┑┚╼┒ ┕╽┙┖ ┎╾" # knobby pipe
"████▀▀███▀█▀▀██▀"
)
SETS=() # rearranged all pipe chars into individul elements for easier access
# pipes'
x=() # current position
y=()
l=() # current directions
# 0: up, 1: right, 2: down, 3: left
n=() # new directions
v=() # current types
c=() # current escape codes
# selected pipes'
V=() # types (indexes to sets[])
C=() # color indices for tput setaf
VN=0 # number of selected types
CN=0 # number of selected colors
E=() # pre-generated escape codes from BOLD, NOCOLOR, and C
# switches
RNDSTART=0 # randomize starting position and direction
BOLD=1
NOCOLOR=0
KEEPCT=0 # keep pipe color and type
# print help message in 72-char width
print_help() {
local cgap
printf -v cgap '%*s' $((15 - ${#COLORS})) ''
cat <<HELP
Usage: $(basename $0) [OPTION]...
Animated pipes terminal screensaver.
-p [1-] number of pipes (D=1)
-t [0-$((${#sets[@]} - 1))] pipe type (D=0)
-t c[16 chars] custom pipe type
-c [0-$COLORS]${cgap}pipe color INDEX (TERM=$TERM), can be
hexadecimal with '#' prefix
(D=-c 1 -c 2 ... -c 7 -c 0)
-f [20-100] framerate (D=75)
-s [5-15] going straight probability, 1 in (D=13)
-r [0-] reset after (D=2000) characters, 0 if no reset
-R randomize starting position and direction
-B no bold effect
-C no color
-K keep pipe color and type when crossing edges
-h print this help message
-v print version number
Note: -t and -c can be used more than once.
HELP
}
# parse command-line options
# It depends on a valid COLORS which is set by _CP_init_termcap_vars
parse() {
# test if $1 is a natural number in decimal, an integer >= 0
is_N() {
[[ -n $1 && -z ${1//[0-9]/} ]]
}
# test if $1 is a hexadecimal string
is_hex() {
[[ -n $1 && -z ${1//[0-9A-Fa-f]/} ]]
}
# print error message for invalid argument to standard error, this
# - mimics getopts error message
# - use all positional parameters as error message
# - has a newline appended
# $arg and $OPTARG are the option name and argument set by getopts.
pearg() {
printf "%s: -$arg invalid argument -- $OPTARG; %s\n" "$0" "$*" >&2
}
OPTIND=1
while getopts "p:t:c:f:s:r:RBCKhv" arg; do
case $arg in
p)
if is_N "$OPTARG" && ((OPTARG > 0)); then
p=$OPTARG
else
pearg 'must be an integer and greater than 0'
return 1
fi
;;
t)
if [[ "$OPTARG" = c???????????????? ]]; then
V+=(${#sets[@]})
sets+=("${OPTARG:1}")
elif is_N "$OPTARG" && ((OPTARG < ${#sets[@]})); then
V+=($OPTARG)
else
pearg 'must be an integer and from 0 to' \
"$((${#sets[@]} - 1)); or a custom type"
return 1
fi
;;
c)
if [[ $OPTARG == '#'* ]]; then
if ! is_hex "${OPTARG:1}"; then
pearg 'unrecognized hexadecimal string'
return 1
fi
if ((16$OPTARG >= COLORS)); then
pearg 'hexadecimal must be from #0 to' \
"#$(printf '%X' $((COLORS - 1)))"
return 1
fi
C+=($((16$OPTARG)))
elif is_N "$OPTARG" && ((OPTARG < COLORS)); then
C+=($OPTARG)
else
pearg "must be an integer and from 0 to $((COLORS - 1));" \
'or a hexadecimal string with # prefix'
return 1
fi
;;
f)
if is_N "$OPTARG" && ((OPTARG >= 20 && OPTARG <= 100)); then
f=$OPTARG
else
pearg 'must be an integer and from 20 to 100'
return 1
fi
;;
s)
if is_N "$OPTARG" && ((OPTARG >= 5 && OPTARG <= 15)); then
s=$OPTARG
else
pearg 'must be an integer and from 5 to 15'
return 1
fi
;;
r)
if is_N "$OPTARG"; then
r=$OPTARG
else
pearg 'must be a non-negative integer'
return 1
fi
;;
R) RNDSTART=1 ;;
B) BOLD=0 ;;
C) NOCOLOR=1 ;;
K) KEEPCT=1 ;;
h)
print_help
exit 0
;;
v)
echo "$(basename -- "$0") $VERSION"
exit 0
;;
*)
return 1
;;
esac
done
shift $((OPTIND - 1))
if (($#)); then
printf "$0: illegal arguments -- $*; no arguments allowed\n" >&2
return 1
fi
}
cleanup() {
# clear out standard input
read -t 0.001 && cat </dev/stdin >/dev/null
tput reset # fix for konsole, see pipeseroni/pipes.sh#43
tput rmcup
tput cnorm
stty echo
printf "$SGR0"
exit 0
}
resize() {
w=$(tput cols) h=$(tput lines)
}
init_pipes() {
# +_CP_init_pipes
local i
ci=$((KEEPCT ? 0 : CN * RANDOM / M))
vi=$((KEEPCT ? 0 : VN * RANDOM / M))
for ((i = 0; i < p; i++)); do
((\
n[i] = 0, \
l[i] = RNDSTART ? RANDOM % 4 : 0, \
x[i] = RNDSTART ? w * RANDOM / M : w / 2, \
y[i] = RNDSTART ? h * RANDOM / M : h / 2, \
v[i] = V[vi]))
c[i]=${E[ci]}
((ci = (ci + 1) % CN, vi = (vi + 1) % VN))
done
# -_CP_init_pipes
}
init_screen() {
stty -echo
tput smcup
tput civis
tput clear
trap cleanup HUP TERM
resize
trap resize SIGWINCH
}
main() {
# simple pre-check of TERM, tput's error message should be enough
tput -T "$TERM" sgr0 >/dev/null || return $?
# +_CP_init_termcap_vars
COLORS=$(tput colors) # COLORS - 1 == maximum color index for -c argument
SGR0=$(tput sgr0)
SGR_BOLD=$(tput bold)
# -_CP_init_termcap_vars
parse "$@" || return $?
# +_CP_init_VC
# set default values if not by options
((${#V[@]})) || V=(0)
VN=${#V[@]}
((${#C[@]})) || C=(1 2 3 4 5 6 7 0)
CN=${#C[@]}
# -_CP_init_VC
# +_CP_init_E
# generate E[] based on BOLD (SGR_BOLD), NOCOLOR, and C for each element in
# C, a corresponding element in E[] =
# SGR0
# + SGR_BOLD, if BOLD
# + tput setaf C, if !NOCOLOR
local i
for ((i = 0; i < CN; i++)); do
E[i]=$SGR0
((BOLD)) && E[i]+=$SGR_BOLD
((NOCOLOR)) || E[i]+=$(tput setaf ${C[i]})
done
# -_CP_init_E
# +_CP_init_SETS
local i j
for ((i = 0; i < ${#sets[@]}; i++)); do
for ((j = 0; j < 16; j++)); do
SETS+=("${sets[i]:j:1}")
done
done
unset i j
# -_CP_init_SETS
init_screen
init_pipes
# any key press exits the loop and this script
trap 'break 2' INT
local i
while REPLY=; do
read -t 0.0$((1000 / f)) -n 1 2>/dev/null
case "$REPLY" in
P) ((s = s < 15 ? s + 1 : s)) ;;
O) ((s = s > 3 ? s - 1 : s)) ;;
F) ((f = f < 100 ? f + 1 : f)) ;;
D) ((f = f > 20 ? f - 1 : f)) ;;
B) ((BOLD = (BOLD + 1) % 2)) ;;
C) ((NOCOLOR = (NOCOLOR + 1) % 2)) ;;
K) ((KEEPCT = (KEEPCT + 1) % 2)) ;;
?) break ;;
esac
for ((i = 0; i < p; i++)); do
# New position:
# l[] direction = 0: up, 1: right, 2: down, 3: left
# +_CP_newpos
((l[i] % 2)) && ((x[i] += -l[i] + 2, 1)) || ((y[i] += l[i] - 1))
# -_CP_newpos
# Loop on edges (change color on loop):
# +_CP_warp
((!KEEPCT && (x[i] >= w || x[i] < 0 || y[i] >= h || y[i] < 0))) &&
{
c[i]=${E[CN * RANDOM / M]}
((v[i] = V[VN * RANDOM / M]))
}
((x[i] = (x[i] + w) % w, \
y[i] = (y[i] + h) % h))
# -_CP_warp
# new turning direction:
# $((s - 1)) in $s, going straight, therefore n[i] == l[i];
# and 1 in $s that pipe makes a right or left turn
#
# s * RANDOM / M - 1 == 0
# n[i] == -1
# => n[i] == l[i] + 1 or l[i] - 1
# +_CP_newdir
((\
n[i] = s * RANDOM / M - 1, \
n[i] = n[i] >= 0 ? l[i] : l[i] + (2 * (RANDOM % 2) - 1), \
n[i] = (n[i] + 4) % 4))
# -_CP_newdir
# Print:
# +_CP_print
printf '\e[%d;%dH%s%s' \
$((y[i] + 1)) $((x[i] + 1)) ${c[i]} \
"${SETS[v[i] * 16 + l[i] * 4 + n[i]]}"
# -_CP_print
l[i]=${n[i]}
done
((r > 0 && t * p >= r)) && tput reset && tput civis && t=0 || ((t++))
done
cleanup
}
# when being sourced, $0 == bash, only invoke main when they are the same
[[ "$0" != "$BASH_SOURCE" ]] || main "$@"