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

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

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

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

当然,再次按下键盘快捷键 - 或者如果不能使用相同的快捷键完成此操作,则可以按下不同的快捷键 - 应该可以恢复正常,就像在我第一次按下快捷键之前一样,这使我与后面的窗口进行了交互。

我还希望我的键盘能够与后面的窗口交互,而不仅仅是我的光标。我还希望这只适用于应用程序,gnome-terminal因为我不希望这种情况发生在任何其他应用程序中。

这能做到吗?

我正在运行带有 GNOME 3.18 的 Ubuntu GNOME 15.10。

答案1

这并不是您真正想要的,但如果您有一个组合键可以自动识别窗口gnome-terminal和其正下方的窗口,您就可以快速地在两者之间切换(切换)而无需进一步努力。

该设置正是这样做的:如果(并且仅当)活动窗口或其正下方的窗口是窗口时gnome-terminal,脚本才会让它们交换位置,如图所示。我留下了一些不相关的窗口来说明它们不参与切换:

  1. gnome-terminal在窗口上方有一个窗口gedit

    在此处输入图片描述

  2. 按下快捷键:

    在此处输入图片描述

  3. 再按一次:

    在此处输入图片描述

等等。如上所述,这种情况只有在以下情况下才会发生:最顶层的窗口之一属于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

打开一个新的终端窗口和一个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
    

相关内容