開いているウィンドウ間を循環するには、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__

おすすめ記事