From 5bb20dda7c1ddbea9473a7d994471920c005c8ca Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Tue, 22 Apr 2025 18:00:05 -0400 Subject: [PATCH] AutoYADM commit: 2025-04-22 18:00:05 --- .config/helix/scripts/typst-zathura.fish | 70 ++++++++++++++---------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/.config/helix/scripts/typst-zathura.fish b/.config/helix/scripts/typst-zathura.fish index 6f3f1c10..95fbcc3c 100755 --- a/.config/helix/scripts/typst-zathura.fish +++ b/.config/helix/scripts/typst-zathura.fish @@ -12,6 +12,8 @@ if test (count $argv) -eq 0; or set -q _flag_h end # only return status 1 if -q not set +# (if return status != 0, helix will not +# display anything that was echoed to stdout!) if set -q _flag_q set ret 1 else @@ -20,33 +22,40 @@ end # only echo if -q not set function qecho - if not set -q _flag_q + if test "$ret" -ne 1 echo $argv[1] end end -# traverse up process tree to find caller Helix PID -function find_parent_process -a target - set current_pid $fish_pid - - while test $current_pid -ne 1 # Stop when we reach init (PID 1) - set parent (ps -o ppid= -p $current_pid | string trim) - set cmd (ps -o comm= -p $parent | string trim) - - if string match -q -- $target $cmd - echo "$parent" - return 0 - end - - set current_pid $parent - end - - return 1 -end - +# check if the user asked to kill zathura on helix exit if set -q _flag_k set kill_parent - echo "kill flag set" + # traverse up process tree to find caller Helix PID + # We use this PID to kill zathura if Helix exits first! + # we only need to define this function + # inside this scope + function find_parent_process -a target + # initialize current_pid as this shell's pid + set -f current_pid $fish_pid + + # Stop when we reach init (PID 1) + while test $current_pid -ne 1 + # parent of current_pid + set parent (ps -o ppid= -p $current_pid | string trim) + # get parent's command name + set cmd (ps -o comm= -p $parent | string trim) + + # if the cmd matches our target command we return its pid + if string match -q -- $target $cmd + echo "$parent" + return 0 + end + + set -f current_pid $parent + end + return 1 + end + set parent_pid (find_parent_process hx) if test -z "$parent_pid" qecho "Couldn't find parent hx process!" @@ -54,20 +63,25 @@ if set -q _flag_k end end -# opens zathura, watching for helix closing +# opens zathura, optionally watching for helix closing function zopen --wraps zathura + # this should be set if the user asked to watch if set -q kill_parent + # create background sub-process + # otherwise helix will hang begin zathura "$argv[1]" &>/dev/null & set zathura_pid $last_pid - waitpid "$parent_pid" - kill $zathura_pid + waitpid -c 1 "$parent_pid" "$zathura_pid" + kill $zathura_pid &>/dev/null end & else + # user didn't ask for watch, so open normally zathura "$argv[1]" &>/dev/null & end end +# try to find the target pdf file function find_pdf set -l root $argv[1] set -l base $argv[2] @@ -79,15 +93,18 @@ function find_pdf end end +# absolute path of %{buffer_name} file set -l src (path resolve $argv[1]) +# exit if not a typst file if not string match -q '*.typ' $src qecho "$(path basename $src) is not a Typst file!" return $ret end +# change to pdf extension set -l targ (string replace '.typ' '.pdf' $src) set -l base (path basename --no-extension $src).pdf -if test -f "$targ" -a '' != '' +if test -f "$targ" # zathura "$targ" &>/dev/null & zopen "$targ" else @@ -95,11 +112,8 @@ else # if we're in a git repo, search from root # if we're not, search from cwd if git rev-parse --is-inside-work-tree &>/dev/null - # echo in git set root (git rev-parse --show-toplevel) - # echo $root else - echo out git set root (pwd) end if not find_pdf "$root" "$base"