xdotoolでは、searchサブコマンドを使用してウィンドウを検索できます。 「gvim」クラスと「TODO」という単語を含むタイトルを持つウィンドウを見つける必要があります。どうすればよいですか?
私が試したこと:
xdotool search --name --class
、ただし名前とタイトルの両方にoneパターンのみを受け入れます。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ステートメントのアスタリスクがそこにあります。
Unix-wayの短いソリューションを特定できました。
comm -12 \
<(xdotool search --name 'title-pattern' | sort) \
<(xdotool search --class 'class-pattern' | sort)
これは、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'
しかし、我慢してください!その中にいくつかの隠された美しさがあります。
つまり、それ
(これらの点が利点であるかどうかはコンテキストに依存します-この側面を無視しましょう*。)
ステップごとに理解しやすくするために、同じコードをより構造化されたレイアウトで以下に示します。
しかし、インデントはコマンドを説明するためのものであることに注意してください。それはネストなどを示すものではなく、すべて線形の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のコードを好みます。たくさん!
短くてエレガントな答え(wmctrl
を使用):
result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')
結果のウィンドウIDは16進数であるため、10進数に変換する必要があります(xdotool
で使用):
printf "%d\n" $result
次に、xdotool
で何でもできます。