mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-21 00:01:26 +01:00
00e6c6e0f5
of users/12600.
120 lines
4.1 KiB
Text
120 lines
4.1 KiB
Text
# Put standard xterm/dtterm window control codes in shell parameters for
|
|
# easy use. Note that some terminals do not support all combinations.
|
|
|
|
# autoload -U xtermctl ; xtermctl
|
|
# xtermctl --explain
|
|
|
|
# Run once to set up; implements two functions:
|
|
# xterm-tell control [args]
|
|
# xterm-ask control
|
|
# See xtermseq below for valid control names. -ask returns values in
|
|
# $reply except for label and title which are returned in $REPLY.
|
|
|
|
# E.g. one way to maximize the window (see caveat below):
|
|
# xterm-ask screen_chars
|
|
# xterm-tell size_chars $reply
|
|
|
|
# Might there be terminfo names for these controls?
|
|
typeset -Ag xtermseq
|
|
xtermseq=(
|
|
1 deiconify 2 iconify
|
|
'3;X;Y' position
|
|
'4;H;W' size_pixels
|
|
5 raise 6 lower
|
|
7 refresh
|
|
'8;H;W' size_chars
|
|
'9;0' unmaximize '9;1' maximize
|
|
11 get_iconify
|
|
13 get_position
|
|
14 get_size_pixels
|
|
18 get_size_chars
|
|
19 get_screen_chars
|
|
20 get_label
|
|
21 get_title
|
|
)
|
|
|
|
local k
|
|
for k in ${(k)xtermseq}; do xtermseq[${xtermseq[$k]}]=$k; done
|
|
|
|
# TODO (maybe): Populate hashes with completed control sequences similar
|
|
# to the $fg and $bg mappings created by Functions/Misc/colors
|
|
|
|
function xterm-tell {
|
|
local seq=${${${xtermseq[$1]:?no such control}/[HX]/$2}/[WY]/$3}
|
|
print -nr -- $'\e['"${seq}"t
|
|
}
|
|
|
|
# The following use of "read -st 2 ..." with the control sequences in
|
|
# the prompt string requires zsh 4.3.5-dev-1 or later (zsh-users/12600
|
|
# or equivalent patch).
|
|
|
|
function xterm-ask {
|
|
local esc
|
|
unset REPLY reply
|
|
1=get_${1#get_}
|
|
local seq=${xtermseq[$1]:?no such control}
|
|
case $1 in
|
|
(get_(label|title))
|
|
read -st 2 -rk 3 esc$'?\e['"${seq}"t || return 1
|
|
read -srd $'\e'
|
|
read -srk 1 esc
|
|
;;
|
|
(get_*)
|
|
read -st 2 -rk 2 esc$'?\e['"${seq}"t || return 1
|
|
IFS=';' read -Arsd t
|
|
(( $#reply > 2 )) && shift reply
|
|
;;
|
|
esac
|
|
return 0
|
|
}
|
|
|
|
local documentation; read -rd $'\e' documentation <<'EOdoc' <<<$'\e'
|
|
|
|
CSI = "control sequence introducer": ESC [
|
|
OSC = "operating system command": ESC ]
|
|
ST = "string terminator": ESC backslash
|
|
Ps = "parameter string": (see list below)
|
|
|
|
All control sequences described here begin with CSI and end with "t".
|
|
Note that there are no spaces in control sequences or responses,
|
|
except possibly for the text responses for label and title; spaces
|
|
shown below are for readability.
|
|
|
|
Window manipulation (from dtterm, as well as extensions). These
|
|
controls may be disabled using the allowWindowOps resource. Valid
|
|
values for the first (and any additional parameters) are:
|
|
|
|
Ps = 1 -> De-iconify window.
|
|
Ps = 2 -> Iconify window.
|
|
Ps = 3 ; x ; y -> Move window to [x, y].
|
|
Ps = 4 ; height ; width -> Resize the xterm window in pixels.
|
|
Ps = 5 -> Raise the xterm window to the front of the stacking order.
|
|
Ps = 6 -> Lower the xterm window to the bottom of the stacking order.
|
|
Ps = 7 -> Refresh the xterm window.
|
|
Ps = 8 ; height ; width -> Resize the text area in characters.
|
|
Ps = 9 ; 0 -> Restore maximized window.
|
|
Ps = 9 ; 1 -> Maximize window (i.e., resize to screen size).
|
|
Ps = 1 1 -> Report xterm window state.
|
|
If the xterm window is open (non-iconified), returns CSI 1 t .
|
|
If the xterm window is iconified, returns CSI 2 t .
|
|
Ps = 1 3 -> Report xterm window position as CSI 3 ; x; yt
|
|
Ps = 1 4 -> Report xterm window in pixels as CSI 4 ; height ; width t
|
|
Ps = 1 8 -> Report size of text area as CSI 8 ; height ; width t
|
|
Ps = 1 9 -> Report size of screen in characters as CSI 9 ; height ; width t
|
|
Ps = 2 0 -> Report xterm window's icon label as OSC L label ST
|
|
Ps = 2 1 -> Report xterm window's title as OSC l title ST
|
|
Ps >= 2 4 -> Resize to Ps lines (DECSLPP)
|
|
|
|
The size of the screen in characters is often reported inaccurately.
|
|
|
|
Gnome-terminal as of v2.16 responds to 13/14/18/19 but fails to insert
|
|
the Ps digit 3/4/8/9 between the CSI and the reported dimensions, and
|
|
does not appear to respond to any of Ps in 1-9. Window managers may
|
|
also affect behavior; the Gnome desktop allows xterm to resize or
|
|
iconify itself but won't reliably let it reposition itself.
|
|
|
|
EOdoc
|
|
|
|
[[ -n "${(M)@:#--explain}" ]] && print "$documentation"
|
|
|
|
return 0
|