So that I could resize the window to a certain size from within Terminal.
5 Answers
Yes. Terminal supports escape sequences for manipulating windows, including the size and position, layering, and minimizing. Dimensions can be expressed in pixels or characters. See Xterm Control Sequences for details (search for “Window manipulation”; if you’re not familiar with the notation, “CSI” stands for “Control Sequence Introducer”, which is ESC [
).
For example, this shell command will set the window to 100x50 characters:
printf '\e[8;50;100t'
Minimize the window for a few seconds, then restore it:
printf '\e[2t' && sleep 3 && printf '\e[1t'
Move the window to the top/left corner of the display:
printf '\e[3;0;0t'
Zoom the window:
printf '\e[9;1t'
Bring the window to the front (without changing keyboard focus):
printf '\e[5t'
Enabling the Control Sequences in Terminal Emulators
Some terminal emulators ignore these control sequences by default and require configuration to enable them.
To enable these in XTerm, set the following resource to true:
allowWindowOps
To enable these in iTerm2, deselect the following preference:
Preferences > Profiles > [profile] > Terminal > Disable session-initiated window resizing
-
-
3
-
2
-
This works great but it seems Terminal does not accept resizings that would make the window only partially visible on the screen. I just tried printf '\e[8;100;100t' and this truncated to 79x100, just what could be fit. My problem is that I need to bypass the mouse just for this case of enlarging Terminal beyond the screen limits ...– phsCommented Oct 3, 2015 at 8:22
-
1
Use /usr/X11/bin/resize
.
resize -s 30 80
will give you 30 rows and 80 columns.
resize -s 30 0
will give you 30 rows and full columns.
resize -s 0 80
will give you full rows and 80 columns.
-
1This solution is not limited to MacOS. It is terminal-based, so it should work on all terminals. I use this to resize PuTTY windows on Windows running bash shells with TERM=xterm. Commented Dec 22, 2014 at 17:44
-
4
-
This works for me with Apple Terminal but not iTerm2. However, sending the escape sequence \e[8;24;80t works with both.– TextGeekCommented Jun 1, 2017 at 19:18
-
1@KrishenGreenwell Refer to the iTerm2 documentation. By default it ignores these control sequences. There’s a preference to control whether they are ignored. Commented Dec 21, 2018 at 23:55
-
2This solution used to work, but I think, the X11 commands are gone. Maybe, they can be installed by installing X11, but I don't want to install X11 just to have the resize command.– GabCommented Apr 26, 2019 at 9:48
You could always use AppleScript:
setwidth() { osascript -e "tell app \"Terminal\" to tell window 1
set b to bounds
set item 3 of b to (item 1 of b) + $1
set bounds to b
end"; }
-
This only works for the currently active terminal window/tab. For this to reliably work, get the current tty device pathname and locate the terminal tab that matches. Commented Dec 21, 2018 at 23:53
-
My apologies for necro-reviving an old question, but I thought this answer might be useful for others.
From tedsmith3rd, here's a bash function to move a Terminal window. The magic of terminal command sequences.
function bumpNjump() {
local xDimension="" yDimension="" width="" height="" OPTIND
while getopts 'x:y:w:h:' thisArg
do
case "${thisArg}" in
x) xDimension="${OPTARG}" ;;
y) yDimension="${OPTARG}" ;;
w) width="${OPTARG}" ;;
h) height="${OPTARG}" ;;
esac
done
if [ -n "${width}" -a -n "${height}" ]
then
printf '\e[4;'${height}';'${width}'t';
fi
if [ -n "${xDimension}" -a -n "${yDimension}" ]
then
printf '\e[3;'${xDimension}';'${yDimension}'t'
fi
}
Combine that with this termsize.bash script to get the current geometry, and you have an easy way to control your Terminal window.
#!/bin/bash
# based on a script from http://invisible-island.net/xterm/xterm.faq.html
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
printf "\e[13t" > /dev/tty
IFS=';' read -r -d t -a pos
xpos=${pos[1]}
ypos=${pos[2]}
# Window (including chrome) size in pixels
printf "\e[14;2t" > /dev/tty
IFS=';' read -r -d t -a size
hsize=${size[1]}
wsize=${size[2]}
stty $oldstty
echo "bumpNjump -x $xpos -y $ypos -h $hsize -w $wsize"
-
This looks useful, though doesn't work for me on MacOS 10.5.6 - it prints out the control characters:
bumpNjump -x 10 -y 20 -w 800 -h 300
\E[4;300;800t\E[3;10;20t
Does it work for you?– ScotCommented Sep 24, 2020 at 23:45 -
1Ah - it works in iTerm if you disable the option shown in an earlier answer: To enable these in iTerm2, deselect the following preference: Preferences > Profiles > [profile] > Terminal > Disable session-initiated window resizing– ScotCommented Sep 25, 2020 at 0:10
Actually you know, moving an resizing windows with a mouse is horribly slow.
I've been using this app SizeUp for a very long time now. It basically resizes any application window by using your keyboard command.
You can do the following (my custom keyboard commands below):
- make the window full screen (control + option + command + m)
- move a window 1/2 screen size to the left or right (control + option + command + ←/→ )
- move a window 1/4 screen size to any corner (control + option + shift + ←/→/↑/↓)
- move windows between screens
- move windows between spaces
I think this might do the trick and also help with other window management.
-
1Although useful, this doesn't address the question the questioner asked. Commented Oct 25, 2012 at 19:05