¿Cómo abrir la última ventana de terminal con una tecla de acceso directo?

11

Utilizo el terminal con tanta frecuencia para hacer comandos rápidos y luego lo dejo en segundo plano para que termine teniendo más de 20 sesiones de terminal abiertas mientras estoy trabajando. Esto se debe a que es muy rápido simplemente usar la tecla de acceso directo y escribir un comando.

¿Hay alguna manera de configurar la tecla de acceso directo para que aparezca mi última ventana de terminal en lugar de crear una nueva?

Klik
fuente
1
¿Sería una solución una versión editada de este? Sería drásticamente más simple hacerlo para una sola ventana de terminal y hacer que desaparezca por completo. askubuntu.com/a/595244/72216 hágamelo saber, puedo convertir la respuesta fácilmente. ¿Cuál es el nombre (ventana) de su ventana de terminal?
Jacob Vlijm
2
Prueba esto
AB
El nombre de la ventana que uso es simplemente "Terminal". ¿Pero el método de script que tiene allí todavía funcionaría si uso pestañas en la terminal? (es decir, ctrl + shift + T) También les cambio el nombre para ayudar a identificar en qué computadora estoy metido.
Klik
Mientras la cadena "terminal" esté allí, lo haría. ¿Es este el caso?
Jacob Vlijm
@JacobVlijm No es el caso. A menudo cambio el nombre a "ssh" o "Local" dependiendo de lo que estoy haciendo. Sin embargo, podría modificar mi script de cambio de título para incluir un prefijo único. Es decir, '%.%' O algo así.
Klik

Respuestas:

13

Tengo un terminal fijado a la barra lateral del iniciador de Unity en la posición 10. De esta manera puedo presionar Super+ 0para "hacer clic" en el ícono del iniciador que lleva la última ventana del terminal a la parte superior.

ingrese la descripción de la imagen aquí

Si tenerlo en el iniciador está bien para usted (una de las primeras 10 posiciones, de lo contrario no obtendrá un acceso directo), esto funcionará.

Byte Commander
fuente
Oh, esa es una gran idea! Me gusta esta respuesta, pero voy a esperar para ver qué piensan otras personas. Estaba pensando en hacer un script usando xdotool para encontrar el terminal y llevarlo al frente.
Klik
Creo que esta solución es la más fácil de implementar y cumple exactamente el propósito que estoy buscando. Por esa razón marcaré esto como la respuesta.
Klik
10

Yo uso guake y estoy muy contento con él. Presione F12, aparece una ventana de terminal, presione F12 nuevamente, desaparece pero sigue ejecutándose en segundo plano. Además: se ve realmente genial.

Jos
fuente
Otro voto para guake aquí. Vale la pena señalar que si usa varios monitores (de diferentes tamaños), algunas versiones necesitan una solución para que funcione correctamente, aunque todavía vale la pena.
Holloway
Se volvió tan dependiente de guake que cuando cambié a xmonad lo emulé en eso. ¡Debe tener!
Tony Martin
6

Puede colocar el script a continuación bajo una combinación de teclas. Si presiona la combinación de teclas, las ventanas del terminal desaparecerán (completamente). Presiónelo nuevamente, aparecerán nuevamente exactamente en el estado que tenía.

Lo único que necesita hacer (una vez) es agregar la cadena de identificación en el nombre de la ventana de su terminal (la ventana de la terminal tiene el mismo nombre en la mayoría de los casos)

Para usarlo

Instale ambos xdotooly wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Copie el script en un archivo vacío, guárdelo como hide_terminal.py
  2. En la sección de cabecera, configure la cadena de identificación del nombre de la ventana de terminal
  3. Ejecútelo bajo una combinación de teclas:

    python3 /path/to/hide_terminal.py
    

La secuencia de comandos

#!/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
fuente
1
Tienes un guión para todo, ¿no? ; D
Byte Commander
1
@ByteCommander No puedo resistirme, es más fuerte que yo :)
Jacob Vlijm
Tenga en cuenta que también debe cambiar el nombre del terminal en la última línea si no lo está utilizando gnome-terminal. Además, se rompe si tiene más de un terminal abierto. En mi sistema, la primera ejecución oculta la activa, la segunda ejecución oculta la segunda y la tercera ejecución solo devuelve la segunda terminal. El primero está perdido para siempre.
terdon
@terdon Arrgh, tienes razón! Lo arreglará y lo hará ocultar / mostrar todas las ventanas de terminal.
Jacob Vlijm
Más al punto, ¿por qué no hacer esto en bash? ¿Por qué incorporarías Python si todo lo que estás haciendo con Python es iniciar llamadas al sistema?
terdon
5

Esto es lo mismo que la respuesta de Jacob Vlijm, recién escrita 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 lo guarda como ~/bin/show_hide.sh, puede ejecutarlo dando la cadena de identificación de cualquier ventana que desee ocultar. Si no se proporciona una cadena, funcionará en Terminal:

show_hide.sh Terminal
terdon
fuente
1

Estoy usando gnome-shellcon la extensión 'Terminal desplegable', el acceso directo predeterminado es TABpero se cambia fácilmente.

perdigueiro
fuente
1

Este simple comando wmctrl abrirá una ventana con una cadena dada en el título o, si no existe una ventana que contenga la cadena, ejecute un comando.

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

por ejemplo, para gedit puedo usar

wmctrl -a gedit || gedit

Para encontrar una cadena adecuada para la ventana de su aplicación, abra su aplicación y ejecute

wmctrl -l
Glen.S
fuente
0

el siguiente enfoque funcionó para mí:

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

luego solo dale permisos de ejecución y vincula el script a una clave en la configuración.

fuente:

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

DmitrySemenov
fuente
1
Agregue algunas partes importantes de ese enlace en caso de que el enlace se rompa o cambie.
George Udosen