J'ai rencontré un problème étrange avec Ruby que je ne peux pas expliquer. Je le script suivant qui prend tout le code est actuellement dans le presse-papiers, l'exécute par une coloration syntaxique, met alors la nouvelle version de nouveau dans le presse-papiers:"ruby script.rb" contre "xterm -e ruby script.rb"
#!/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 étrange est que si je le lance directement dans un terminal, ça fonctionne bien. Si je l'exécute via "xterm -e", cela 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 si, comme si ... ils ont ajouté une pause à la fin du script
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 le popen retourne un objet IO et que je puisse appeler manuellement close, mais cela ne fait pas de différence.
J'ai déterminé que, quel que soit le problème, il est dans xsel. J'ai essayé d'ajouter une ligne à la fin du fichier (sans la boucle folle puts "") qui saute juste le code en surbrillance dans un fichier, et son contenu est correct peu importe _how_ Je cours le script. J'ai essayé xclip à la place et il semble fonctionner dans plus de situations, bien que je n'ai jamais eu que le presse-papier primaire (aka, clic du milieu) pour travailler avec elle. xclip fonctionne quand il est appelé depuis un autre script où xsel ne le ferait pas, mais xclip ne fonctionne toujours pas non plus via xterm -e. – Matthew