Shortcut to bring all open terminals to the front

14,784

Solution 1

You can press Alt+Tab to switch forward between windows and Alt+Shift+Tab to switch back between windows. This shortcut is made to work in almost all graphical operating systems. Yow can also use Super+W and arrow keys for the same purpose.

After you bring one terminal window in the front, press Alt+~ to bring all other terminal windows in the front one by one:

switch to windows


To automatically bring all open terminals in the front (not one by one as I described before) you will need to add a keyboard shortcut for the following script (script taken from Adobe's answer and improved considering that version of script hasn't worked for me):

#!/bin/bash

if [ $# -ne 1 ];then
  echo -e "Usage: `basename $0` PROGRAM_NAME\n
           For example:\n\t
           '`basename $0` gnome-terminal' for Terminal\n\t
           '`basename $0` firefox' for Firefox\n\t
           '`basename $0` chromium-browser' for Chromium\n\t..."
  exit 1
fi

pids=" $(pidof $@) "

if [ "$pids" = "  " ]; then # the string "  " contain two spaces
    echo "There is no program named '$@' opened at the moment."
    exit 1
fi

wmctrl -lp | while read identity desktop_number PID window_title; do 
    if [ "${pids/ $PID }" != "$pids" ]; then
        wmctrl -ia $identity
    fi
done

Don't forget to make the script executable:

chmod +x /path/to/script/script_name

After you test the script in terminal, you must to see:

Solution 2

Here's a small bash script which brings all the windows whose title matches ARG to the front:

bring-all-windows.bash ARG

The script:

#!/bin/bash

Program=$@

wmctrl -l | while read Window; do
    if [[ "$Window" == *"$Program"* ]]; then
        echo "DEBUG: I bring $Window"
        code=`echo "$Window" | cut -f 1 -d " "`
        wmctrl -i -a $code
    fi
done

You can bind

bring-all-windows.bash Terminal

to a hotkey (don't forget to put the script in a login shell PATH, or write a full path to it).

The script requires wmctrl to be installed.

Edit:

To run something from the terminal, navigate to the dir where you put the script, then

chmod +x bring-all-windows.bash
./bring-all-windows.bash Terminal

When you're sure it works from the terminal, try to bind it to a hotkey, giving the full path. When you're sure it works with a hotkey and the full path to the script, then try adding it's dir to the login shell PATH, and see if it works that way.

Solution 3

Another way is using xdotool. You should install it first so sudo apt-get install xdotool is mandatory.

xdotool search --class "terminal" windowactivate %@
xdotool search --name "braiam@bt" windowactivate %@

The first look for any binary called *terminal*, the second looks for any window that has as title *braiam@bt*. Then if you put that into a bash script:

#!/bin/bash

set -e
program=$@

xdotool search --class '$program' windowactivate %@
xdotool search --name '$program' windowactivate %@

You can know more about this in the xdotool manual.

Share:
14,784

Related videos on Youtube

TomSelleck
Author by

TomSelleck

Updated on September 18, 2022

Comments

  • TomSelleck
    TomSelleck over 1 year

    After I navigate out to a webpage or editor, is there any way to bring all the open terminals back to the front in their original positions? It is a bit of a pain clicking the terminal icon and then bringing each one back individually.

    Thanks!

    Example:

    • Pre-shortcut:

    Pre-image shortcut


    • Post-shortcut:

    Post-image shortcut

  • TomSelleck
    TomSelleck over 10 years
    Thanks but that is essentially the same as clicking the terminal icon and selecting each one to bring to the front. I mean a short cut which will bring all open terminals to the front. An example being I could be writing code in gedit, want to compile it in one terminal while watching the output of a log in another terminal.
  • TomSelleck
    TomSelleck over 10 years
    This sounds good! I will give it a try shortly and get back to you. I'm still a bit stumped as to why there isn't a native method for this, it seems like it should be natural.
  • Adobe
    Adobe over 10 years
    @Tomcelic: There's a wmctrl and bash: that's natural.
  • TomSelleck
    TomSelleck over 10 years
    True but it's not native :P
  • TomSelleck
    TomSelleck over 10 years
    Is there any chance you would mind running through how to use this script?? I have created the script and saved it in my home folder and added it's path to /etc/shells. I have also added a shortcut in keyboard settings with the name bring_terminals_forward and the command is bash /home/michael/Scripts/bring-all-windows.bash Terminal
  • TomSelleck
    TomSelleck over 10 years
    Running the script directly from a running terminal doesn't seem to work either... It works for programs like gedit, but not for Terminal
  • Carlos Campderrós
    Carlos Campderrós over 10 years
    "Screenshot will be taken in 1 second"... hmm someone just lied here...
  • Radu Rădeanu
    Radu Rădeanu over 10 years
    @Tomcelic See my new edits. Want to say that I was working on such a script while Adobe has posted his How to Answer(which for me hasn't worked), so please do not take this in the wrong way.
  • Adobe
    Adobe over 10 years
    @Tomcelic: see edit of the answer.
  • Radu Rădeanu
    Radu Rădeanu over 10 years
    @Adobe See this answer to see why in same cases the script will not work.
  • Adobe
    Adobe over 10 years
    @RaduRădeanu: Isn't it obvious from the script that the window title should have Terminal, and if You don't have it there -- either think of different string, or add the Terminal to the window title. There's a possiblity to debug things built-in into the script, so it shouldn't be a problem to fix issues. I'd claim that the basic idea is fine: loop over windows, bring all matching regexp/glob. I saw Your script -- it isn't minimal any more.