Comment faire apparaître la dernière fenêtre du terminal avec une touche de raccourci?

11

J'utilise le terminal si souvent pour faire des commandes rapides, puis je le laisse en arrière-plan pour que j'ouvre plus de 20 sessions de terminal pendant que je travaille. En effet, il est très rapide d'utiliser simplement la touche de raccourci et de taper une commande.

Existe-t-il un moyen de configurer la touche de raccourci pour que j'ouvre ma dernière fenêtre de terminal au lieu d'en créer une nouvelle?

Klik
la source
1
une version éditée de celui-ci serait-elle une solution? Il serait extrêmement simple de le faire pour une seule fenêtre de terminal et de le faire disparaître complètement. askubuntu.com/a/595244/72216 faites le moi savoir, je peux convertir la réponse facilement. Quel est le nom (fenêtre) de votre fenêtre de terminal?
Jacob Vlijm
2
Essayez ceci
AB
Le nom de la fenêtre que j'utilise est simplement "Terminal". Mais la méthode de script que vous avez là-bas fonctionnerait-elle toujours si j'utilise des onglets dans le terminal? (c'est-à-dire ctrl + shift + T) Je les renomme également pour aider à identifier l'ordinateur sur lequel je suis connecté.
Klik
Tant que la chaîne "terminal" est là, elle le serait. Est-ce le cas?
Jacob Vlijm
@JacobVlijm Ce n'est pas le cas. Je change souvent le nom en "ssh" ou "Local" selon ce que je fais. Je pourrais cependant modifier mon script de changement de titre pour inclure un préfixe unique. C'est à dire '%.%' Ou quelque chose comme ça.
Klik

Réponses:

13

J'ai un terminal épinglé sur la barre latérale du lanceur Unity en position 10. De cette façon, je peux appuyer sur Super+ 0pour "cliquer" sur l'icône du lanceur, ce qui amène la dernière fenêtre de terminal en haut.

entrez la description de l'image ici

Si l'avoir dans le lanceur vous convient (l'une des 10 premières positions, sinon il n'aura pas de raccourci!), Cela fonctionnera.

Byte Commander
la source
Oh, c'est une excellente idée! J'aime cette réponse, mais je vais attendre de voir ce que les autres trouveront. Je pensais faire un script en utilisant xdotool pour trouver le terminal et l'amener au premier plan.
Klik
Je pense que cette solution est la plus facile à mettre en œuvre et répond exactement à l'objectif que je recherche. Pour cette raison, je vais marquer cela comme la réponse.
Klik
10

J'utilise guake et j'en suis très content. Appuyez sur F12, une fenêtre de terminal apparaît, appuyez à nouveau sur F12, elle disparaît mais continue de fonctionner en arrière-plan. Aussi: l'air vraiment cool.

Jos
la source
Un autre vote pour guake ici. Il convient de noter que si vous utilisez plusieurs moniteurs (de tailles différentes), certaines versions ont besoin d'un correctif pour le faire fonctionner correctement - cela en vaut quand même la peine.
Holloway
Je suis devenu tellement dépendant de guake que lorsque je suis passé à xmonad, je l'ai émulé. Doit avoir!
Tony Martin
6

Vous pouvez mettre le script ci-dessous sous une combinaison de touches. Si vous appuyez sur la combinaison de touches, la ou les fenêtres de terminal disparaîtront (complètement). Appuyez à nouveau, ils réapparaîtront exactement dans l'état où vous l'aviez.

La seule chose que vous devez faire (une fois) est d'ajouter la chaîne d'identification dans le nom de la fenêtre de votre terminal (la fenêtre du terminal a le même nom dans la plupart des cas)

Pour l'utiliser

Installez les deux xdotoolet wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Copiez le script dans un fichier vide, enregistrez-le sous hide_terminal.py
  2. Dans la section head, définissez la chaîne d'identification du nom de la fenêtre du terminal
  3. Exécutez-le sous une combinaison de touches:

    python3 /path/to/hide_terminal.py
    

Le scénario

#!/usr/bin/env python3
import subprocess
import os

home = os.environ["HOME"]
hidden_windowid = home+"/.window_id.txt"

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
# --- set the identifying string in the terminal window's name below (you mentioned "Terminal"
window_idstring = "Special_window"
# ---
def execute(cmd):
    subprocess.check_call(cmd)

w_id = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines() if window_idstring in l]
if len(w_id) !=0:
    for w in w_id:
        execute(["xdotool", "windowunmap", w])
        with open(hidden_windowid, "a") as out:
            out.write(w+"\n")
else:
    try:
        with open(hidden_windowid) as read:
            for w in [w.strip() for w in read.readlines()]:
                try:
                    execute(["xdotool", "windowmap", w])
                except subprocess.CalledProcessError:
                    pass
        with open(hidden_windowid, "wt") as clear:
            clear.write("")
    except FileNotFoundError:
        pass
Jacob Vlijm
la source
1
Vous avez un script pour tout, n'est-ce pas? ; D
Byte Commander
1
@ByteCommander Je ne peux pas résister, c'est plus fort que moi :)
Jacob Vlijm
Notez que vous devez également modifier le nom du terminal dans la dernière ligne si vous n'utilisez pas gnome-terminal. En outre, il se casse si vous avez plusieurs terminaux ouverts. Sur mon système, la 1ère manche masque celle active, la 2ème manche masque la seconde et la 3ème ne renvoie que le 2ème terminal. Le 1er est perdu à jamais.
terdon
@terdon Arrgh, vous avez raison! Le réparera et le fera masquer / afficher toutes les fenêtres du terminal.
Jacob Vlijm
Plus précisément, pourquoi ne pas simplement faire cela en bash? Pourquoi voudriez-vous y intégrer python si tout ce que vous faites avec python est de lancer des appels système?
terdon
5

C'est la même chose que la réponse de Jacob Vlijm, juste écrite en bash:

#!/usr/bin/env bash

## window_name will be the first argument passed or, if no
## argument was given, "Terminal"
window_name=${1:-"Terminal"}

## Get the list of open terminals
terms=( $(wmctrl -l | grep "$window_name" | cut -d ' ' -f 1) )

## If all terminals are hidden
if [ -z "${terms[0]}" ]
then
    ## Read the IDs of hidden windows from .hidden_window_id
    while read termid
    do
        xdotool windowmap "$termid"
    done < ~/.hidden_window_id
## If there are visible terminals
else
    ## Clear the .hidden_window_id file
    > ~/.hidden_window_id
    ## For each open terminal
    for i in "${terms[@]}"
    do
        ## Save the current ID into the file
        printf "%s\n" "$i" >> ~/.hidden_window_id
        ## Hide the window
        xdotool windowunmap "$i"
    done
fi

Si vous l'enregistrez sous ~/bin/show_hide.sh, vous pouvez l'exécuter en donnant la chaîne d'identification de toute fenêtre que vous souhaitez masquer. Si aucune chaîne n'est donnée, cela fonctionnera sur Terminal:

show_hide.sh Terminal
terdon
la source
1

J'utilise gnome-shellavec l'extension «Drop Down Terminal», le raccourci par défaut est TABmais il est facilement modifié.

perdigueiro
la source
1

Cette simple commande wmctrl lèvera une fenêtre avec une chaîne donnée dans le titre ou s'il n'existe aucune fenêtre contenant la chaîne, exécutez une commande.

wmctrl -a <str> || <command to launch application>

par exemple pour gedit je peux utiliser

wmctrl -a gedit || gedit

Pour trouver une chaîne adaptée à la fenêtre de votre application, ouvrez votre application et exécutez

wmctrl -l
Glen.S
la source
0

l'approche suivante a fonctionné pour moi:

#!/usr/bin/env bash

# Written by Eric Zhiqiang Ma (http://www.ericzma.com)
# Last update: Jul. 9, 2014

# Read the tutorials at
# http://www.systutorials.com/5475/turning-gnome-terminal-to-a-pop-up-terminal/

# Required tools: xdotool

terminal="gnome-terminal"
stat_file="/dev/shm/actiavte-termianl.term.$USER"
termtype="Terminal"
wait_sec=1
max_wait_cnt=4

# parse options first
if [ "$1" != "" ]; then
    terminal="$1"
fi


term_exists () {
    allterms=`xdotool search --class "$termtype"`
    for e in $allterms; do [[ "$e" == "$1" ]] && return 0; done
    return 1
}

create_terminal () {
    echo "Create new terminal"
    $terminal --maximize &

    exists=1
    wait_cnt=0
    until [ "$exists" == "0" ]; do
        # sleep a while
        sleep $wait_sec

        # Note that the focus window may be from a terminal that
        # already exists; the makes create_terminal choose the existing terminal
        # Making the wait_sec large enough so that the terminal can be created and
        # displayed can make the false choosing more unlikely.

        term=$(xdotool getwindowfocus)
        term_exists "$term"
        exists=$?
        # avoid infinite wait
        let wait_cnt=wait_cnt+1
        if [ $wait_cnt -gt $max_wait_cnt ]; then
            echo "Wait for too long. Give up."
            term=""
            exists=0
        fi
    done

    echo "Created terminal window $term"
    # save the state
    echo "$term" >$stat_file
}

# read the state
if [ -f $stat_file ]; then
    term=$(cat $stat_file)
fi

# check whether it exists
term_exists "$term"
exists=$?
if [[ "$exists" != "0" ]]; then
    create_terminal
    exit 0
fi

# check whether it is already activated
curwin=$(xdotool getwindowfocus)

if [ "$term" == "$curwin" ]; then
    # deactivate (minimize) the terminal if it is currently activated
    xdotool windowminimize $curwin
else
    # activate the terminal if it is not currently activated
    xdotool windowactivate $term
fi

exit 0

puis donnez-lui simplement les autorisations d'exécution et liez le script à une clé dans les paramètres.

la source:

http://www.systutorials.com/5475/turning-gnome-terminal-to-a-pop-up-terminal/

DmitrySemenov
la source
1
Ajoutez des parties importantes de ce lien au cas où le lien se romprait ou changerait.
George Udosen