I have a Terminal window with a dozen named tabs open.
I would like to save the current configuration and have it restored with names and directories.
Is there a way to do this?
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityTo save configuration into /tmp/cfg
:
gnome-terminal --save-config=/tmp/cfg
To load it back:
gnome-terminal --load-config=/tmp/cfg
UPDATE
After playing around with bash I created following script which stores tab names into file /tmp/test
as well:
#!/usr/bin/env bash
gnome-terminal --save-config=/tmp/test
LINES=($(grep -n '\[Terminal' /tmp/test | cut -d: -f1))
for ((i=0; i<$(grep '\[Terminal' /tmp/test | wc -l); i++))
do
TITLE=$(xprop -id $WINDOWID WM_NAME | sed -e 's/WM_NAME(STRING) = "//' -e 's/"$//';xdotool key ctrl+Page_Down;)
sed -ri "$((${LINES[$i]}+$i))s/.*/&\nTitle=$TITLE/" /tmp/test
done
To assign names properly you have to run it from first tab of your terminal. Loading same as before:
gnome-terminal --load-config=/tmp/test
EXPLANATION:
I can use following to get tab name:
xprop -id $WINDOWID WM_NAME
I can use following to jump to next tab:
xdotool key ctrl+Page_Down;
I'm getting number of tabs after grepping configuration file I saved before:
$(grep '\[Terminal' /tmp/test | wc -l)
So I can iterate over tabs inside a loop. I have to add "Title=titlename" entry for each tab configuration section in file saved before. To do so, first I'm creating an array of line numbers where I'll be adding lines.
LINES=($(grep -n '\[Terminal' /tmp/test | cut -d: -f1))
I'm adding "Title=titlename" line inside of loop iterating over tabs:
sed -ri "$((${LINES[$i]}+$i))s/.*/&\nTitle=$TITLE/" /tmp/test
PROMPT_COMMAND='echo -ne "\033]0;Test\007"'
?
/tmp
is cleared on a reboot. So if you want to retain the terminal config after a reboot, save somewhere else.
An alternative is to just use Byobu. Press F2 to open new terminals inside it. Use F3 and F4 to switch left and right between terminals.
Close the GUI window anytime you want. When you reopen Byobu all your terminals are restored :)
I've also looked for that feature in Gnome terminal but couldn't find it. The best option I found so far is to use konsole. It allows you to bookmark your tabs, so that you can get back to them by choosing them from a bookmarks menu. I hope this helps.
I Tried one more option,
I changed my default title for Terminal to use the Intital value in ~/.bashrc
, rather than changing the ~/.profile
settings.
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="$PS1"
;;
*)
;;
esac
If You do this, there is no need to change your Terminal Profile.
When you execute gnome-terminal --load-config
all the tab names are restored properly.
And you can also change as you like it and save the tabs again!!
I found a way to do it that I think is faster.
Type:
gnome-terminal --tab-with-profile=PROFILENAME1 --tab-with-profile=PROFILENAME2 ... --tab-with-profile=PROFILENAME999
I made an alias with this command and it worked pretty fine for me. I just type workflow
and a Terminal appears with 3 tabs and the titles that I chose in the profile definition that are placed into the tabs.
On my .bashrc
file I placed:
alias workflow='gnome-terminal --tab-with-profile=Git --tab-with-profile=Run | sublime-text &'
I tried the below options after restoring the saved settings and the Title is also restored properly.
This option avoid your initial title set to be overwritten.
Hope This helps and a great script indeed. Save a lot of time whenever u reboot and I can happily reboot my virtual box frequently.
Thanks!!
Restore
tmux
environment after system restart.
tmux-resurrect
saves all the little details from your tmux environment so it can be completely restored after a system restart (or when you feel like it). No configuration is required. You should feel like you never quit tmux.It even (optionally) restores vim and neovim sessions!
Screen or Byobu are my preferred methods of managing complex workflow in the terminal, and both allow saving your configurations.
screen
doesn't do what the question asked for, and the Byobu answer doesn't survive reboots.
Feb 14, 2021 at 12:52
Hyper (https://github.com/zeit/hyper) is a good cross platform alternative written in JavaScript and bundled with Electron.
There's a PR that is going to add support for session save/restore out of the box: https://github.com/zeit/hyper/pull/945
Here is an xfce terminal fork, with possibility to save/restore session just from menu: https://github.com/repu1sion/xfce4-terminal
A little improvement to the existed script which also checks xdotool installed on system and adds variable for changing path
#!/bin/bash
SAVEPATH=/tmp/termprofile
if [ ! -f /usr/bin/xdotool ]; then
echo "please install 'xdotool'"
exit 1
fi
gnome-terminal --save-config=$SAVEPATH
LINES=($(grep -n '\[Terminal' $SAVEPATH | cut -d: -f1))
for ((i=0; i<$(grep '\[Terminal' $SAVEPATH | wc -l); i++))
do
TITLE=$(xprop -id $WINDOWID WM_NAME | sed -e 's/WM_NAME(STRING) = "//' -e 's/"$//';xdotool key ctrl+Page_Down;)
sed -ri "$((${LINES[$i]}+$i))s/.*/&\nTitle=$TITLE/" $SAVEPATH
done
Expanding on Nyakin's answer above, this script will work for multiple window and tab configurations and correctly save tab titles for all tabs that have them.
This is currently tested on gnome-terminal 3.2 but could be configured for any terminal program with a similar save-config functionality.
This requires the 'xprop', 'xdotool', and 'wmctrl' tools.
Code:
#!/usr/bin/env bash
FILE="$1"
gnome-terminal --save-config=$FILE
WINDOWLINES=$(wmctrl -lx | grep gnome-terminal.Gnome-terminal)
WINDOWNUM=$(echo "$WINDOWLINES" | wc -l)
TABLISTS=$(grep "^Terminals" $FILE)
for ((i=1; i<=$WINDOWNUM; i++))
do
WINDOWLINE=$(echo "$WINDOWLINES" | sed -n "$i{p;q}")
WINDOW_ID=$(echo "$WINDOWLINE" | cut -d' ' -f1)
#Switch to window
wmctrl -i -a $WINDOW_ID
LINE=$(echo "$TABLISTS" | sed -n "$i{p;q}"); LINE=${LINE#Terminals=}
TERMINALNUM=$(echo "$LINE" | grep -o ';' | wc -l)
#go to first tab of the window if more than 1
[ $TERMINALNUM -gt 1 ] && xdotool key alt+1 && sleep .1
for tab in ${LINE//;/ }
do
#Get the current tab title
TITLE=$(xprop -id $WINDOW_ID WM_NAME | sed -e 's/WM_NAME(STRING) = "//' -e 's/"$//')
#Insert it into the config file
[ "$TITLE" == "${TITLE//WM_NAME/}" ] && sed -ri "/\[${tab}\]/aTitle=${TITLE}" $FILE
#Move to the next tab in the window
xdotool key ctrl+Page_Down
done
done
Similar to Yoga's method, Edit >> Profile Preferences >> Title and Command >>Title >> When terminal commands set their own titles: >> Prepend initial title
Then execute:
gnome-terminals --save-config=terminals-cfg
Close terminal windows
Open a new terminal, and in it execute:
gnome-terminals --load-config=terminals-cfg
Works good for me, all titles kept.