Я часто использую терминал для написания кода в vim
, и, поскольку мой терминал прозрачен, я могу видеть, что за ним стоит, поэтому, если у меня есть руководство за ним в окне браузера или что-то в этом роде, затем я могу ссылаться на него, не переключаясь на него и не располагая его рядом с окном моего терминала, чего я предпочитаю не делать, так как оба окна становятся довольно маленькими.
Но есть один недостаток: мне часто приходится копировать и вставлять текст, перемещаться по странице за терминалом, искать что-то на нем и т. Д.
И чтобы сделать это, мне нужно переключиться на это то, что я не люблю делать, так что было бы лучше, если бы был способ сделать это так, чтобы в gnome-terminal
, когда я нажимал определенную комбинацию клавиш, чтобы он заставлял мой курсор проходить через текущее окно (который является прозрачным и должен оставаться наверху), чтобы я мог взаимодействовать с окном позади (например, для копирования и вставки текста, перемещения по странице и поиска вещей на странице) gnome-terminal
фактически не перемещаясь к нему или не помещая его перед окном gnome-terminal
.
Конечно, при повторном нажатии на сочетание клавиш - или, может быть, на другое, если это невозможно сделать с помощью того же ярлыка, - все должно вернуться к нормальному состоянию, как это было до того, как я впервые нажал на ярлык, который заставил меня взаимодействовать с окно позади.
Я также хотел бы, чтобы моя клавиатура взаимодействовала с окном позади, а не только с моим курсором. И я также хотел бы, чтобы это относилось только к приложению gnome-terminal
, поскольку я не хочу, чтобы это происходило с любыми другими приложениями.
Можно ли это сделать?
Я использую Ubuntu GNOME 15.10 с GNOME 3.18.
Не буквально, что Вы попросили, но если бы у Вас есть сочетание клавиш, которое автоматически распознало бы обоих gnome-terminal
- окно и окно непосредственно ниже его, Вы могли переключиться (переключаются) между двумя быстро без дальнейшего усилия.
Установка делает точно что: Если (и только если) или активное окно или окно непосредственно ниже его являются a gnome-terminal
окно, сценарий заставляет их переключить места, как показано в изображениях. Я оставил несколько несоответствующих окон, чтобы проиллюстрировать, что они не принимают участие в переключателе:
И так далее. Как упомянуто, это только произойдет, если любое из самых верхних окон будет принадлежать gnome-terminal
.
Потребность сценария (сценариев) wmctrl
sudo apt-get install wmctrl
Сохраните оба сценария ниже в одном и том же каталоге, начиная с одной из функций импорта сценариев от другого:
Сценарий 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