如何让 Alt+Tab 返回到上次使用的同一应用程序窗口(Unity)

如何让 Alt+Tab 返回到上次使用的同一应用程序窗口(Unity)

使用Alt+Tab通常可以实现我想要的效果;它将来自同一应用程序的窗口分组。如果我想在同一个应用程序的窗口之间切换,我会使用Alt+`

但是,如果我打开了多个终端窗口(例如),并且我使用Alt+Tab切换到另一个应用程序,然后切换回终端,则另一个终端窗口位于最后一个终端窗口的前面。

我如何强制它始终返回到同一个应用程序窗口,就像 gnome 3 那样?

Ubuntu 14.04 统一。

答案1

下面是一个在应用程序窗口间切换的脚本。它会记住所有正在运行的应用程序的最后使用的(=最前面的)窗口,从而绕过同一应用程序的其他窗口。

该脚本基于与脚本相同的原理这里,但由于脚本仅在按下组合键时运行,因此需要存储最后使用的窗口(每个应用程序)并在脚本(-的内存)之外读取。

如何使用

  • 该脚本使用wmctrl

      sudo apt-get install wmctrl
    
  • 将下面的脚本复制到一个空文件中,与alternative_switcher.py

  • 将其添加到快捷键组合中:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令:

      python3 /path/to/alternative_switcher.py
    
  • 将其作为与组合键一起使用的备用切换器。

笔记

脚本在“正常”应用程序窗口之间切换,如命令输出中定义的“_NET_WM_WINDOW_TYPE_NORMAL” xprop -id <window_id>。这意味着对话窗口将被排除在窗口列表之外,Idle例如,具有 pid 0 的窗口也是如此。

剧本

#!/usr/bin/env python3
import subprocess
import os
import getpass

home = os.environ["HOME"]
lastdir = home+"/.config/alternative_switcher"; wlist = lastdir+"/"+"wlist.txt"

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def get_frontmost():
    cmd = "xprop -root"
    frontmost = [l for l in get(cmd).splitlines() if\
                 "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
    return frontmost[:2]+"0"+frontmost[2:]
# read last used windowlist
if not os.path.exists(lastdir):
    os.makedirs(lastdir)
try:
    with open(wlist) as src:
        windowlist = eval(src.read())
except (FileNotFoundError, SyntaxError):
    windowlist = []
# creating window list: id, application name
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
[windowlist.remove(w) for w in windowlist if not w[1] in [data[0] for data in w_data]]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if "_NET_WM_WINDOW_TYPE_NORMAL" in get("xprop -id "+w[0])]
# get frontmost window + application
frontmost = [data for data in windows if data[1] == get_frontmost()][0]
[windowlist.remove(item) for item in windowlist if item[0] == frontmost[0]]
# add frontmost to  windowlist of last-used application windows
windowlist.insert(0, frontmost)
current_app = frontmost[0]
# determine next application
apps = sorted(set([w[0] for w in windows]))
next_app_i = apps.index(current_app)+1
if next_app_i == len(apps):
    next_app_i = 0
next_app = apps[next_app_i]
# find matching window to raise
try:
    next_w = [w[1] for w in windowlist if w[0] == next_app][0]
except IndexError:
    next_w = [w[1] for w in windows  if w[0] == next_app][0]
# write last- window list
with open(wlist, "wt") as out:
    out.write(str(windowlist))
# raise next window
cmd = "wmctrl -ia "+next_w
subprocess.Popen(["/bin/bash", "-c", cmd])

相关内容