diff --git a/.config/helix/scripts/kak-typ-zathura.fish b/.config/helix/scripts/kak-typ-zathura.fish new file mode 100755 index 00000000..e948ad69 --- /dev/null +++ b/.config/helix/scripts/kak-typ-zathura.fish @@ -0,0 +1,125 @@ +#!/usr/bin/env fish + +# hx-typ-zathura: easily preview your typst documents from Helix! +# This script will automatically find a pdf that matches your +# current Typst document and attempt to open it with Zathura. +# Optionally, it will quit Zathura when you close Helix. +# Run this script with --help for usage info! + +# Author: Daniel Fichtinger ' + echo 'License: MIT' + return 0 +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 + set ret 0 +end + +# only echo if -q not set +function qecho + if test "$ret" -ne 1 + echo $argv[1] + end +end + +# check if the user asked to kill zathura on helix exit +if set -q _flag_k + 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] + if not command kak -l | rg -xqF "$kak_session" + qecho "Couldn't find kak session!" + return $ret + end +end + +# 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 -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 + true +end + +# try to find the target pdf file searching from root +function find_pdf + set -l root $argv[1] + set -l base $argv[2] + set -l candidate (fd --no-ignore-vcs -F -1 "$base" "$root") + if test -n "$candidate" + zopen "$candidate" + else + return 1 + end +end + +# absolute path of %{buffer_name} file +set -l src (path resolve $argv[1]) +# echo $src +# return 0 +# 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 abs path to pdf extension +set -l targ (string replace --regex '\.typ$' '.pdf' $src) +# get pdf target's base name +set -l base (path basename --no-extension $src).pdf + +# if a suitable pdf exists in the same dir, open it +if test -f "$targ" + zopen "$targ" +else + # no such file in current dir, time to search! + # if we're in a git repo, search from its root + # if we're not, search from cwd + if git rev-parse --is-inside-work-tree &>/dev/null + set root (git rev-parse --show-toplevel) + else + set root (pwd) + end + if not find_pdf "$root" "$base" + if set -q _flag_q + return 1 + else + echo "$base couldn't be found at root $root!" + end + end +end