dotfiles/home/hyprland/files/vim-hypr-nav.sh

63 lines
1.6 KiB
Bash
Executable File

#!/bin/sh
#
# vim-hypr-nav - Use the same bindings to move focus between hyprland windows
# and vim splits. Requires the accompanying vim plugin and jq.
dir="$1"
case "$dir" in
u) ;;
r) ;;
d) ;;
l) ;;
*)
echo "USAGE: $0 u|r|d|l"
exit 1
esac
get_descendant_vim_pid() {
pid="$1"
terms="$2"
if grep -iqE '^g?(view|n?vim?x?)(diff)?$' "/proc/$pid/comm"; then
if embed_pid="$(pgrep --parent "$pid" --full 'nvim --embed')"; then
echo "$embed_pid"
else
echo "$pid"
fi
return 0
fi
for child in $(pgrep --runstates D,I,R,S --terminal "$terms" --parent "$pid"); do
if get_descendant_vim_pid "$child" "$terms"; then
# already echo'd PID in recursive call
return 0
fi
done
return 1
}
if focused_pid="$(hyprctl activewindow -j | jq -e '.pid')"; then
terms="$(find /dev/pts -type c -not -name ptmx | sed s#^/dev/## | tr '\n' ,)"
if vim_pid="$(get_descendant_vim_pid "$focused_pid" "$terms")"; then
servername_file="${XDG_RUNTIME_DIR:-/tmp}/vim-hypr-nav.$vim_pid.servername"
read -r program servername <"$servername_file"
if [ "$program" = vim ]; then
serverarg=--servername
elif [ "$program" = nvim ]; then
serverarg=--server
fi
if [ -n "$serverarg" ] && [ -n "$servername" ]; then
"$program" "$serverarg" "$servername" \
--remote-expr "VimHyprNav('$dir')" >/dev/null 2>&1 \
&& exit 0
fi
fi
fi
hyprctl dispatch movefocus "$dir"