summaryrefslogtreecommitdiffstatshomepage
path: root/tmux/.local/bin/tmux-ssh
blob: 610b8bb2c284626fc5984371caac428109e0155c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/sh

TMUX_SSH_HISTFILE="$XDG_STATE_HOME/tmux_ssh_history"

write_hist() {
	sed -i -e "/^$1\$/d" -e "\$a$1" "$TMUX_SSH_HISTFILE" ||
		echo "$1" >"$TMUX_SSH_HISTFILE"
}

if [ "$#" -eq 0 ]; then
	ATTACHED=$(tmux display -p '#{?#{m:*ssh,#{socket_path}},#S,#{host}}' 2>/dev/null)
	HOST=$(tmux display -p '#h' 2>/dev/null)

	set -- "$(
		tac "$TMUX_SSH_HISTFILE" |
			sed "/^${ATTACHED}\$/d" |
			fzf-tmux -p20%,20% -- --print-query -d/ --with-nth -1 |
			tail -1
	)"
fi

if [ -z "$1" ]; then
	exit 0
fi

target="$1"

if [ "$target" = "$HOST" ]; then
	tmux detach -E 'tmux new -A'
else
	if ! tmux -L ssh has-session -t "$target"; then
		ssh localhost -- :
		tmux -L ssh new-session -ds "$target" ssh -t "$target" "zsh -l -c 'tmux new -A'"
	fi

	if [ -z "$TMUX" ]; then
		tmux -L ssh attach -t "$target" || exit 0
	else
		tmux detach -E "tmux -L ssh attach -t $target" || exit 0
	fi
fi

if [ "$ATTACHED" = "$HOST" ] && ! grep -q "$HOST" "$TMUX_SSH_HISTFILE"; then
	write_hist "$HOST"
fi

write_hist "$target"