AutoYADM commit: 2025-05-17 17:29:24

This commit is contained in:
Daniel Fichtinger 2025-05-17 17:29:24 -04:00
parent ef482dd506
commit 851e436fb1

View file

@ -3,13 +3,14 @@
# hx-typ-zathura: easily preview your typst documents from Helix! # hx-typ-zathura: easily preview your typst documents from Helix!
# This script will automatically find a pdf that matches your # This script will automatically find a pdf that matches your
# current Typst document and attempt to open it with Zathura. # current Typst document and attempt to open it with Zathura.
# Optionally, it will quit Zathura when you close Helix. # Optionally, it will quit Zathura when you close Helix, and
# uses typst watch to continuously compile the file.
# Run this script with --help for usage info! # Run this script with --help for usage info!
# Author: Daniel Fichtinger <daniel@ficd.ca # Author: Daniel Fichtinger <daniel@ficd.ca
# License: MIT # License: MIT
argparse q/quiet k/kill-on-exit h/help -- $argv argparse q/quiet k/kill-on-exit w/watch h/help s/session -- $argv
if test (count $argv) -eq 0; or set -q _flag_h if test (count $argv) -eq 0; or set -q _flag_h
echo "Helper script for opening Typst files from Helix in Zathura."\n echo "Helper script for opening Typst files from Helix in Zathura."\n
@ -21,7 +22,11 @@ if test (count $argv) -eq 0; or set -q _flag_h
echo "Options:" echo "Options:"
echo "-q/--quiet: Don't \`echo\` on caught errors, return 1 instead." echo "-q/--quiet: Don't \`echo\` on caught errors, return 1 instead."
echo "-k/--kill-on-exit: Kill Zathura when parent Helix process exits." echo "-k/--kill-on-exit: Kill Zathura when parent Helix process exits."
echo "-w/--watch: live preview mode"
echo "-h/--help: print this screen"\n echo "-h/--help: print this screen"\n
echo "Note:"
echo "To avoid spawning a large number of typst processes,"
echo "--watch is only effective if --kill-on-exit is also set."\n
echo 'Author: Daniel Fichtinger <daniel@ficd.ca>' echo 'Author: Daniel Fichtinger <daniel@ficd.ca>'
echo 'License: MIT' echo 'License: MIT'
return 0 return 0
@ -43,36 +48,70 @@ function qecho
end end
end end
# check if the user asked to kill zathura on helix exit # absolute path of %{buffer_name} file
if set -q _flag_k set -g src_path (path resolve $argv[1])
set kill_parent
# 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
set kak_session $argv[2] # check if the user asked to kill zathura on helix exit
if not command kak -l | rg -xqF "$kak_session" # or to watch the pdf
qecho "Couldn't find kak session!" if set -q _flag_k || set -q _flag_w
if set -q _flag_k
set kill_parent
end
if set -q _flag_w
set typst_watch
end
if not set -q _flag_s
qecho "You must provide --session=<name> with --kill-on-exit or --watch."
return $ret return $ret
end end
set session_name $_flag_s
set session_socket "$XDG_RUNTIME_DIR/kakoune/$session_name"
if not test -S "$session_socket"
qecho "Session $session_name not found!"
return $ret
end
end
function monitor_kak
set -l socket $argv[1]
set -l zathura_pid $argv[2]
set -l typst_pid $argv[3]
set -l dir (path dirname "$socket")
set -l file (path basename "$socket")
inotifywait -q -e delete,delete_self,moved_from --format '%f' "$dir" | while read filename
if test "$filename" = "$file"
kill $zathura_pid &> /dev/null
if test -n "$typst_pid"
kill $typst_pid &>/dev/null
end
break
end
end
end end
# opens zathura, optionally watching for helix closing # opens zathura, optionally watching for helix closing
function zopen --wraps zathura function zopen --wraps zathura
# this should be set if the user asked to watch set -f pdf_path $argv[1]
# this should be set if the user asked to kill
if set -q kill_parent if set -q kill_parent
# create background sub-process # create background sub-process
# otherwise helix will hang # otherwise helix will hang
begin begin
zathura "$argv[1]" &>/dev/null & zathura "$pdf_path" &>/dev/null &
set zathura_pid $last_pid set zathura_pid $last_pid
waitpid -c 1 "$parent_pid" "$zathura_pid" if set -q typst_watch
kill $zathura_pid &>/dev/null typst watch "$src_path" "$pdf_path" &>/dev/null &
set -f typst_pid $last_pid
end
monitor_kak "$session_socket" "$zathura_pid" "$typst_pid" &
end & end &
else else
# user didn't ask for watch, so open normally # user didn't ask for kill, so open normally
zathura "$argv[1]" &>/dev/null & zathura "$pdf_path" &>/dev/null &
end end
true true
end end
@ -89,19 +128,17 @@ function find_pdf
end end
end end
# absolute path of %{buffer_name} file # echo $src_path
set -l src (path resolve $argv[1])
# echo $src
# return 0 # return 0
# exit if not a typst file # exit if not a typst file
if not string match -q '*.typ' $src if not string match -q '*.typ' $src_path
qecho "$(path basename $src) is not a Typst file!" qecho "$(path basename $src_path) is not a Typst file!"
return $ret return $ret
end end
# change abs path to pdf extension # change abs path to pdf extension
set -l targ (string replace --regex '\.typ$' '.pdf' $src) set -l targ (string replace --regex '\.typ$' '.pdf' $src_path)
# get pdf target's base name # get pdf target's base name
set -l base (path basename --no-extension $src).pdf set -l base (path basename --no-extension $src_path).pdf
# if a suitable pdf exists in the same dir, open it # if a suitable pdf exists in the same dir, open it
if test -f "$targ" if test -f "$targ"