Question

J'ai rencontré un problème étrange avec Ruby que je ne peux pas expliquer. Je le script suivant qui saisit tout le code est actuellement dans le presse-papiers, il passe par un surligneur de syntaxe, met alors la nouvelle version de nouveau dans le presse-papiers:

#!/usr/bin/ruby1.9.1

require 'coderay'

language = "auto";
if(ARGV.length > 0)
    language = ARGV[0];
end

print("Using language: #{language} \n");

codeToHighlight = `xsel --clipboard`

highlightedCode = CodeRay.scan(codeToHighlight, language.intern()).div

IO.popen("xsel --clipboard", mode='w') do |io|
  io.write highlightedCode
  io.flush
end

La partie impaire est que si je le lance directement dans un terminal, il fonctionne très bien. Si je lance via « xterm -e », cependant, il ne fonctionne pas. J'ai trouvé ce fil sur un autre site qui a posé la même question, mais la personne n'a jamais eu de réponse: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138423

Cette personne a constaté que s'ils ont ajouté une pause à la fin du script comme si ...

10000.times do
   puts ""
end

... cela fonctionne. Pourquoi est-ce? Y'a t'il un moyen d'arranger cela? J'ai essayé de réécrire le script de sorte que les rendements popen un objet IO et je pourrais appeler fermer manuellement, mais cela ne fait pas de différence.

Était-ce utile?

La solution

Que diriez-vous si vous exécutez avec -e gnome-terminal au lieu de xterm -e?

Mise à jour:

OK, voici ma meilleure estimation. Vous savez comment si vous envoyez un programme de terminal à l'arrière-plan (soit avec & après la commande ou avec ctl-z), puis vous fermez le terminal, il tue le programme, non? Eh bien, xsel bifurque un processus enfant à écrire dans le presse-papiers, mais il faut se faire tuer lorsque les finitions de script wrapper rubis et xterm et ferme.

Cela expliquerait pourquoi la pause à la fin lui permet de travailler - il donne juste assez de temps pour le processus de l'enfant à la fin avant que les démissions du terminal. Il explique aussi pourquoi cela fonctionne lorsqu'il est exécuté manuellement -. Laissez-vous le terminal ouvert assez longtemps pour que le processus de l'enfant à la fin

Essayez d'ajouter l'option -n à votre commande xsel, et je parie que cela fonctionne. -n garde xsel de fork.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top