xdotool: विभिन्न पैटर्न के साथ शीर्षक और वर्ग द्वारा विंडो की खोज कैसे करें (AutoHotkey के समान)


10

xdotool आपको अपने खोज उपकमांड का उपयोग करके विंडोज़ की खोज करने देता है। मुझे एक खिड़की का पता लगाने की जरूरत है, जिसमें कक्षा 'जीवीएम' और शीर्षक युक्त शब्द 'TODO' है। मैं यह कैसे करु?

मैंने क्या कोशिश की है:

  • आप कर सकते हैं xdotool search --name --class, लेकिन यह केवल नाम और शीर्षक दोनों के लिए एक पैटर्न को स्वीकार करेगा ।
  • xdotool कमांड चेनिंग का समर्थन करता है, लेकिन मुझे दो सर्च कॉल को चेन करने का तरीका नहीं मिला - दूसरा केवल पहले वाले को ओवरराइड करता है।

xdotoolबेकार है ... यह इतना सरल ऑपरेशन है और इसे सुरुचिपूर्ण तरीके से करने का कोई तरीका नहीं है।
यान राजा यिन

जवाबों:


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

यदि कथन में तारांकन के लिए एक विकल्प मिलान करने के लिए है TODO, तो यह शीर्षक में कहीं भी हो सकता है।


हाँ, क्षमा करें, एक गलतफहमी, मेरा मतलब था --name और --class। अब ठीक कर देंगे।
t7ko

@DS आप बता सकते हैं कि xdotool सर्च --class "gedit" अब केवल gedit के लिए क्यों काम करेगा, लेकिन किसी अन्य विंडो के लिए काम करेगा? एक्सप्रॉप उपयोगिता के साथ एक ही कहानी।
गोंकी

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 विंडो आईडी खोजने के लिए कमांड को छोटा करूंगा - हो सकता है कि वह सब कुछ जो ओपी द्वारा आवश्यक था, न कि:

छोटा कमांड पाइप लाइन, प्रत्येक लाइन पर एक अलग शेल कमांड:

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's (प्रोसेस आइडेंटिफ़ायर) के रूप में सूचीबद्ध किया गया है ।
प्रत्येक के लिए 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स्थिति मूल्य।

उदाहरण के लिए, gvimस्क्रीन पर "TODO" के साथ मेरी 16 वीं वर्चुअल स्क्रीन (4 बाय 4) पर शीर्ष पर कमांड चल रही है :

$ 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अच्छा है। इसी तरह के मुद्दे पर मेरी मदद की। थंडरबर्ड 14 खिड़कियों के साथ शुरू हो सकता है और केवल एक या दो डेस्कटॉप पर हैं। मुझे नहीं पता कि दूसरे क्या हैं। केवल दिखाई देने वाले बीटीडब्ल्यू को प्रदर्शित किया जा सकता है - न केवल तुरंत वर्तमान डेस्कटॉप पर दिखाया गया है।
जो

1

संक्षिप्त और सुरुचिपूर्ण उत्तर (जो उपयोग करता है wmctrl):

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

परिणामस्वरूप विंडो आईडी हेक्स में है, इसलिए आपको इसे दशमलव में परिवर्तित करने की आवश्यकता है (इसके द्वारा उपयोग किया गया xdotool):

printf "%d\n" $result

फिर आप जो चाहे कर सकते हैं xdotool


1
wmctrlमैनुअल का कहना है कि -lखिड़की वर्ग को प्रिंट नहीं करता है, केवल शीर्षक; इसलिए आपका कोड स्निपेट मेरी समस्या "शीर्षक और वर्ग द्वारा खोज" को हल नहीं करता है।
t7ko

1
wmctrl -lxवर्ग प्रदान करता है।
david.perez
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.