使用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])