xdotool: 다양한 모드에서 제목과 클래스로 창을 검색하는 방법(AutoHotkey와 유사)

xdotool: 다양한 모드에서 제목과 클래스로 창을 검색하는 방법(AutoHotkey와 유사)

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

내가 시도한 것:

  • 이렇게 할 수는 있지만 xdotool search --name --class허용되는 것은 다음과 같습니다.하나이름과 제목의 패턴.
  • xdotool은 명령 연결을 지원하지만 두 검색 호출을 연결하는 방법을 찾을 수 없습니다. 두 번째 검색 호출이 첫 번째 검색 호출을 재정의합니다.

답변1

내 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제목의 어느 위치에나 나타날 수 있도록 하위 문자열 일치를 수행하는 것입니다.

답변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.

관련 정보