Uruchom kilka poleceń xdotool w jednym wierszu oddzielonym od siebie

11

Próbuję uruchomić xdotool type wordnastępnie xdotool key Returnz startowe Aplikacje Preferencje.
Ale jeśli użyję &&lub ;, xdotool oceni to jako kontynuację wprowadzania.

Janot
źródło
1
W moim przypadku użycia działa z xdotool type $'word\r', gdzie $''ucieka \rdo czegoś takiego jak return ( \ntutaj nie działa).
Scz

Odpowiedzi:

16

Krótka historia:
użyj skryptu.

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

I umieść ścieżkę skryptu w Execpolu.


Długa historia:

Według strony xdotoolpodręcznika :

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'.

Łańcuch poleceń za pomocą ;lub &nie jest możliwy, ponieważ jest to składnia powłoki, a aplikacje startowe nie obsługują składni powłoki. Jeśli jednak wszystko, co chcesz zrobić, to nacisnąć Enterpo wpisaniu czegoś, istnieje runda.

Kiedy mówi „nowa linia” ASCII, nie znaczy to gołe \n. I podstawianie poleceń ( xdotool type "$(printf '\n')"powiedzmy) zjada końcowe znaki nowej linii. Po tym xdotoolswpisie na forum spróbowałem:

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

I zadziałało. Ale to działa tylko wtedy, gdy po znaku jest jakaś postać \n, a to oczywiście pozostawia spację, która nie byłaby tym, czego chcesz. Zmodyfikowałem to, aby:

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

I to działa i nie pozostawia końcowej przestrzeni. Może to jednak powodować problemy dla tych, którzy używają trybu Vi w swojej powłoce.

Dzięki komentarzom @ steeldriver zorientowałem się, że to dlatego, że wypróbowałem to na terminalu, na którym wykonywałem polecenia. Wystarczyła niewielka przerwa między naciśnięciem Entera xdotoolpoleceniem, aby poprawnie zarejestrować pojedynczą linię. A zatem:

sleep 0.1; xdotool type $'date\n'

Więc albo przedłuż linię, cytując ją:

xdotool type 'date
'

lub użycie interpretacji powłoki, jak sugeruje @steeldriver, wygląda jak właściwa opcja.

Jednak skrypt zawierający:

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

w Execpolu działało dobrze. Rzeczywiście, zawsze zalecam używanie skryptu do złożonych poleceń w pliku na pulpicie.

Możesz mieć skrypt /usr/bin/xdotoolw shebang, ale strona mówi, że „ scripttryb nie jest w pełni rozwinięty i może spaść poniżej twoich oczekiwań”, więc trzymałem się skryptów.

Mogłem widzieć rzeczy, ale podczas moich pierwszych prób musiałem umieścić (małe) sleepmiędzy poleceniami typeakey . To był artefakt wypróbowania go na terminalu, który wykonywał polecenia zamiast w innym oknie.

muru
źródło
Dosłowne nowalinia wydaje się działać tj xdotool type 'wordnastępnie „enter” klucz, a następnie zamknięcia ', podobnie jak $'word\n'(w którym bash rozszerza \nprzed przekazaniem argument do dosłownego nowej linii xdotool).
steeldriver
@steeldriver hit-and-miss. To była jedna z pierwszych rzeczy, których próbowałem i nie działałem.
muru
@steeldriver To, co zadziałało, to dwie nowe linie (dwa Wpisy przed zamknięciem 'jednego lub dwóch \nza pomocą $lewy).
muru
to dziwne, dodatkowa nowa linia nie wydaje mi się konieczna - zastanawiam się, czy to zależy od aplikacji, która jest właścicielem okna docelowego (korzystałem z pustego dokumentu w geany)?
steeldriver
@steeldriver dzięki za wskazówkę. Cieszę się, że nie miałem halucynacji na temat potrzeby sleep(patrz uwaga w małym tekście). Nie zmieniałem okien i po prostu wypróbowywałem je w tym samym oknie, ale z sleep 1, obie metody działały zarówno z tym samym oknem, jak i po przełączeniu. Wydaje mi się, że moje własne naciśnięcie klawisza Enter w jakiś sposób zakłóciło nową linię xdotool. Jednak w przypadku bardziej złożonych wymagań dotyczących pliku pulpitu nadal polecam skrypt.
muru
1

Wydaje mi się, że aplikacja nie analizuje wielu poleceń, ale traktuje to jako jedno polecenie. W związku z tym uczyń go pojedynczym poleceniem, zawijając w nim wywołanie powłoki ...

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

Teraz możesz także wykonywać inne czynności związane z powłoką ...

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

Zauważ, że polecenie „data” użyte w tym ostatnim wierszu zawiera nowy wiersz! i „xdotool” wyświetli to.

UWAGA: jeśli robisz to jako makro klawiatury, dodałbym jeszcze kilka opcji do „xdotool”, aby usprawnić to działanie ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
Anthony
źródło