Как вызвать последнее окно терминала с помощью комбинации клавиш?

11

Я так часто использую терминал для выполнения быстрых команд, а затем оставляю его в фоновом режиме, так что в итоге я получаю более 20 открытых сеансов терминала во время работы. Это потому, что очень быстро просто использовать сочетание клавиш и ввести команду.

Есть ли способ настроить комбинацию клавиш, чтобы я вызывал мое последнее окно терминала вместо создания нового?

Клик
источник
1
Отредактированная версия этого будет решением? Было бы значительно проще сделать это для одного окна терминала и заставить его полностью исчезнуть. askubuntu.com/a/595244/72216 дайте мне знать, я могу преобразовать ответ легко. Какое (оконное) имя окна вашего терминала?
Джейкоб Влейм
2
Попробуйте это
AB
Имя окна, которое я использую, просто «Терминал». Но будет ли метод сценария у вас там все еще работать, если я использую вкладки в терминале? (т. е. Ctrl + Shift + T) Я также переименую их, чтобы помочь определить, на каком компьютере я сброшен.
Klik
Пока есть строка «терминал», она будет. Это правда?
Джейкоб Влейм
@JacobVlijm Это не тот случай. Я часто меняю имя на «ssh» или «Local» в зависимости от того, что я делаю. Я мог бы изменить свой сценарий изменения названия, чтобы включить уникальный префикс, хотя. Т.е. «%.%» Или что-то в этом роде.
Klik

Ответы:

13

У меня есть терминал, прикрепленный к боковой панели модуля запуска Unity в позиции 10. Таким образом, я могу нажать Super+, 0чтобы «щелкнуть» значок модуля запуска, который выводит последнее окно терминала вверх.

введите описание изображения здесь

Если он у вас есть в лаунчере (одна из первых 10 позиций, иначе он не получит ярлык!), Это сработает.

Byte Commander
источник
О, это отличная идея! Мне нравится этот ответ, но я буду ждать, чтобы увидеть, что придут другие люди. Я думал о создании сценария с использованием xdotool для поиска терминала и вывода его на передний план.
Klik
Я думаю, что это решение наиболее легко реализуемо и служит именно той цели, которую я ищу. По этой причине я отмечу это как ответ.
Klik
10

Я использую Guake, и я очень доволен этим. Нажмите F12, появится окно терминала, нажмите F12 снова, оно исчезает, но продолжает работать в фоновом режиме. Также: выглядит действительно круто.

Jos
источник
Еще один голос за Guake здесь. Стоит отметить, что если вы используете несколько мониторов (разных размеров), некоторые версии нуждаются в исправлении, чтобы оно работало должным образом - хотя оно того стоит.
Холлоуэй
Стало настолько зависимым от guake, что когда я переключился на xmonad, я подражал ему в этом. Должны быть!
Тони Мартин
6

Вы можете поместить скрипт ниже под комбинацией клавиш. Если вы нажмете комбинацию клавиш, окна терминала исчезнут (полностью). Нажмите еще раз, они снова появятся точно в том состоянии, в котором вы были.

Единственное, что вам нужно сделать (один раз), это добавить идентификационную строку в имя окна вашего терминала (в большинстве случаев окно терминала имеет такое же имя)

Использовать его

Установите оба xdotoolи wmctrl:

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. Скопируйте скрипт в пустой файл, сохраните его как hide_terminal.py
  2. В разделе заголовка установите строку идентификатора имени окна терминала
  3. Запустите его под комбинацией клавиш:

    python3 /path/to/hide_terminal.py
    

Сценарий

#!/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
Якоб Влейм
источник
1
У вас есть сценарий для всего, не так ли? ; D
Byte Commander
1
@ByteCommander Я не могу устоять, он сильнее меня :)
Джейкоб Влейм
Обратите внимание, что вам также нужно изменить имя терминала в последней строке, если вы не используете gnome-terminal. Также он ломается, если у вас более одного открытого терминала. В моей системе первый прогон скрывает активный, второй прогон скрывает второй, а третий прогон возвращает только второй терминал. 1-й потерян навсегда.
тердон
@terdon Arrgh, ты прав! Это исправит и заставит скрыть / показать все окна терминала.
Джейкоб Влейм
Более того, почему бы просто не сделать это в Bash? Зачем вам вносить в него python, если все, что вы делаете с python, - это запуск системных вызовов?
тердон
5

Это то же самое, что ответ Якоба Влейма, только что написанный на 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

Если вы сохраните его как ~/bin/show_hide.sh, вы можете запустить его, задав строку идентификации любого окна, которое вы хотите скрыть. Если строка не указана, она будет работать с Terminal:

show_hide.sh Terminal
terdon
источник
1

Я использую gnome-shellрасширение «Drop Down Terminal», ярлык по умолчанию есть, TABно его легко изменить.

perdigueiro
источник
1

Эта простая команда wmctrl вызовет окно с заданной строкой в ​​заголовке или, если окно, содержащее эту строку, не существует, выполните команду.

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

например, для gedit я могу использовать

wmctrl -a gedit || gedit

Чтобы найти подходящую строку для окна вашего приложения, откройте ваше приложение и запустите

wmctrl -l
Glen.S
источник
0

следующий подход работал для меня:

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

затем просто дайте ему разрешение на выполнение и привяжите скрипт к ключу настроек.

источник:

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

DmitrySemenov
источник
1
Добавьте некоторые важные части из этой ссылки на случай, если ссылка сломается или изменится.
Джордж Удосен