Đây là một giải pháp khác tuân thủ cách UNIX!
Ngay từ cái nhìn đầu tiên, nó không đẹp như của bạn, @ 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'
Nhưng hãy chịu đựng tôi! Có một số vẻ đẹp tiềm ẩn trong đó.
Nói tóm lại, nó
- có cấu trúc tuyến tính , thay vì cấu trúc cây, giống như một thay vì hai chiều
- sử dụng cú pháp shell nổi tiếng hơn .
- không thực sự trả lời câu hỏi của bạn: Nó định vị cửa sổ.
(Những điểm này có phải là lợi thế hay không tùy thuộc vào ngữ cảnh - hãy bỏ qua khía cạnh này * .)
Tôi sẽ hiển thị cùng một mã trong bố cục có cấu trúc hơn bên dưới, để dễ hiểu hơn từng bước.
Nhưng lưu ý rằng thụt lề là để giải thích lệnh - nó không chỉ ra lồng nhau hay như vậy, tất cả vẫn là một đường ống UNIX tuyến tính.
Lệnh tương tự, chỉ phân tách sau các ống dẫn ( |
):
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'
Lệnh đầy đủ, như được hiển thị ở trên, cung cấp vị trí pixel của gvim
cửa sổ, trả về tọa độ pixel tương ứng với góc trên cùng bên trái của màn hình hiện tại (có thể là ảo) x,y
, như 42,433
, hoặc có thể -5375,-3809
khi nó ở trên bốn màn hình đầu tiên của bốn màn hình ảo và cái hiện tại nằm ở phía bên phải.
Hiện tại, tôi sẽ rút ngắn lệnh chỉ tìm ID cửa sổ X11 - có thể đó là tất cả những gì thực sự cần thiết cho OP, không chắc chắn:
Đường ống lệnh rút ngắn, một lệnh shell riêng biệt trên mỗi dòng:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Bây giờ, nó bắt đầu có thể đọc được:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
Các xdotool
lệnh search
được sử dụng để tìm các cửa sổ với " đẳng cấp " gvim
, để lại một số cửa sổ "nội bộ". Kết quả được liệt kê là PID
's (định danh quy trình).
Đối với mỗi PID
, xargs
chạy một cái khác xdotool search
, kiểm tra "tên" cho mẫu ví dụ của chúng tôi TODO
- sau khi kiểm tra PID
.
(Chỉ trong trường hợp: Các dòng kết thúc bằng \
- được gọi là các dòng tiếp tục - cần thực sự kết thúc bằng \
và không có khoảng trắng trước dòng mới.)
Bây giờ trở lại lệnh ban đầu:
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'
Phần còn lại liệt kê một số chi tiết về cửa sổ, bao gồm cả vị trí. Các sed
trận đấu lệnh và trả về chỉ các x,y
giá trị vị trí.
Ví dụ: chạy lệnh trên cùng trên màn hình ảo thứ 16 của tôi (bằng 4 x 4), với "TODO" gvim
trên màn hình 1:
$ 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
*) Tuyên bố miễn trừ trách nhiệm: Tôi thích mã của @ t7ko. Rất nhiều!
xdotool
thật tệ ... đây là một thao tác đơn giản và không có cách nào để thực hiện một cách thanh lịch.