如何在快捷键按下时与gnome-terminal后面的窗口进行交互?

我经常使用终端在vim编写代码,并且由于我的终端是透明的,我能够看到它背后的内容,所以如果我在浏览器窗口后面有一本手册或类似的东西,那么我可以参考它不需要切换到它或必须让它在我的终端窗口旁边,我不喜欢这样做,因为两个窗口变得相当小。

但有一个缺点,我经常需要复制和粘贴文本,在终端后面的页面上移动,搜索它上面的东西等。
要做到这一点,我必须切换到我不喜欢做的,所以如果有一种方法可以使它在gnome-terminal ,当我按某个键盘快捷键时,会更好。让它让我的光标穿过当前窗口(这是透明的并且应该保持在顶部),这样我就可以与后面的窗口进行交互(例如复制和粘贴文本,向下移动页面,以及搜索页面上的东西) gnome-terminal没有实际移动到它或放在gnome-terminal窗口的前面。

当然再次按下它们的键盘快捷键 – 或者如果不能用相同的快捷键完成另一个键盘快捷键 – 应该将事情恢复正常以及它们在我第一次按下使我与后面的窗口交互的快捷方式之前的状态。

我也想让我的键盘与后面的窗口进行交互而不仅仅是我的光标。 我也希望这只是gnome-terminal应用程序的情况,因为我不希望任何其他应用程序发生这种情况。

可以这样做吗?

我正在使用GNOME 3.18运行Ubuntu GNOME 15.10。

不是你要求的字面意思,但是如果你有一个自动识别gnome-terminal -window和它正下方窗口的组合键,你可以快速切换(切换)两者之间而不需要进一步的努力。

设置正是如此: 如果 (并且仅当)活动窗口或其正下方的窗口是gnome-terminal窗口,脚本会使它们切换位置,如图像所示。 我留下了几个不相关的窗口来说明他们没有参加切换:

  1. gedit窗口顶部有一个gnome-terminal窗口:

    在此处输入图像描述

  2. 按快捷键:

    在此处输入图像描述

  3. 再按一次:

    在此处输入图像描述

等等。 如上所述,只有当最顶层的窗口中的任何一个属于gnome-terminal时才会发生这种情况。

如何设置

  1. 脚本需要wmctrl

     sudo apt-get install wmctrl 
  2. 将以下两个脚本保存在同一个目录中 ,因为其中一个脚本从另一个脚本导入函数:

    脚本1
    保存为(确切地说) z_list.py
    这实际上是一个后台脚本,跟踪窗口的z顺序。 z-order不能通过wmctrlxdotool等“普通”工具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 

打开一个新的终端窗口和(例如) gedit窗口。 聚焦gedit窗口并在其上打开一个新的终端窗口。 然后在终端窗口中运行命令:

 python3 /path/to/toggle_terminal.py 

窗户应该改变位置(顺序)。 不幸的是,由于gedit窗口现在处于活动状态,你将无法再次运行命令(在终端中)使终端窗口再次登顶。 您可以假设它将从快捷键起作用。

如果一切正常,请将设置永久化:

  • z_list.py添加到启动应用程序:Dash>启动应用程序>添加命令:

     /bin/bash -c "sleep 15 && python3 /path/to/z_list.py" 
  • 将脚本2添加到快捷键组合中:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加命令:

     python3 /path/to/toggle_terminal.py