How do I output a string in the bottom right corner of the terminal?
2 Answers
string=whatever
stty size | {
read y x
tput sc # save cursor position
tput cup "$((y - 1))" "$((x - ${#string}))" # position cursor
printf %s "$string"
tput rc # restore cursor.
}
That assumes all characters in $string are one cell wide (and that $string doesn't contain control characters (like newline, tab...)).
If your string may contain zero-width (like combining characters) or double-width ones, you could use ksh93's printf's %Ls format specifier that formats based or character width:
string='whatéver'
# aka string=$'\uFF57\uFF48\uFF41\uFF54\uFF45\u0301\uFF56\uFF45\uFF52'
stty size | {
read y x
tput sc # save cursor position
tput cup "$((y - 1))" 0 # position cursor
printf "%${x}Ls" "$string"
tput rc # restore cursor.
}
That would erase the leading part of the last line though.
-
I try the first one in
zshandyashbut it did not work.cuonglm– cuonglm2015-11-23 16:02:57 +00:00Commented Nov 23, 2015 at 16:02 -
@cuonglm, did you try it at the prompt of an interactive shell and the comments caused problems? Also note that zsh and yash erase the region below their prompt.Stéphane Chazelas– Stéphane Chazelas2015-11-23 16:14:51 +00:00Commented Nov 23, 2015 at 16:14
-
@StéphaneChazelas: I removed all the comments, start with
zsh -f, and nothing printed. The same problem withyash.cuonglm– cuonglm2015-11-23 16:19:18 +00:00Commented Nov 23, 2015 at 16:19 -
@cuonglm, nothing printed, or printed but then removed by your interactive shell's prompt doing a clear to end of screen (as yash and zsh do)?Stéphane Chazelas– Stéphane Chazelas2015-11-23 16:25:41 +00:00Commented Nov 23, 2015 at 16:25
-
@StéphaneChazelas: I'm not sure. If I use
tput cup "$((y))" "$((x))", then I got only thewcharacter at the right corner.cuonglm– cuonglm2015-11-23 16:57:32 +00:00Commented Nov 23, 2015 at 16:57
tput cup $(tput lines) $[$(tput cols)-16]
printf "string"
or
tput cup $[$(tput lines)-1] $[$(tput cols)-16]
printf "string"
where 16 is the length that you want to reserve for the string.