30

I created a new profile for gnome-terminal and I can switch between "Implicit" profile and the new created profile as you can see in the below image:

Switch between profiles in gnome-terminal

Now I wonder how can I switch between profiles using a command-line/script or maybe using a shortcut for this.

Note: Solutions like:

gnome-terminal --tab-with-profile=Implicit && exit 

are excluded because I prefer not to close and open another terminal or get another terminal window in this process of changing the profile.

Radu Rădeanu
  • 169,590
  • 1
    With gconftool-2 you can set the profile whose changes are immediate . Have you checked this out-->http://stackoverflow.com/questions/660442/switch-gnome-terminal-profile-from-the-command-line – Stormvirux Aug 07 '13 at 20:10
  • @Stormvirux No... So can you explain how to use gconftool or gconftool-2 to switch the profile? I don't see a good answer/explanation there. – Radu Rădeanu Aug 07 '13 at 20:18
  • duplicate question: http://askubuntu.com/questions/247041/keyboard-shortcut-for-gnome-terminal-profile-change – Jakob Oct 07 '15 at 12:45

13 Answers13

13

A lot of great answers already but I wanted to add one more variation using xdotool that does not require the menu bar to be visible...

The key combo shift+F10 will open a pop-up menu (the equivalent of right-clicking on terminal) and from there the profile can be changed.

e.g. xdotool key shift+F10 r 3 to get to the third profile

I've also found that this method does not require setting a delay for xdotool (which I found necessary for the menu bar method) so it's therefore a little faster.

I tend to change profiles a lot so I wrap this into a function:

function chp(){
      xdotool key --clearmodifiers Shift+F10 r $1
}

so I can just call chp N to switch to the Nth profile.

Some more tips and idiosyncrasies of my setup:

  • By adding a chp command to my .bashrc I can force new tabs to always switch to the default profile

  • I color code my ssh sessions based on host but I don't like my ssh alias to open new tabs or windows AND I want the profile to change back to the default when I exit ssh. My solution: alias somehost="chp 2; ssh user@somehost; chp 1"

  • I give xdotool the flag --clearmodifiers so that if I happen to be holding a modifier key (when opening a tab/window, exiting ssh, etc.), it won't interfere with xdotool.

  • I prepend my profile names with numbers so that if I add a new one, it doesn't shift all the others due to the alphabetizing of the profile menu

9

To switch to the "implicit" profile:

xdotool key Alt+t p Return

To switch to the second profile:

xdotool key Alt+t p Down Return

xdotool Install xdotool is not installed by default in Ubuntu, so it must to be installed first.

Of course, for these commands can be added custom keyboard shortcuts.

Radu Rădeanu
  • 169,590
  • That's not a shortcut. You are only simulating the keypresses, is only mnemonics of the application. – Braiam Nov 14 '13 at 18:44
  • 1
    @Braiam Yes, it's not a shortcut, I can see. It's a command-line (see man xdotool for more info) as I asked, which is working exactly as I wish and I am happy with this answer until something better will appear. ;) – Radu Rădeanu Nov 14 '13 at 18:58
  • You seriously should consider suggesting that in the bugtracker... – Braiam Nov 14 '13 at 19:00
  • @Braiam As I told you, I'm ok with this solution, it's working like a charm. Regarding your suggestion, there is one in this sense from 2002 (modified in 2010: "It would be extra nice if I can use exactly two keystrokes to open the profile of my choice." - see this comment). So, why do you think that I should add a new one? Do you like duplicates? – Radu Rădeanu Nov 14 '13 at 20:49
  • It no longer works unfortunaltely – Rob Audenaerde Jan 27 '17 at 09:04
  • I can't open the menu with Alt+t anymore. However it is possible to change the profile from the context menu, so xdotool key Menu Up Up Up Right Return/xdotool key Menu Up Up Up Right Down Return works. – jazzpi Feb 05 '19 at 15:16
3

There is no shortcut that allows you to change the profile within the terminal (without navigating the menus as you said in comments), without the use of the GUI. Quoting the manual (stable, development 3.9):

You can change the profile in your current Terminal tab or window by selecting a profile from Terminal ▸ Change Profile.

(You can propose this as suggestion in the bug tracker)

Braiam
  • 67,791
  • 32
  • 179
  • 269
  • Actually, there is a shortcut: Alt+T followed by P, Up Arrow or Down Arrow and Enter. But this is a little bit long... – Radu Rădeanu Aug 07 '13 at 20:33
  • @RaduRădeanu Alt + T doesn't work in my terminal 3.8.3 :/ – Braiam Aug 07 '13 at 20:49
  • 2
    @RaduRădeanu I guess alt+t is in fact using the GUI, it's just not using mouse. – moon.musick Aug 19 '13 at 20:10
  • @Braiam If you are using non-English version of the gnome-terminal, press alt and see what letter is being highlighted for your language version of 'Terminal' (it's 5th item in my Polish version, just left of 'Help'), then use that letter with alt. – moon.musick Aug 19 '13 at 20:14
  • @moon.musick I'm using the Debian version of gnome-terminal 3.8.3, and seem that it doesn't have the Alt modifier to access the menus. – Braiam Sep 09 '13 at 16:27
  • @Braiam I am using precise or precise-derived systems (i.e. Mint Maya) everywhere, I guess I'll have to find some machine to install non-LTS Ubuntu versions on it just to answer questions here ;) Anyways, in my 3.4.1.1-0ubuntu1 version in the Menu->Edition->Shortcuts (or something, Polish here again) the first checkbox is 'Menu Access Keys' with an example of alt+p opening 'Plik' (File) menu. Have you got that checkbox available and is the function on? – moon.musick Sep 09 '13 at 17:10
  • @moon.musick meh, found the option. Edit->Prefecence, General tab, Enable mnemonics (such Alt + F for File menu) was deactivated. Maybe, Gnome team change defaults in 3.8 (too many things changed) or I unknowingly deactivate the option. The stable manual page has an entry for such things. – Braiam Sep 09 '13 at 17:18
  • Personally, I had unchecked that preference to disable those keyboard shortcuts, and I'm loathe to re-enable it again, because it prevents Alt-x keypresses from being passed to the application running in the terminal (e.g. there are blog posts suggesting users map 'Alt-h/j/k/l' to select active window within vim) Perhaps the Gnome team had similar thoughts. – Jonathan Hartley Jan 25 '16 at 15:53
3

I was looking to do the same and finally got a script working, I put it up on my GitHub.

Like I explain in the README.md, it doesn't actually switch, but loads a profiles configuration into the Default profile. To do this, the configuration of each profile is saved to file on the first run of the script. The script makes it seem like you're switching between profiles, which is good enough for me. Hope it helps anyone...

2

Depending on your purpose, you may find this script to be useful: https://github.com/xyrix/gnome-terminal-profile-switcher

It does a sort of monkey patch and generates a new profile for each terminal, then sets some environment variables to expose a program for switching the theme of the profile for your current terminal.

Hopefully the example safe_ssh script will make things clear :-). I've been using it for just over a year now and it's helped me not destroy the company's live database ^_^

xyrix
  • 31
  • 1
2

If you have a list of servers that you access often, I believe the easiest solution would be to simply invoke a second window just for that box's session.

First, make a separate gnome-terminal profile for each remote location that you use often. Then, in each profile, specify that the terminal should execute the SSH login command for that box, instead of a plain shell.

ssh alice@athena

Finally, write a short script to kick off a new remote window given a profile ID.

#!/bin/bash
if [[ $# -ne 1 ]] ; then
  echo "Give me a server/profile name!"
  exit 1
fi
gnome-terminal --window-with-profile=$1
exit 0

Using this strategy you can "infinitely" vary the look of each box's terminal window, and kick them off from a single "control" terminal. For example, if we call this script "rlv", then we can spawn a remote window by simply invoking the script with a profile name.

>> rlv athena

If you ever fat-finger a host name, or neglect to set up a profile for that host, then you'll just get another default-profile window on the local box. There's a way to code the script to avoid this, by putting the login into the script itself, rather than in the gnome-terminal :

#!/bin/bash
if [[ $# -ne 1 ]] ; then
  echo "Give me a server/profile name!"
  exit 1
fi
gnome-terminal --window-with-profile=$1 -e "ssh $1"
exit 0

...but then you lose the flexibility of defining your login username for that box. That additional feature of the script I leave as an exercise to the reader.

  • Thanks for providing me with that idea. :-) I'd like to add that you can easily write a .desktop file that will open your favorite locations with a (double)-click that way. – Hinz Jul 19 '19 at 08:02
1

Even though the question is about GNOME Terminal and the command line, it's worth knowing that MATE Terminal (a GNOME Terminal fork) allows profile switching via a simple keyboard shortcut.

santos
  • 11
  • 1
1

I've just noticed that my original solution has been already rejected in the question. While there seems no simple way to change the profile, you can change background / foreground color by using setterm command.

So, this setterm -term linux -background black -foreground green would give you black background with green text. The only problem is that ls has colorized output, so you might wanna turn ls coloring off. Otherwise it resets to previous color scheme

Original post: There is a sort-of way around. From man gnome-terminal :

--window-with-profile=PROFILENAME

             Open a new window containing a  tab  with  the
             given profile.  More than one of these options
             can be provided.

Here's example from my machine. I have three profiles: B&G(black on green), ForPrinting(black font, white background), and Default. So what I do is in current window type gnome-terminal --window-with-profile=ForPrinting . Then I can either kill old window from command line or switch and close it graphically.

B&G profile doesn't work. Probably because & is not a valid character, so keep that in mind when naming profiles.

Sergiy Kolodyazhnyy
  • 105,154
  • 20
  • 279
  • 497
1

It would be great of gnome-terminal offered a "next profile" command and shortcut; unfortunately, it does not.

A workaround for those with Alt+T disabled (Edit > Preferences > Enable mnemonics - unchecked) is: F10 left left down right and select the profile. Ouch.

Mario
  • 161
0

This is a rather old post, but because it kept coming up while I was searching to solve this same issue, I thought I would post my solution.

This involves a small python script and remapping the CTRL+ALT+T button to run the script instead of simply launching the terminal.

Create a text file, I named mine terminal.py and make sure it is executible. Place the following code in it. This will open the terminal windows using all available profiles in sequence making sure that the one marked "default" is the first in the list.

#!/usr/bin/python
#
# Launch a gnome-terminal window trying to assign each new window 
# to a different profile.
# 
import json
import os
import commands

profiles=[]

try:
    profileList = commands.getoutput("gsettings get org.gnome.Terminal.ProfilesList list").replace("'",'"')
    profileDefault = commands.getoutput("gsettings get org.gnome.Terminal.ProfilesList default").replace("'",'"')

    profiles.append(json.loads(profileDefault))
    ls = json.loads(profileList)
    ls.remove(profiles[0])
    profiles+=ls

    # find the next available terminal number
    # when terminals are closed, gaps in the numbers can happen
    # terminals are numeric and the lowest slot is filled first
    terminals = commands.getoutput("ls /dev/pts/  | grep -E '^[0-9]+$'").split("\n")
    next = 0
    try:
        while terminals.index(str(next))>=0:
            next += 1
    except:
        pass

    # determine the profile to use
    prof = next % len(profiles)

    # launch the terminal with the specific profile
    cmd="gnome-terminal --window-with-profile='%s'" % (profiles[prof])
    os.system(cmd)
except:
    # if anything fails, launch a default terminal
    print("error")
    os.system("gnome-terminal")

Use the keyboard settings utility to assign a new shortcut to this script. For me I reassigned CTRL+ALT+T because that is the shortcut I am use to for opening a terminal window.

Be sure to create several profiles in your terminal. This script will make use of all of your profiles. So the more you create, the more variations on windows you can get access too. I have several that are all identical except for the background color. This helps me recognize them as I alt-tab through them.

Terminal Window Example

schworak
  • 871
0

How to have a different color scheme in each new Terminal Window

The accepted answer using xdotool works, but introduces bugs. Here's a cleaner way.

First the explanation, then the code.

Explanation

  1. There is a way to create a new terminal window with the specified profile if you know the UUID.

    gnome-terminal --profile='7e95bbb3-a584-469d-8ae1-75a08287f55a'
    

    So if we can inject this command in some way, we're done. We'd like this to happen in all these cases:

    • when we open the terminal using a shortcut CtrlAltT
    • when we open the terminal using the icon in the taskbar
    • when we open the terminal using the search
  2. The gnome-terminal resides in /usr/bin/gnome-terminal and might be updated by the distro.

    /usr/local/bin is for normal user programs not managed by the distribution package manager, e.g. locally compiled packages. You should not install them into /usr/bin because future distribution upgrades may modify or delete them without warning.
    Source

  3. The $PATH checks /usr/local/bin before /usr/local:

    $ echo $PATH 
    /home/generic/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    

    So we can create a file /usr/local/bin/gnome-terminal which will take precedence. If we ever need to circumvent our version, we'd have to use the full path to the original /usr/bin/gnome-terminal.

  4. Create that file and paste the code below. Then make it executable with sudo chmod +x /usr/local/bin/gnome-terminal.

Code

#!/bin/bash
set -euo pipefail
# get list of possible profiles, then choose one line at random
line="$(dconf list /org/gnome/terminal/legacy/profiles:/ | grep -e '^:' | shuf -n 1)"
# then remove the leading colon and trailing slash
line="${line#:}"
line="${line%/}"
#/usr/bin/gnome-terminal --profile='7e95bbb3-a584-469d-8ae1-75a08287f55a'
# but also pass all arguments. The profile chosen will always be the last one if there are multiple arguments, so we allow the input to override our setting.
/usr/bin/gnome-terminal --profile="$line" "$@"

Example Looks

I'm using some profiles from https://mayccoll.github.io/Gogh/ enter image description here


Maybe you could also use update-alternatives as a similar alternative approach. I have not tested that.

lucidbrot
  • 1,311
  • 3
  • 18
  • 39
0

Actually gnome-terminal's --tab-with-profile can be useful if used right.

In .bashrc set something like:

if [ -z "${choose_term_profile}" ]; then
  if [ -z "${SSH_TTY}" ]; then   #is not from ssh
    #      ${SSH_CONNECTION} , ${SSH_CLIENT}
    if [ "`xtermcontrol --get-bg`" = "rgb:ffff/ffff/ffff" ]; then
      #if php date_sun_info sunset/sunrise
      choose_term_profile=1 gnome-terminal --tab-with-profile=black && exit
    fi
  fi
fi

To change without new tab, but have to be like typing, on Wayland:

sudo ydotool key shift+F10
#if it is not root (sudo) it may be "Aborted (core dumped)"
sleep 1; sudo ydotool key r
sleep 1; sudo ydotool key 2
#                      or 1 for first profile

xdotool has the same syntax.

Sam
  • 65
  • 4
0

The very ugly solution I've ended up using is

unset x y
eval $(xwininfo -id $(xdotool getactivewindow) |
       sed -n -e 's/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p' \
              -e 's/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p')
xdotool mousemove $(($x + 50)) $(($y + 50))
xdotool click 3; xdotool key --repeat 3 Up; xdotool key Right; xdotool key --delay 50 Down; xdotool key --delay 50 Return

(This selects the second profile, but you could change that to say the htir profile by changing the second "key Down" command to xdotool key --delay 50 --repeat 2 Down.

What's this doing:

  1. find the the top left coordinates of the current window (eg. the gnome terminal in use).
  2. move the mouse to be over that terminal
  3. right click and navigate the context menu to select the second profile.

You'll need xdotool installed sudo apt install xdotool.

Kind of extraordinary that the terminal itself doesn't doesn't allow configuration via the terminal!