63 lines
1.6 KiB
Bash
Executable File
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"
|