xdotool : 제목과 클래스가 다른 패턴으로 창을 검색하는 방법 (AutoHotkey와 유사)


10

xdotool을 사용하면 search 하위 명령을 사용하여 창을 검색 할 수 있습니다. 클래스 'gvim'과 단어 'TODO'가 포함 된 창을 찾아야합니다. 어떻게해야합니까?

내가 시도한 것 :

  • 당신은 할 수 xdotool search --name --class있지만 이름과 제목 모두에 대해 하나의 패턴 만 허용 합니다.
  • xdotool은 명령 체인을 지원하지만 두 개의 검색 호출을 연결하는 방법을 찾지 못했습니다. 두 번째는 단순히 첫 번째 호출을 무시합니다.

xdotool짜증나 ... 이것은 간단한 조작이며 우아하게 할 수있는 방법이 없습니다.
Yan King Yin

답변:


13

내 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하여 제목의 어느 곳에서나 발생할 수 있습니다.


예, 죄송합니다. 잘못 인쇄되었습니다. 저는 --name과 --class를 의미했습니다. 지금 고치겠습니다.
t7ko

@DS 왜 xdotool search --class "gedit"가 gedit에서만 작동하지만 다른 창에서는 작동하는지 알 수 있습니까? xprop 유틸리티와 동일한 이야기.
Gonki

6

나는 짧고 유닉스 솔루션을 식별 할 수있었습니다.

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

3

다음은 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. 갖는 선형 구조 대신 두 치수처럼 대신 트리 구조,
  2. 보다 잘 알려진 쉘 구문을 사용 합니다 .
  3. 실제로 귀하의 질문에 대답합니다 : 창을 찾습니다 .

(이 점이 장점인지 여부는 상황에 따라 다릅니다 . 이 부분을 무시하십시오 * )

단계별로 이해하기 쉽도록 아래의 구조화 된 레이아웃에 동일한 코드를 표시합니다.
그러나 들여 쓰기는 명령을 설명하는 것입니다-중첩을 나타내는 것은 아니며 여전히 선형 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 만 표시됨은 현재 데스크톱에 즉시 표시되는 것이 아니라 표시 할 수 있음을 의미합니다.
Joe

1

짧고 우아한 답변 (사용 wmctrl) :

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

결과 창 ID는 16 진수이므로 십진수 (로 사용 xdotool) 로 변환해야합니다 .

printf "%d\n" $result

그럼 당신은 무엇이든 할 수 있습니다 xdotool.


1
wmctrl매뉴얼은 -l창 클래스를 인쇄하지 않고 제목 만 인쇄 한다고 말합니다 . 따라서 코드 스 니펫은 내 문제 "제목 및 클래스로 검색"을 해결하지 못합니다.
t7ko

1
wmctrl -lx수업을 제공하지 않습니다.
david.perez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.