Как взаимодействовать с окном за gnome-терминалом при нажатии комбинации клавиш?

Я часто использую терминал для написания кода в vim, и, поскольку мой терминал прозрачен, я могу видеть, что за ним стоит, поэтому, если у меня есть руководство за ним в окне браузера или что-то в этом роде, затем я могу ссылаться на него, не переключаясь на него и не располагая его рядом с окном моего терминала, чего я предпочитаю не делать, так как оба окна становятся довольно маленькими.

Но есть один недостаток: мне часто приходится копировать и вставлять текст, перемещаться по странице за терминалом, искать что-то на нем и т. Д.
И чтобы сделать это, мне нужно переключиться на это то, что я не люблю делать, так что было бы лучше, если бы был способ сделать это так, чтобы в gnome-terminal, когда я нажимал определенную комбинацию клавиш, чтобы он заставлял мой курсор проходить через текущее окно (который является прозрачным и должен оставаться наверху), чтобы я мог взаимодействовать с окном позади (например, для копирования и вставки текста, перемещения по странице и поиска вещей на странице) gnome-terminal фактически не перемещаясь к нему или не помещая его перед окном gnome-terminal.

Конечно, при повторном нажатии на сочетание клавиш - или, может быть, на другое, если это невозможно сделать с помощью того же ярлыка, - все должно вернуться к нормальному состоянию, как это было до того, как я впервые нажал на ярлык, который заставил меня взаимодействовать с окно позади.

Я также хотел бы, чтобы моя клавиатура взаимодействовала с окном позади, а не только с моим курсором. И я также хотел бы, чтобы это относилось только к приложению gnome-terminal, поскольку я не хочу, чтобы это происходило с любыми другими приложениями.

Можно ли это сделать?

Я использую Ubuntu GNOME 15.10 с GNOME 3.18.

3
задан 22 November 2015 в 22:42

1 ответ

Не буквально, что Вы попросили, но если бы у Вас есть сочетание клавиш, которое автоматически распознало бы обоих gnome-terminal - окно и окно непосредственно ниже его, Вы могли переключиться (переключаются) между двумя быстро без дальнейшего усилия.

Установка делает точно что: Если (и только если) или активное окно или окно непосредственно ниже его являются a gnome-terminal окно, сценарий заставляет их переключить места, как показано в изображениях. Я оставил несколько несоответствующих окон, чтобы проиллюстрировать, что они не принимают участие в переключателе:

  1. Наличие a gnome-terminal окно сверху a gedit окно:

    enter image description here

  2. Нажатие ярлыка:

    enter image description here

  3. Нажмите его снова:

    enter image description here

И так далее. Как упомянуто, это только произойдет, если любое из самых верхних окон будет принадлежать gnome-terminal.

Как настроить

  1. Потребность сценария (сценариев) wmctrl

    sudo apt-get install wmctrl
    
  2. Сохраните оба сценария ниже в одном и том же каталоге, начиная с одной из функций импорта сценариев от другого:

    Сценарий 1
    быть сохраненным как (точно) z_list.py:
    Это - на самом деле фоновый сценарий, отслеживание z-порядка окон. Z-порядок не может быть определен "нормальными" инструментами как wmctrl или xdotool. Запущение простого скрипта для отслеживания в настоящее время активное окно, даст нам z-порядок как бы то ни было.

    #!/usr/bin/env python3
    import subprocess
    import time
    import os
    
    rootdata = os.environ["HOME"]+"/.focus_history"
    
    def current_windows():
        try:
            return subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
        except subprocess.CalledProcessError:
            pass
    
    def convert_format(w_id):
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def read_data():
        return open(rootdata).read().splitlines()
    
    def get_top(wlist):
        try:
            top = convert_format([l.split("#")[-1].strip() for l in \
               subprocess.check_output(["xprop", "-root"]).decode("utf-8").splitlines() \
                   if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0])       
            return [l for l in wlist if top in l][0]
        except IndexError:
            pass
    
    if __name__ == "__main__":
        open(rootdata, "wt").write("This is an empty line")
        while True:
            time.sleep(0.5)
            wdata = current_windows()
            if wdata != None:
                wlist = wdata.splitlines()
                # get frontmost window (as in wmctrl -lG)
                top = get_top(wlist)
                oldlist = read_data()
                if not any([top == oldlist[0], top == None]):
                    # clean up closed windows
                    [oldlist.remove(l) for l in oldlist if not l.split()[0] in wdata]
                    # remove possible other mentions of the active window
                    [oldlist.remove(l) for l in oldlist if l.startswith(top.split()[0])]
                    open(rootdata, "wt").write(("\n").join([top]+oldlist))
    

    Сценарий 2
    быть сохраненным как toggle_terminal.py:
    Как упомянуто, сохраните этот сценарий в одном и том же каталоге, вместе с z_list.py.

    #!/usr/bin/env python3
    import subprocess
    import z_list
    
    try:
        termpid = subprocess.check_output(["pidof", "gnome-terminal"]).decode("utf-8").strip()
        wlist = z_list.read_data(); top = wlist[0]; second = wlist[1]
        if any([termpid in top, termpid in second]):
            subprocess.Popen(["wmctrl", "-ia", second.split()[0]])
    except subprocess.calledProcessError:
        pass
    

Как использовать

Так как фоновый сценарий отслеживает активные окна и создает z-порядок тот путь, он должен работать перед открытием (по крайней мере), окон, которые требуется переключить, предпочтительно как Приложение Запуска.

Протестировать:

Откройте окно терминала, запустите фоновый скрипт командой:

python3 /path/to/z_list.py

Откройте новое окно терминала и (например). a gedit окно. Сфокусируйтесь gedit окно и открытый новое окно терминала сверху его. Затем выполненный в окне терминала команда:

python3 /path/to/toggle_terminal.py

Окна должны поменяться местами (заказывают). К сожалению, Вы не сможете выполнить команду снова (в терминале) для обеспечения окна терминала к вершине снова, начиная с gedit окно теперь активно :). Можно принять однако, что это будет работать от сочетания клавиш.

Если все хорошо работает, сделайте установку постоянной:

  • Добавить z_list.py Запускать Приложения: Тире> Приложения Запуска> Добавляет команду:

    /bin/bash -c "sleep 15 && python3 /path/to/z_list.py"
    
  • Добавьте сценарий 2 к комбинации сочетания клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/toggle_terminal.py
    
2
ответ дан 23 November 2015 в 08:42

Другие вопросы по тегам:

Похожие вопросы: