【发布时间】:2010-10-06 21:55:11
【问题描述】:
我在使用 Ruby 时遇到了一个我无法解释的奇怪问题。我有以下脚本,它抓取剪贴板中当前的任何代码,通过语法荧光笔运行它,然后将新版本放回剪贴板:
#!/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
奇怪的是,如果我直接在终端中运行它,它就可以正常工作。但是,如果我通过“xterm -e”运行它,它就不起作用。我在另一个提出相同问题的网站上找到了这个帖子,但这个人从未得到答案:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138423
那个人发现,如果他们像这样在脚本末尾添加暂停...
10000.times do
puts ""
end
...它有效。为什么是这样?有没有办法解决这个问题?我尝试重写脚本,以便 popen 返回一个 IO 对象,我可以手动调用 close,但这并没有什么不同。
【问题讨论】:
-
我已经确定,无论问题是什么,它都在 xsel 中。我尝试在文件末尾添加一行(没有疯狂的 puts "" 循环),它只是将突出显示的代码转储到文件中,无论 如何 我运行脚本,它的内容都是正确的。我尝试使用 xclip ,它似乎可以在更多情况下工作,尽管我只使用过主要(又名中键)剪贴板来使用它。当从另一个 xsel 不能的脚本调用时,xclip 可以工作,但 xclip 仍然不能通过 xterm -e 工作。