開いているウィンドウ間を循環するには、wmctrlを使用します。

開いているウィンドウ間を循環するには、wmctrlを使用します。

アプリケーションの操作を簡単にするために使用したいスクリプトがあります。次に、アプリケーション名(最初のパラメータ)のウィンドウIDを取得して、存在することを確認しwindow_idます。存在しない場合は、コマンドを実行してアプリケーションを開きます(2番目のパラメーター)。存在する場合は、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にコマンドを追加します。AltS

答え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または同じダイアログを使用してループを変更して繰り返しを維持したり、必要なものをすべて変更したりできます。その後、必要に応じてショートカットキーを追加できます。 yadzenity

これを行うには、アプリケーションの実行コマンドとアプリケーションのウィンドウタイトル正規表現(特定のアプリケーションのウィンドウごとに異なる場合があります)を使用してスクリプトを実行する必要があります。

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ウィンドウ内。

関連情報