Execute vários comandos do xdotool em uma linha separada uma da outra


11

Estou tentando executar, em xdotool type wordseguida, xdotool key Returnem Preferências de aplicativos de inicialização.
Mas se eu usar &&ou ;, o xdotool avalia como continuação de entrada.


1
No meu caso de uso, ele funciona xdotool type $'word\r', onde o $''escape \rpara algo como return ( \nnão funciona aqui).
Scz 27/10/16

Respostas:


16

Longa história:
use um script.

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

E coloque o caminho do script no Execcampo.


Longa história:

De acordo com a página de xdotoolmanual :

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

O encadeamento de comandos via ;ou &não é possível, pois essa é a sintaxe do shell e os Aplicativos de Inicialização não suportam a sintaxe do shell. No entanto, se tudo o que você deseja fazer é pressionar Enterdepois de digitar algo, existe uma maneira indireta de fazer isso.

Quando diz "nova linha" ASCII ", isso não significa nada \n. E a substituição de comandos ( xdotool type "$(printf '\n')"digamos) consome novas linhas. Após esta xdotoolspostagem no fórum , tentei o seguinte:

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

E funcionou. Mas só funciona se houver algum caractere após o \n, e isso obviamente deixa um espaço à direita, o que não seria o que você deseja. Eu modifiquei isso para:

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

E isso funciona e não deixa espaço à direita. No entanto, isso pode causar problemas para aqueles que usam o modo Vi em seu shell.

Graças aos comentários do @ steeldriver, eu descobri que isso se devia a mim mesmo no terminal em que eu estava executando os comandos. Apenas uma pequena lacuna entre minha pressão Entere o xdotoolcomando foi suficiente para que uma única nova linha fosse registrada corretamente. Portanto:

sleep 0.1; xdotool type $'date\n'

Então, estendendo a linha citando-a:

xdotool type 'date
'

ou usar a interpretação do shell como sugeriu @steeldriver parece a opção certa.

No entanto, um script contendo:

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

no Execcampo funcionou bem. Na verdade, eu sempre recomendo usar um script para comandos complexos em um arquivo da área de trabalho.

Você pode ter um script /usr/bin/xdotoolno shebang, mas a página de manual diz que "o scriptmodo não está totalmente aprimorado e pode ficar abaixo das suas expectativas", então continuei com os scripts do bash.

Eu poderia estar vendo coisas, mas nas minhas primeiras tentativas, tive que colocar um (pequeno) sleepentre os comandos typeekey . Esse foi um artefato de experimentá-lo no terminal que estava executando os comandos em vez de outra janela.


Uma nova linha literal parece funcionar, ou seja, xdotool type 'wordseguida pela tecla 'Enter' e depois pelo fechamento '(como o $'word\n'bash expande \npara uma nova linha literal antes de passar o argumento para xdotool).
Steeldriver 23/08/14

@steeldriver hit-and-miss. Essa foi uma das primeiras coisas que tentei e não funcionou.
muru

@steeldriver O que funcionou foram duas novas linhas (duas entradas antes de fechar o 'ou dois \nsegundos com o $truque).
muru 23/08/14

isso é estranho, a nova linha extra não parece ser necessária para mim - eu me pergunto se isso depende do aplicativo que possui a janela de destino (eu estava usando um documento vazio no geany)?
Steeldriver #

@steeldriver obrigado pela dica. Fico feliz em saber que eu não estava alucinando sobre a necessidade de sleep(veja a nota em texto pequeno). Eu não estava mudando as janelas e apenas tentando na mesma janela, mas com a sleep 1, ambos os métodos funcionaram com a mesma janela e após a troca. Eu acho que meu próprio pressionamento de tecla Enter interferiu de alguma forma na nova linha do xdotool. No entanto, para os requisitos mais complexos de um arquivo da área de trabalho, eu ainda recomendaria o script.
muru

1

Parece-me que o aplicativo não está analisando vários comandos, mas tratando-o como um único comando. Como tal, torne-o um único comando envolvendo uma chamada de shell ...

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

Agora você também pode fazer outras coisas de concha ...

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

Observe que o comando "date" usado nessa última inclui uma nova linha! e "xdotool" irá produzi-lo.

NOTA: se você estiver fazendo isso como uma macro de teclado, também adicionarei mais algumas opções ao "xdotool" para melhorar esse trabalho ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.