Como abrir a última janela do terminal com uma tecla de atalho?

11

Eu uso o terminal com tanta frequência para fazer comandos rápidos e depois o deixo em segundo plano, para que eu tenha mais de 20 sessões de terminal abertas enquanto trabalho. Isso ocorre porque é muito rápido simplesmente usar a tecla de atalho e digitar um comando.

Existe uma maneira de configurar a tecla de atalho para abrir minha última janela do terminal em vez de criar uma nova?

Klik
fonte
1
uma versão editada deste seria uma solução? Seria drasticamente mais simples fazê-lo em uma única janela do terminal e fazê-lo desaparecer completamente. askubuntu.com/a/595244/72216, deixe-me saber, eu posso converter a resposta facilmente. Qual é o nome (janela) da janela do seu terminal?
Jacob Vlijm 19/03/2015
2
Tente isto
AB
O nome da janela que eu uso é simplesmente "Terminal". Mas o método de script que você possui ainda funcionaria se eu usasse as guias no terminal? (ou seja, ctrl + shift + T) Também os renomeio para ajudar a identificar em qual computador estou no servidor.
21415 Klik
Enquanto a string "terminal" estiver lá, ela o faria. Esse é o caso?
Jacob Vlijm
@JacobVlijm Não é o caso. Costumo mudar o nome para "ssh" ou "Local", dependendo do que estou fazendo. Eu poderia modificar meu script de alteração de título para incluir um prefixo exclusivo. Ou seja, '%.%' Ou algo assim.
Klik

Respostas:

13

Eu tenho um terminal preso à barra lateral do iniciador do Unity na posição 10. Dessa forma, posso pressionar Super+ 0para "clicar" no ícone do iniciador que traz a última janela do terminal para o topo.

insira a descrição da imagem aqui

Se tê-lo no iniciador é bom para você (uma das 10 primeiras posições, caso contrário não terá um atalho!), Isso funcionará.

Byte Commander
fonte
Oh, é uma ótima ideia! Gosto dessa resposta, mas vou esperar para ver o que as outras pessoas pensam. Eu estava pensando em criar um script usando o xdotool para encontrar o terminal e trazê-lo para a frente.
Klik
Penso que esta solução é a mais facilmente implementável e serve exatamente o propósito que estou procurando. Por esse motivo, vou marcar isso como a resposta.
Klik
10

Uso guake e estou muito feliz com isso. Pressione F12, uma janela do terminal será exibida, pressione F12 novamente, ele desaparecerá, mas continuará sendo executado em segundo plano. Além disso: parece muito legal.

Jos
fonte
Outro voto para o guake aqui. Vale a pena notar que, se você usar vários monitores (de tamanhos diferentes), algumas versões precisarão de uma correção para fazê-lo funcionar corretamente - ainda assim vale a pena.
Holloway
Tornei-me tão dependente do guake que, quando mudei para o xmonad, eu o emulei nisso. Deve ter!
Tony Martin
6

Você pode colocar o script abaixo em uma combinação de teclas. Se você pressionar a combinação de teclas, as janelas do terminal desaparecerão (completamente). Pressione novamente, eles aparecerão novamente exatamente no estado em que você estava.

A única coisa que você precisa (uma vez) é adicionar a sequência de identificação no nome da janela do seu terminal (a janela do terminal tem o mesmo nome na maioria dos casos)

Para usá-lo

Instale ambos xdotoole wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Copie o script em um arquivo vazio, salve-o como hide_terminal.py
  2. Na seção principal, defina a sequência de identificação do nome da janela do terminal
  3. Execute-o sob uma combinação de teclas:

    python3 /path/to/hide_terminal.py
    

O script

#!/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
fonte
1
Você tem um roteiro para tudo, não é? ; D
Byte Commander
1
@ByteCommander eu não posso resistir, é mais forte do que me :)
Jacob Vlijm
Observe que você também precisa alterar o nome do terminal na última linha, se não estiver usando gnome-terminal. Além disso, ele quebra se você tiver mais de um terminal aberto. No meu sistema, a primeira execução oculta a ativa, a segunda execução oculta a segunda e a terceira execução retorna apenas o segundo terminal. O primeiro está perdido para sempre.
terdon
@terdon Arrgh, você está certo! Corrigirá e fará com que oculte / mostre todas as janelas do terminal.
Jacob Vlijm 19/03/2015
Mais ao ponto, por que não fazer isso apenas no bash? Por que você traria python para ele se tudo o que você está fazendo com python é iniciar chamadas de sistema?
terdon
5

É a mesma coisa que a resposta de Jacob Vlijm, apenas escrita em 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

Se você salvar como ~/bin/show_hide.sh, poderá executá-lo, fornecendo a sequência de identificação de qualquer janela que deseja ocultar. Se nenhuma string for fornecida, ela funcionará em Terminal:

show_hide.sh Terminal
Terdon
fonte
1

Estou usando gnome-shella extensão 'Drop Down Terminal', o atalho padrão é, TABmas é facilmente alterado.

perdigueiro
fonte
1

Este comando wmctrl simples aumentará uma janela com uma determinada sequência no título ou, se não existir nenhuma janela contendo a sequência, execute um comando.

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

por exemplo, para o gedit eu posso usar

wmctrl -a gedit || gedit

Para encontrar uma sequência adequada para a janela do seu aplicativo, abra seu aplicativo e execute

wmctrl -l
Glen.S
fonte
0

a seguinte abordagem funcionou para mim:

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

basta conceder permissões de execução e vincular o script a uma chave nas configurações.

fonte:

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

DmitrySemenov
fonte
1
Adicione algumas partes importantes desse link, caso o link se quebre ou mude.
precisa saber é o seguinte