feat(config): switch tv pickers to --inline and improve prompt redraw handling

This commit is contained in:
Prad Nukala committed 2026-09-30 11:54:14 -04:00
1 parent 19aeed21ac
commit a5bf3e9194
10 files changed
+173 -57

No files matched your search

+2 -2
View File
@@ -1,8 +1,8 @@
# Pick a ghq repo / Obsidian vault with tv (ghq-repos cable) + cd.
gho() {
local dir
dir=$(tv ghq-repos) || return
[ -n "$dir" ] || return
dir=$(tv ghq-repos --inline) || return
[ -n "$dir" ] || return 1
cd "$dir" || return
clear
if [ -d .git ]; then
+56 -21
View File
@@ -8,49 +8,84 @@ unsetopt flow_control # free ^Q/^S in zle so the ctrl-q exit bind fires
# Generic runner: widget `run-<cmd>` executes <cmd> (function or binary) with
# the tty as stdin, then repaints — fish's `commandline -f repaint`.
# cwd changes from gho/yy persist: widgets run in the shell process.
# gho, pj and `tv git-files` open television cables (~/.config/television/
# cable) — the same keys do the same in fish and bash.
# gho, pj and `tv git-files` (below) open television cables (~/.config/
# television/cable) — the same keys do the same in fish and bash.
_zle-run() {
local cmd=${WIDGET#run-}
zle -I
$cmd </dev/tty
zle reset-prompt
}
for _cmd in purple clip-last gho pj omp yy lazygit; do
for _cmd in purple clip-last omp yy lazygit; do
zle -N "run-$_cmd" _zle-run
done
unset _cmd
# ctrl-e: tv git-files (bat preview, enter opens nvim).
# tv pickers run --inline below the prompt. zle -I + reset-prompt redraws the
# prompt where zle last drew it, wiping anything printed below; zle -I alone
# redraws a fresh prompt under the output. So: a cancelled picker (cursor
# left on the line below the prompt) steps back up and resets in place, and
# output that must stay (onefetch after gho's cd, a pj task) gets zle -I only.
# ctrl-e: tv git-files (bat preview, enter opens nvim, which restores the
# cursor to tv's line).
_zle-tv-git-files() {
zle -I
tv git-files </dev/tty
tv git-files --inline </dev/tty
printf '\033[A' >/dev/tty
zle reset-prompt
}
zle -N tv-git-files _zle-tv-git-files
# ctrl-o: gho (ghq-repos cable); cd + clear + onefetch when something was
# picked.
_zle-gho() {
local before=$PWD
zle -I
gho </dev/tty
if [[ $PWD == "$before" ]]; then
printf '\033[A' >/dev/tty
zle reset-prompt
fi
}
zle -N gho-inline _zle-gho
# ctrl-p, and down on an idle empty prompt (fish's _pj_bind_down; otherwise
# normal history / multiline movement). pj reports through $PJ_STATE: `open`
# = cancelled, `ran` = a task printed output, empty = no task sources
# (PJ_QUIET keeps down silent outside projects).
_zle-pj() {
if [[ $WIDGET == pj-down && -n $BUFFER ]]; then
zle down-line-or-history
return
fi
local state
state=$(mktemp) || return
zle -I
if [[ $WIDGET == pj-down ]]; then
PJ_STATE=$state PJ_QUIET=1 pj </dev/tty
else
PJ_STATE=$state pj </dev/tty
fi
case $(<$state) in
open) printf '\033[A' >/dev/tty; zle reset-prompt ;;
ran) ;;
*) zle reset-prompt ;;
esac
rm -f $state
}
zle -N pj-inline _zle-pj
zle -N pj-down _zle-pj
bindkey '^E' tv-git-files
bindkey '^B' run-purple
bindkey '^Y' run-clip-last
bindkey '^O' run-gho
bindkey '^P' run-pj
bindkey '^O' gho-inline
bindkey '^P' pj-inline
bindkey '^A' run-omp
# ctrl-f: yazi; yy cd's to yazi's exit dir on quit.
bindkey '^F' run-yy
bindkey '^G' run-lazygit
# down: the pj cable on an idle, empty prompt; otherwise normal history /
# multiline movement (fish's _pj_bind_down). PJ_QUIET makes it a silent no-op
# outside projects.
_zle-pj-down() {
if [[ -n $BUFFER ]]; then
zle down-line-or-history
return
fi
zle -I
PJ_QUIET=1 pj </dev/tty
zle reset-prompt
}
zle -N pj-down _zle-pj-down
bindkey '^[[B' pj-down
bindkey '^[OB' pj-down