diff options
Diffstat (limited to 'app-shells/bash/files/bashrc.d/10-gentoo-title-r1.bash')
-rw-r--r-- | app-shells/bash/files/bashrc.d/10-gentoo-title-r1.bash | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/app-shells/bash/files/bashrc.d/10-gentoo-title-r1.bash b/app-shells/bash/files/bashrc.d/10-gentoo-title-r1.bash new file mode 100644 index 000000000000..8e78b09a9daf --- /dev/null +++ b/app-shells/bash/files/bashrc.d/10-gentoo-title-r1.bash @@ -0,0 +1,81 @@ +# /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 + + # Assigns the basename of the current working directory, having + # sanitised it with @Q parameter expansion. Useful for paths containing + # newlines and such. As a special case, names consisting entirely of + # graphemes shall not undergo the expansion, for reasons of cleanliness. + genfun_sanitise_cwd() { + _cwd=${PWD##*/} + if [[ ! ${_cwd} ]]; then + _cwd=${PWD} + elif [[ ${_cwd} == *[![:graph:]]* ]]; then + _cwd=${_cwd@Q} + fi + } + + # 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() { + genfun_sanitise_cwd + printf '\033]0;%s@%s - %s\007' "${USER}" "${HOSTNAME%%.*}" "${_cwd}" + } + + 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|foot*|tmux*) + # 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') |