Wie rufe ich das letzte Terminalfenster mit einer Tastenkombination auf?

11

Ich benutze das Terminal so oft, um schnelle Befehle zu erteilen, und lasse es dann im Hintergrund, sodass am Ende mehr als 20 Terminalsitzungen geöffnet sind, während ich arbeite. Dies liegt daran, dass es sehr schnell ist, einfach die Tastenkombination zu verwenden und einen Befehl einzugeben.

Gibt es eine Möglichkeit, die Tastenkombination so einzurichten, dass ich mein letztes Terminalfenster aufrufe, anstatt ein neues zu erstellen?

Klik
quelle
1
Wäre eine bearbeitete Version davon eine Lösung? Es wäre drastisch einfacher, dies für ein einzelnes Terminalfenster zu tun und es vollständig verschwinden zu lassen. askubuntu.com/a/595244/72216 Lassen Sie mich wissen, ich kann die Antwort einfach konvertieren. Wie lautet der (Fenster-) Name Ihres Terminalfensters?
Jacob Vlijm
2
Versuchen Sie dies
AB
Der Fenstername, den ich benutze, ist einfach "Terminal". Aber würde die Skriptmethode, die Sie dort haben, immer noch funktionieren, wenn ich Registerkarten im Terminal verwende? (dh Strg + Umschalt + T) Ich benenne sie ebenfalls um, um festzustellen, auf welchen Computer ich sshed bin.
Klik
Solange der String "terminal" da ist, würde es. Ist das der Fall?
Jacob Vlijm
@ JacobVlijm Das ist nicht der Fall. Ich ändere den Namen oft in "ssh" oder "Local", je nachdem, was ich tue. Ich könnte mein Titeländerungsskript so ändern, dass es ein eindeutiges Präfix enthält. Dh '%.%' Oder so ähnlich.
Klik

Antworten:

13

Ich habe ein Terminal an meiner Unity Launcher-Seitenleiste an Position 10 befestigt. Auf diese Weise kann ich Super+ drücken, um 0auf das Launcher-Symbol zu "klicken", das das neueste Terminalfenster nach oben bringt.

Geben Sie hier die Bildbeschreibung ein

Wenn es für Sie in Ordnung ist, es im Launcher zu haben (eine der ersten 10 Positionen, sonst wird keine Verknüpfung angezeigt!), Funktioniert dies.

Byte Commander
quelle
Oh, das ist eine großartige Idee! Ich mag diese Antwort, aber ich werde abwarten, was andere Leute sich einfallen lassen. Ich dachte daran, mit xdotool ein Skript zu erstellen, um das Terminal zu finden und nach vorne zu bringen.
Klik
Ich denke, diese Lösung ist am einfachsten zu implementieren und erfüllt genau den Zweck, den ich suche. Aus diesem Grund werde ich dies als Antwort markieren.
Klik
10

Ich benutze Guake und bin sehr zufrieden damit. Drücken Sie F12, ein Terminalfenster wird angezeigt, drücken Sie erneut F12, es verschwindet, läuft aber weiter im Hintergrund. Auch: sieht echt cool aus.

Jos
quelle
Eine weitere Abstimmung für Guake hier. Wenn Sie mehrere Monitore (unterschiedlicher Größe) verwenden, benötigen einige Versionen eine Korrektur, damit sie ordnungsgemäß funktionieren - es lohnt sich jedoch trotzdem.
Holloway
Wurde so abhängig von Guake, dass ich es darin emulierte, als ich zu xmonad wechselte. Haben müssen!
Tony Martin
6

Sie können das folgende Skript unter eine Tastenkombination setzen. Wenn Sie die Tastenkombination drücken, verschwinden die Terminalfenster (vollständig). Drücken Sie erneut darauf, sie werden genau in dem Zustand wieder angezeigt, in dem Sie sie hatten.

Sie müssen nur (einmal) die identifizierende Zeichenfolge in den Fensternamen Ihres Terminals einfügen (das Terminalfenster hat in den meisten Fällen den gleichen Namen).

Um es zu benutzen

Installieren Sie beide xdotoolund wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter hide_terminal.py
  2. Legen Sie im Kopfabschnitt die identifizierende Zeichenfolge des Namens des Terminalfensters fest
  3. Führen Sie es unter einer Tastenkombination aus:

    python3 /path/to/hide_terminal.py
    

Das Skript

#!/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
quelle
1
Sie haben für alles ein Skript, nicht wahr? ; D
Byte Commander
1
@ ByCommander Ich kann nicht widerstehen, es ist stärker als ich :)
Jacob Vlijm
Beachten Sie, dass Sie auch den Namen des Terminals in der letzten Zeile ändern müssen, wenn Sie nicht verwenden gnome-terminal. Außerdem wird es unterbrochen, wenn Sie mehr als ein offenes Terminal haben. Auf meinem System verbirgt der erste Lauf den aktiven, der zweite Lauf den zweiten und der dritte Lauf gibt nur das zweite Terminal zurück. Der 1. ist für immer verloren.
Terdon
@terdon Arrgh, du hast recht! Behebt das Problem und lässt es alle Terminalfenster ausblenden / anzeigen.
Jacob Vlijm
Mehr auf den Punkt, warum nicht einfach in Bash tun? Warum sollten Sie Python einbinden, wenn Sie mit Python nur Systemaufrufe starten?
Terdon
5

Dies ist das Gleiche wie die Antwort von Jacob Vlijm, die gerade in Bash geschrieben wurde:

#!/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

Wenn Sie es als speichern ~/bin/show_hide.sh, können Sie es ausführen, indem Sie die identifizierende Zeichenfolge eines Fensters angeben, das Sie ausblenden möchten. Wenn keine Zeichenfolge angegeben wird, funktioniert dies wie folgt Terminal:

show_hide.sh Terminal
Terdon
quelle
1

Ich verwende gnome-shelldie Erweiterung "Dropdown-Terminal". Die Standardverknüpfung ist, kann TABaber leicht geändert werden.

perdigueiro
quelle
1

Dieser einfache Befehl wmctrl löst ein Fenster mit einer bestimmten Zeichenfolge im Titel aus. Wenn kein Fenster mit der Zeichenfolge vorhanden ist, führen Sie einen Befehl aus.

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

zB für gedit kann ich verwenden

wmctrl -a gedit || gedit

Öffnen Sie Ihre Anwendung und führen Sie sie aus, um eine geeignete Zeichenfolge für Ihr Anwendungsfenster zu finden

wmctrl -l
Glen.S
quelle
0

Der folgende Ansatz hat bei mir funktioniert:

#!/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

Geben Sie ihm dann einfach Ausführungsberechtigungen und binden Sie das Skript an einen Schlüssel in den Einstellungen.

Quelle:

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

DmitrySemenov
quelle
1
Fügen Sie einige wichtige Teile dieses Links hinzu, falls der Link unterbrochen oder geändert wird.
George Udosen