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'
하지만 참아주세요! 그 안에 숨겨진 아름다움이 있습니다.
요컨대, 그것은
- 하나 있다선형 구조, 트리 구조 대신 2차원이 아닌 1차원처럼
- 더 많이 사용하세요잘 알려진 쉘 구문.
- 실제로 귀하의 질문에 답변합니다.눕다창문.
(이러한 점이 장점인지 여부는 상황에 따라 다릅니다. 이 측면은 무시합시다 * .)
단계별로 이해하기 쉽도록 아래에 동일한 코드를 보다 구조화된 레이아웃으로 표시하겠습니다.
그러나 들여쓰기는 명령을 해석하기 위한 것입니다. 중첩 등을 나타내는 것이 아니라 여전히 선형 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
확인 하기 전에 예제 스키마의 "이름"을 확인합니다 .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 %@ | 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
.