summaryrefslogtreecommitdiff
path: root/app-shells/bash/files/bashrc.d/10-gentoo-title-r3.bash
blob: 186763d07d9d22cb4894a52a774212ddfb22d7c5 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# /etc/bash/bashrc.d/10-gentoo-title.bash

# For information regarding the control sequences used, please refer to
# https://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

genfun_set_win_title() {
	# Advertise the fact that the presently running interactive shell will
	# update the title. Doing so allows for its subprocesses to determine
	# whether it is safe to set the title of their own accord. Note that 0
	# refers to the value of Ps within the OSC Ps ; Pt BEL sequence.
	export SHELL_SETS_TITLE=0

	# Sets the window title with the Set Text Parameters control sequence.
	# For screen, the sequence defines the hardstatus (%h) and for tmux, the
	# pane_title (#T). For graphical terminal emulators, it is normal for
	# the title bar to be affected.
	genfun_set_win_title() {
		local prompt

		if [[ ${PROMPT_DIRTRIM} ]]; then
			# Respect the value of PROMPT_DIRTRIM. If set as 0, the
			# current working directory shall be shown in full.
			prompt='\u@\h \w'
		else
			# Show the basename of the current working directory.
			prompt='\u@\h \W'
		fi
		printf '\033]0;%s\007' "${prompt@P}"
	}

	genfun_set_win_title
}

unset -v SHELL_SETS_TITLE

# Determine whether the terminal can handle the Set Text Parameters sequence.
# The only terminals permitted here are those for which there is empirical
# evidence that the sequence is supported and that the UTF-8 character encoding
# is handled correctly. Quite rightly, this precludes many vintage terminals.
case ${TERM} in
	alacritty*|contour|foot*|tmux*|xterm-ghostty)
		# The terminal emulator also supports XTWINOPS. If the PTY was
		# created by sshd(8) then push the current window title to the
		# stack and arrange for it to be popped upon exiting. Xterm also
		# supports this but there are far too many terminal emulators
		# that falsely identify as being xterm-compatible.
		if [[ ${SSH_TTY} && ${SSH_TTY} == "$(tty)" ]]; then
			trap 'printf "\033[23;0t"' EXIT
			printf '\033[22;0t'
		fi
		;;
	rxvt-unicode*|st-256color|xterm*)
		# If the PTY was created by sshd(8) then proceed no further.
		# Alas, there exist many operating environments in which the
		# title would otherwise not be restored upon ssh(1) exiting.
		# Those wanting for the title to be set regardless may adjust
		# ~/.bashrc or create a bashrc.d drop-in to set PROMPT_COMMAND.
		# For example, PROMPT_COMMAND=(genfun_set_win_title).
		if [[ ${SSH_TTY} && ${SSH_TTY} == "$(tty)" ]]; then
			return
		fi
		;;
	screen*)
		# If the PTY was created by sshd(8) and screen(1) was launched
		# prior to the SSH session beginning, as opposed to afterwards,
		# proceed no further. It is another case in which there would be
		# no guarantee of the title being restored upon ssh(1) exiting.
		if [[ ! ${WINDOW} && ${SSH_TTY} && ${SSH_TTY} == "$(tty)" ]]; then
			return
		fi
		;;
	*)
		return
esac

# Arrange for the title to be updated each time the primary prompt is displayed.
PROMPT_COMMAND+=('genfun_set_win_title')