Виконайте кілька команд xdotool в одному рядку, відокремленому один від одного


11

Я намагаюся запустити xdotool type wordпотім xdotool key Returnіз налаштувань запуску Aplications.
Але якщо я використовую &&або ;, xdotool оцінює це як продовження введення.


1
У моєму випадку це працює xdotool type $'word\r', де $''виходить \rна щось подібне до повернення ( \nтут не працює).
Скц

Відповіді:


16

Довга коротка історія:
Використовуйте сценарій.

#! /bin/sh
# With some window selection magic, or a sleep 
# if you want to do that manually.
xdotool type word
xdotool key Return

І покладіть шлях сценарію в Execполе.


Довга історія:

Згідно xdotoolсторінці керівництва :

type
       Supports newlines and tabs (ASCII newline and tab). 
       With respect to "COMMAND CHAINING", this command consumes the
       remainder of the arguments and types them. That is, no commands can
       chain after 'type'.

Кодування команд через ;або &неможливо, оскільки це синтаксис оболонки, а програми запуску не підтримують синтаксис оболонки. Однак якщо все, що ви хочете зробити, це натиснути Enterпісля чогось набравши щось, існує обхідний спосіб зробити це.

Коли йдеться про "ASCII" новий рядок, це не означає голий \n. І заміна команд ( xdotool type "$(printf '\n')"скажімо) їсть сліди нових рядків. Після цього xdotoolsповідомлення на форумі я спробував це:

xdotool type "$(printf 'date\n ')"

І це спрацювало. Але це працює лише за наявності певного персонажа \n, і це очевидно залишає простір, який би не був тим, що ви хочете. Я змінив це на:

xdotool type "$(printf 'date\n\e ')"

І це працює і не залишає ніякого місця. Однак це може створити проблеми тим, хто використовує режим Vi в своїй оболонці.

Завдяки коментарям @ steeldriver я зрозумів, що це через те, що я спробував це на самому терміналі, на якому я виконував команди. Всього лише невеликого розриву між моїм натисканням Enterта xdotoolкомандою було достатньо, щоб один новий рядок був правильно зареєстрований. Таким чином:

sleep 0.1; xdotool type $'date\n'

Отже, або продовжуючи рядок, цитуючи його:

xdotool type 'date
'

або використання інтерпретації оболонки як запропоновано @steeldriver виглядає як правильний варіант.

Однак сценарій, що містить:

#! /bin/sh
sleep 1
xdotool type date
xdotool key Return

у Execполі добре працював. Дійсно, я завжди рекомендую використовувати скрипт для складних команд у файлі робочого столу.

Ви можете мати сценарій /usr/bin/xdotoolу shebang, але в manpage написано, що " scriptрежим не повністю розроблений і може опуститися нижче ваших очікувань", тому я дотримувався стримування сценаріїв.

Я, можливо, бачив речі, але в першій моїй спробі мені довелося поставити (невеликий) sleepміж командами typeтаkey . Це був артефакт спробувати його на терміналі, який виконував команди замість іншого вікна.


Буквальний переклад рядок , здається, працює тобто з xdotool type 'wordнаступним натисканням клавіші «Enter» , а потім закриттям ', як це робить $'word\n'(в якому Баш розширює \nбуквальний переклад рядка перед передачею аргументу xdotool).
steeldriver

@steeldriver хіт-і-промах. Це було одне з перших речей, які я спробував і не працював.
муру

@steeldriver У чому працювали два нові рядки (два Enters перед закриттям 'або два \ns $трюком).
muru

це не дивно, але зайвий новий рядок мені не здається потрібним - мені цікаво, чи залежить це від програми, яка володіє цільовим вікном (я використовував порожній документ гені)?
steeldriver

@steeldriver дякую за пораду. Радий знати, що я не галюцинізував необхідність sleep(див. Примітку невеликим текстом). Я не міняв вікна і просто випробовував це в одному вікні, але з a sleep 1, обидва методи працювали з тим самим вікном і після перемикання. Я думаю, що моя власна клавіша Enter якось заважала новій лінії xdotool. Однак для більш складної вимоги до настільного файлу я все-таки рекомендую сценарій.
muru

1

Мені здається, що програма не розбирає декілька команд, але трактує її як єдину команду. Таким чином, зробіть це єдиною командою, загорнувши її в оболонку ...

bash -c 'xdotool type date; xdotool key Return'

Тепер ви також можете робити інші речі з оболонками ...

bash -c 'xdotool type "`date +"%Y-%m-%d_%T`"'

Зауважте, що команда "дата", що використовується в останньому, містить новий рядок! і "xdotool" виведе його.

ПРИМІТКА: якщо ви робите це як макрос клавіатури, я також додав би ще кілька варіантів до "xdotool", щоб покращити цю роботу ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.