xdotool을 사용하면 search 하위 명령을 사용하여 창을 검색 할 수 있습니다. 클래스 ‘gvim’과 단어 ‘TODO’가 포함 된 창을 찾아야합니다. 어떻게해야합니까?
내가 시도한 것 :
- 당신은 할 수
xdotool search --name --class
있지만 이름과 제목 모두에 대해 하나의 패턴 만 허용 합니다. - xdotool은 명령 체인을 지원하지만 두 개의 검색 호출을 연결하는 방법을 찾지 못했습니다. 두 번째는 단순히 첫 번째 호출을 무시합니다.
답변
내 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
하여 제목의 어느 곳에서나 발생할 수 있습니다.
답변
나는 짧고 유닉스 솔루션을 식별 할 수있었습니다.
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
지금은 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의 코드를 선호합니다. 많이!
답변
짧고 우아한 답변 (사용 wmctrl
) :
result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')
결과 창 ID는 16 진수이므로 십진수 (로 사용 xdotool
) 로 변환해야합니다 .
printf "%d\n" $result
그럼 당신은 무엇이든 할 수 있습니다 xdotool
.