web-dev-qa-db-ja.com

xdotool:タイトルとクラスが異なるパターンでウィンドウを検索する方法(AutoHotkeyと同様)

xdotoolでは、searchサブコマンドを使用してウィンドウを検索できます。 「gvim」クラスと「TODO」という単語を含むタイトルを持つウィンドウを見つける必要があります。どうすればよいですか?

私が試したこと:

  • できるよ xdotool search --name --class、ただし名前とタイトルの両方にoneパターンのみを受け入れます。
  • xdotoolはコマンドチェーンをサポートしていますが、2つの検索呼び出しをチェーンする方法を見つけることができませんでした。
10
t7ko

Xdotoolのヘルプで、2つのスイッチが同じであることがわかります(xdotoolバージョン3.20150503.1)。

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

そのため、何もしません。私のxdotoolはウィンドウスタックを置き換えることであなたと同じことをするので、シェルスクリプトでそれを行いました。あなたが望むことをするシェルスクリプトは以下に提供されます:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

タイトルのどこにでも出現できるように、TODOの部分文字列照合を行うために、ifステートメントのアスタリスクがそこにあります。

13
D.S

Unix-wayの短いソリューションを特定できました。

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)
6
t7ko

これは、UNIXの方法に準拠した別のソリューションです。

一見すると、あなたのものほど美しくありません、@ t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

しかし、我慢してください!その中にいくつかの隠された美しさがあります。

つまり、それ

  1. ツリー構造の代わりにlinear structureがあり、2次元ではなく1次元のように
  2. より多くのよく知られているシェル構文を使用します。
  3. 実際にあなたの質問に答えます:それはlocatesウィンドウです。

(これらの点が利点であるかどうかはコンテキストに依存します-この側面を無視しましょう*。)

ステップごとに理解しやすくするために、同じコードをより構造化されたレイアウトで以下に示します。
しかし、インデントはコマンドを説明するためのものであることに注意してください。それはネストなどを示すものではなく、すべて線形のUNIXパイプラインです。

同じコマンド、パイプの後に分割するだけ(|):

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
    sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

上記の完全なコマンドは、gvimウィンドウのピクセル位置を示し、現在の(仮想の可能性がある)画面の左上隅を基準にしたピクセル座標をx,yのように42,433のように返します。 -5375,-3809が4 x 4の仮想画面の最初にあり、現在の画面が右側のどこかにある場合。

とりあえず、コマンドを短くしてX11ウィンドウIDのみを見つけるようにします-多分それがOPに実際に必要なもののすべてです。

短縮されたコマンドパイプライン、各行の個別のシェルコマンド:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO'

これで、読みやすくなりました。

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool search --all --pid {} --name 'TODO' 

xdotoolコマンドsearchを使用して、 "class" gvimのウィンドウを検索し、「内部」ウィンドウを除外します。結果はPID(プロセスID)としてリストされます。
PIDごとに、xargsが別のxdotool searchを実行し、TODOを確認した後、サンプルパターンPIDの「名前」を確認します。

(念のため:\で終了する行-継続行と呼ばれます-は実際には\で終了し、改行の前に空白がない必要があります。)

元のコマンドに戻ります:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool \
        search --all --pid {} --name 'TODO' \
        getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

残りの部分には、位置を含むウィンドウに関するいくつかの詳細がリストされています。 sedコマンドは、x,y位置の値のみを照合して返します。

例として、16番目の仮想画面(4 x 4)の上部でコマンドを実行し、画面1で "TODO" gvimを実行します。

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*)免責事項:私は@ t7koのコードを好みます。たくさん!

3
Volker Siegel

短くてエレガントな答え(wmctrlを使用):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

結果のウィンドウIDは16進数であるため、10進数に変換する必要があります(xdotoolで使用):

printf "%d\n" $result

次に、xdotoolで何でもできます。

1
Yan King Yin