aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/sd
blob: a0ff84c2d87153bb94619db7ba5c2d4e9b699873 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh

# Open a terminal window in the same directory as the currently active window.

windowPID=$(xprop -id "$(xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p")
PIDlist=$(pstree -lpATna "$windowPID" | sed -En 's/.*,([0-9]+).*/\1/p' | tac)
for PID in $PIDlist; do
	cmdline=$(ps -o args= -p "$PID")
	process_group_leader=$(ps -o comm= -p "$(ps -o pgid= -p "$PID" | tr -d ' ')")
	cwd=$(readlink /proc/"$PID"/cwd)
	# zsh and lf won't be ignored even if it shows ~ or /
	case "$cmdline" in
		'lf -server') continue ;;
		"${SHELL##*/}"|'lf'|'lf '*) break ;;
	esac
	# git (and its sub-processes) will show the root of a repository instead of the actual cwd, so they're ignored
	[ "$process_group_leader" = 'git' ] || [ ! -d "$cwd" ] && continue
	# This is to ignore programs that show ~ or / instead of the actual working directory
	[ "$cwd" != "$HOME" ] && [ "$cwd" != '/' ] && break
done
[ "$PWD" != "$cwd" ] && [ -d "$cwd" ] && { cd "$cwd" || exit 1; }
"$TERMINAL"