#!/usr/bin/env bash # Usage: is_vim.sh # tty: Specify tty to check for vim process. tty=$1 # Construct process tree. children=() pids=($(ps -o pid= -t $tty)) while read -r pid ppid; do [[ -n $pid && $pid -ne $ppid ]] && children[ppid]+=" $pid" done <<<"$(ps -Ao pid=,ppid=)" # Get all descendant pids of processes in $tty with BFS idx=0 while ((${#pids[@]} > idx)); do pid=${pids[idx++]} pids+=(${children[pid]-}) done # Check whether any child pids are vim ps -o state=,comm= -p "${pids[@]}" | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$' exit $?