我有一个脚本,我试图用它来使处理应用程序更容易。现在它获取应用程序名称的窗口 ID(第一个参数)并检查它是否window_id
存在。如果它不存在,它会运行命令来打开该应用程序(第二个参数)。如果它存在,它会用来wmctrl
获取窗口window_id
并将其移动到前面。
我的计划是将此脚本添加到我经常使用的每个应用程序的快捷方式中。但是,我想添加循环浏览应用程序打开的所有窗口的功能,而不是仅仅能够打开最后一个打开的窗口。关于如何在 bash 中执行此操作有什么建议吗?我需要设置全局系统变量吗?虽然很明显,但我对 bash 还很陌生。这是windowctl的脚本,我要扩展的地方是函数get_window_id
。
#!/bin/bash
#command [app_name] [app_command]
function get_window_id() {
#this is the part I want to extend
window_id=$(wmctrl -l | grep -i "$1" | tail -1 | cut -f1 -d" ")
}
function open_app() {
exec $2
}
get_window_id $1
if [ -z $window_id ]
then
open_app $1 $2
else
wmctrl -i -a "$window_id"
fi
一个例子是将命令添加windowctl sublime subl3
到Alt+ S。
答案1
我长期以来一直在使用lonew
为此命名的迷你脚本。它是 的缩写"lastof or new"
。lastof
是我的另一个脚本,它尝试查找与最近访问的给定命令匹配的可见窗口。
两个脚本如下:
(他们可能会使用一些重构,但他们完成了工作)
洛纽:
#!/bin/bash
CMD="$1"; shift; ARGS="$@"
lastof $CMD || { echo $CMD $ARGS; $CMD $ARGS & }
disown
最后:
#!/usr/bin/env ruby
#open-last
#List all windows and sort them by the time they were last accessed
require 'shellwords'
XTIME="_NET_WM_USER_TIME"
QARGV=ARGV.map {|arg| Shellwords.escape(arg)}
ids=IO.popen "xdotool search --onlyvisible #{QARGV.join(" ")}"
max_time_id=nil
max_time=nil
ids.each_line do |id|
id.chomp!
puts "id=#{id}"
time=`xprop -id #{id} #{XTIME}`.split('=')[1].to_i
max_time||=time
max_time_id||=id
if time > max_time
max_time=time
max_time_id=id
end
end
exit(1) unless max_time_id
puts "Switching to ID: #{max_time_id}"
exit system("xdotool windowactivate #{max_time_id}")
__END__
答案2
也许这正是您正在寻找的东西。我刚刚使用了,但您可以使用诸如或 之类sleep
的对话框,并更改循环以使其保持循环,或者您需要的任何内容。然后您可以根据需要添加热键。 yad
zenity
它要求您使用应用程序的启动命令以及应用程序的窗口标题正则表达式(对于特定应用程序,每个窗口可能会有所不同)来启动脚本。
shortname=$1
case $shortname in
(firefox) cmd='firefox'; rx='Mozilla Firefox$';;
(nautilus) cmd='nautilus'; rx=' (-|—) File Browser';;
(*) echo 'unknown shortname'; exit;;
esac
id=( $(wmctrl -l | awk "/$rx/"'{print $1}') )
(( !${#id[@]} )) && { "$cmd" & exit; }
for (( i=0; i<${#id[@]}; i++ )) ;do
wmctrl -i -a ${id[i]}
sleep 3
done
请注意,wmctrl
无法激活(交互)特定的标签在应用程序的 X 窗口内。