답변:
내 xdotool 도움말은 두 스위치가 동일하다는 것을 알려줍니다 (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
하여 제목의 어느 곳에서나 발생할 수 있습니다.
다음은 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
지금은 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
(프로세스 식별자).
각각에 대해 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)에서 맨 위에 명령을 실행하면 gvim
화면 1에 "TODO" 가 표시됩니다.
$ 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의 코드를 선호합니다. 많이!
--onlyvisible
것이 좋습니다. 비슷한 문제를 해결하는 데 도움이되었습니다. Thunderbird는 14 개의 창으로 시작할 수 있으며 데스크탑에는 1-2 개만 있습니다. 나는 다른 것들이 무엇인지 전혀 모른다. BTW 만 표시됨은 현재 데스크톱에 즉시 표시되는 것이 아니라 표시 할 수 있음을 의미합니다.
짧고 우아한 답변 (사용 wmctrl
) :
result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')
결과 창 ID는 16 진수이므로 십진수 (로 사용 xdotool
) 로 변환해야합니다 .
printf "%d\n" $result
그럼 당신은 무엇이든 할 수 있습니다 xdotool
.
wmctrl
매뉴얼은 -l
창 클래스를 인쇄하지 않고 제목 만 인쇄 한다고 말합니다 . 따라서 코드 스 니펫은 내 문제 "제목 및 클래스로 검색"을 해결하지 못합니다.
wmctrl -lx
수업을 제공하지 않습니다.
xdotool
짜증나 ... 이것은 간단한 조작이며 우아하게 할 수있는 방법이 없습니다.