xdotool:さまざまなモードでタイトルとクラスでウィンドウを検索する方法(AutoHotkeyに似ています)

xdotool:さまざまなモードでタイトルとクラスでウィンドウを検索する方法(AutoHotkeyに似ています)

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

私が試したこと:

  • これは可能ですが、xdotool search --name --class許可されるものは次のとおりです。一つ名前とタイトルのパターン。
  • xdotoolはコマンド接続をサポートしていますが、両方の検索呼び出しを接続する方法を見つけることができません。 2番目の検索呼び出しは最初の検索呼び出しをオーバーライドします。

答え1

私の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

ifステートメントのアスタリスクは、TODOタイトルのどこにでも表示できるようにサブストリングマッチングを実行することです。

答え2

私は短いUnix方式のソリューションを決定できました。

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

答え3

UNIX方式に従う別の解決策があります!

私はそれを見るのがあまりにも美しいです@t7ko:

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

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

要するに、

  1. 一つある線形構造、ツリー構造ではなく2次元ではなく1次元のように
  2. もっと使うよく知られたシェル構文
  3. 実際にあなたの質問に答えます。横になる窓。

(この点が利点かどうかは状況によって異なります。この側面は無視しましょう*。)

手順を理解しやすくするために、以下に同じコードをより構造化されたレイアウトで表示します。
しかし、インデントはコマンドを解釈するためのものです。入れ子などを表すのではなく、まだ線形UNIXパイプです。

同じコマンド、|パイプ()の後に分割されます:(uniq省略)

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たとえば、4x4 画面の最初の画面の42,433場合は-5375,-3809、仮想画面、現在位置は右下のどこかにあります。

さて、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以下を見つけるために使用されます。クラス" gvim、一部の"内部"ウィンドウは省略されます。結果はのPID(プロセス識別子)としてリストされます。
それぞれに対して異なるウィンドウを実行してPID確認する前に、サンプルスキーマの"名前"を確認してください。xargsxdotool searchTODOPID

(もしそうなら:(連続行と呼ばれる)で終わる行は実際に改行文字\で終わらなければならず、その前に空白があってはなりません。)\

これで元のコマンドに戻ります。

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)でコマンドを実行し、gvim画面1に「TODO」と表示します。

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

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

答え4

短くエレガントな回答(使用wmctrl):

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

生成されたウィンドウIDは16進数なので、10進数(で使用xdotool)に変換する必要があります。

printf "%d\n" $result

それからあなたはそれで何でもすることができますxdotool

関連情報