'tipo xdotools' manipula retornos de carro

2

Gostaria de configurar uma funcionalidade de colagem que permita colar texto copiado (como scripts e arquivos de configuração) a qualquer tipo de aplicativo, incluindo convidados virtuais e sessões remotas executando clientes gráficos como VNC (onde um copiar-colar padrão não é possível).

Para conseguir isso, associei um atalho no meu gerenciador de área de trabalho ao seguinte comando:

sh -c 'sleep 1; xdotool type -- "$(xsel -bo)"'

Isso funciona ... mas apenas para certos aplicativos (e infelizmente o VNC não faz parte deles, é um mundo cruel!).

  • Se eu usar isso para colar o texto em um vi em execução no xterm no host local, isso funciona perfeitamente: o conteúdo do arquivo é preservado e gravado conforme o esperado. Isso também parece funcionar perfeitamente em gnome-terminal .
  • Se vi for executado em xfce4-terminal , por exemplo, ainda no host local, todas as retornos de carro serão desconfiguradas.
  • Da mesma forma, se eu tentar colar para colar o texto em qualquer aplicativo (incluindo xterm ) por meio do VNC, o texto será digitado corretamente, mas aqui novamente em uma única linha.

Quando se torna estranho, é que se eu anexar o seguinte comando a outro atalho de teclado:

sh -c 'sleep 1; xdotool key Return'

Aqui xdotool consegue inserir o retorno de carro em qualquer aplicativo, portanto é tecnicamente possível.

Eu tentei desenvolver isso como uma solução feia para impor o retorno de carro:

sh -c 'sleep 1; xsel -bo | { while read -r LINE; do xdotool type -- "$LINE"; xdotool key Return; done; }'

Agora o retorno de carro "funciona" esta solução agora manipula as guias e, em todos os casos, não gosto, pois nem sempre quero o retorno final (por exemplo, ao preencher um campo de formulário da Web sem enviá-lo imediatamente) .

Acho que tenho o mesmo problema que o esse cara , mas infelizmente o tópico não tem explicação.

Onde está o problema? Como posso fazer isso funcionar? Ou se, por algum motivo, isso não for possível, existe outra alternativa leve para minha necessidade inicial?

    
por WhiteWinterWolf 20.10.2017 / 20:19

1 resposta

2

Por motivos históricos, há dois caracteres que representam quebras de linha: alimentação de linha (comumente representada como LF, \n , 2 , Ctrl + J,…) e retorno de carro (CR, \r , 5 , Ctrl + M). O Unix usa LF como o caractere terminador de linha, mas os teclados enviam CR quando você pressiona Retornar . Alguns aplicativos reconhecem uma chave Alimentamento de Linha (que existe em alguns teclados raros que não foram feitos para o mercado de PCs), mas isso é raro.

Experimentalmente, quando há uma quebra de linha na string, xdotool envia uma chave Linefeed . Não me surpreende que alguns aplicativos não reconheçam isso. Você pode fazer com que ele envie Return , substituindo as novas linhas pelos retornos de carro.

sleep 1; xdotool type -- "$(xsel -bo | tr \n \r | sed s/\r*\$//)"

Sua solução alternativa também pode funcionar. Defina IFS como um valor vazio, caso contrário, read retira o espaço em branco inicial e final em cada linha (é por isso que as guias estão desaparecendo). E não envie um Return após a última linha. (Isso não é estritamente equivalente ao método de substituição de comando: com uma substituição de comando, todas as linhas vazias finais são removidas; com o método a seguir, apenas a nova linha final, se houver, é ignorada.)

sleep 1
xsel -bo | {
  IFS= read -r LINE;
  xdotool type -- "$LINE";
  while IFS= read -r LINE; do
    xdotool key Return;
    xdotool type -- "$LINE";
  done;
}

Nota: Eu não tentei nada no VNC, então sua milhagem pode variar.

    
por 22.10.2017 / 03:15