Jak wyświetlić ostatnie okno terminala za pomocą klawisza skrótu?

11

Tak często używam terminala do szybkich poleceń, a potem zostawiam go w tle, aby w trakcie pracy otworzyć ponad 20 sesji terminalu. Jest tak, ponieważ bardzo szybko wystarczy po prostu użyć klawisza skrótu i ​​wpisać polecenie.

Czy istnieje sposób skonfigurowania klawisza skrótu, aby wyświetlić ostatnie okno terminala zamiast tworzenia nowego?

Klik
źródło
1
czy edytowana wersja tego byłaby rozwiązaniem? Byłoby to znacznie prostsze, gdyby zrobić to dla pojedynczego okna terminala i sprawić, że całkowicie zniknie. askubuntu.com/a/595244/72216 daj mi znać, mogę łatwo przekonwertować odpowiedź. Jak nazywa się (okno) okno twojego terminalu?
Jacob Vlijm
2
Spróbuj tego
AB
Nazwa okna, której używam, to po prostu „Terminal”. Ale czy zastosowana tam metoda skryptu nadal będzie działać, jeśli użyję tabulatorów w terminalu? (tj. Ctrl + Shift + T) Zmieniam też ich nazwy, aby pomóc zidentyfikować komputer, do którego jestem wprowadzony.
Klik
Tak długo, jak istnieje ciąg „terminal”. Czy tak jest w przypadku?
Jacob Vlijm,
@JacobVlijm Tak nie jest. Często zmieniam nazwę na „ssh” lub „Local” w zależności od tego, co robię. Mogę jednak zmodyfikować skrypt zmieniający tytuł, aby zawierał unikalny prefiks. Tj. „%.%” Lub coś w tym rodzaju.
Klik

Odpowiedzi:

13

Mam terminal przypięty do paska bocznego programu uruchamiającego Unity na pozycji 10. W ten sposób mogę nacisnąć Super+, 0aby „kliknąć” ikonę programu uruchamiającego, która przenosi ostatnie okno terminala na górę.

wprowadź opis zdjęcia tutaj

Jeśli posiadanie go w programie uruchamiającym jest dla Ciebie odpowiednie (jedna z pierwszych 10 pozycji, w przeciwnym razie nie dostanie skrótu!), To zadziała.

Bajt Dowódca
źródło
Och, to świetny pomysł! Podoba mi się ta odpowiedź, ale poczekam, aby zobaczyć, co wymyślą inni ludzie. Myślałem o stworzeniu skryptu przy użyciu xdotool, aby znaleźć terminal i przenieść go na pierwszy plan.
Klik
Myślę, że to rozwiązanie jest najłatwiejsze do wdrożenia i służy dokładnie temu, czego szukam. Z tego powodu oznaczę to jako odpowiedź.
Klik
10

Używam guake i jestem z tego bardzo zadowolony. Naciśnij F12, pojawi się okno terminala, naciśnij F12 ponownie, znika, ale działa w tle. Ponadto: wygląda naprawdę fajnie.

Jos
źródło
Kolejny głos na guake tutaj. Warto zauważyć, że jeśli używasz wielu monitorów (o różnych rozmiarach), niektóre wersje wymagają poprawki, aby działała poprawnie - nadal warto.
Holloway,
Tak bardzo uzależniłem się od guake'a, że ​​po przejściu na xmonad emulowałem to. Muszę mieć!
Tony Martin
6

Możesz umieścić poniższy skrypt pod kombinacją klawiszy. Po naciśnięciu kombinacji klawiszy okno (okna) terminala zniknie (całkowicie). Naciśnij go ponownie, pojawią się ponownie dokładnie w takim stanie, w jakim byłeś.

Jedyne, co musisz (raz) zrobić, to dodać ciąg identyfikujący do nazwy okna terminala (w większości przypadków okno terminala ma tę samą nazwę)

Aby go użyć

Zainstalować zarówno xdotoola wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Skopiuj skrypt do pustego pliku i zapisz go jako hide_terminal.py
  2. W sekcji nagłówka ustaw ciąg identyfikujący nazwę okna terminala
  3. Uruchom w kombinacji klawiszy:

    python3 /path/to/hide_terminal.py
    

Scenariusz

#!/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
źródło
1
Masz skrypt na wszystko, prawda? ; D
Bajt Dowódca
1
@ByteCommander Nie mogę się oprzeć, jest silniejszy ode mnie :)
Jacob Vlijm
Pamiętaj, że musisz także zmienić nazwę terminala w ostatnim wierszu, jeśli nie używasz gnome-terminal. Ponadto psuje się, jeśli masz więcej niż jeden otwarty terminal. W moim systemie 1. uruchomienie ukrywa aktywny, 2. uruchomienie ukrywa drugi, a 3. uruchomienie zwraca tylko drugi terminal. 1 miejsce przepadło na zawsze.
terdon
@terdon Arrgh, masz rację! Naprawi to i ukryje / pokaż wszystkie okna terminala.
Jacob Vlijm
Co więcej, dlaczego nie zrobić tego w bashu? Dlaczego miałbyś wprowadzać do niego Pythona, jeśli wszystko, co robisz z Pythonem, to uruchamianie wywołań systemowych?
terdon
5

To jest to samo, co odpowiedź Jacoba Vlijma, napisana po prostu 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

Jeśli zapiszesz go jako ~/bin/show_hide.sh, możesz go uruchomić, podając ciąg identyfikacyjny dowolnego okna, które chcesz ukryć. Jeśli nie zostanie podany ciąg, będzie działać na Terminal:

show_hide.sh Terminal
terdon
źródło
1

Używam gnome-shellz rozszerzeniem „Drop Down Terminal”, domyślny skrót jest, TABale można go łatwo zmienić.

perdigueiro
źródło
1

Ta prosta komenda wmctrl podniesie okno z danym ciągiem w tytule lub, jeśli nie ma okna zawierającego ciąg, uruchom polecenie.

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

np. do gedit mogę użyć

wmctrl -a gedit || gedit

Aby znaleźć odpowiedni ciąg dla okna aplikacji, otwórz aplikację i uruchom

wmctrl -l
Glen.S
źródło
0

działało dla mnie następujące podejście:

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

po prostu daj mu uprawnienia do wykonywania i powiąż skrypt z kluczem w ustawieniach.

źródło:

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

DmitrySemenov
źródło
1
Dodaj kilka ważnych części z tego linku na wypadek, gdyby link się zepsuł lub zmienił.
George Udosen,