mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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 -Uz 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
 |