2010-10-06 2 views
2

У меня возникла странная проблема с Ruby, которую я не могу объяснить. У меня есть следующий сценарий, который захватывает любой код, в настоящее время в буфер обмена, запускает его через подсветки синтаксиса, затем помещает новую версию ОБРАТНО в буфер обмена:«ruby script.rb» по сравнению с «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 

нечетная часть является то, что если я запускаю его непосредственно в терминал, он отлично работает. Однако, если я запускаю его через «xterm -e», это не сработает. Я нашел эту тему на другом сайте, который задал тот же самый вопрос, но человек никогда не получил ответ: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138423

Этот человек обнаружил, что если они добавили паузу в конце сценария, как так ...

10000.times do 
    puts "" 
end 

... это работает. Почему это? Есть ли способ исправить это? Я попробовал переписать сценарий так, чтобы popen возвращал объект ввода-вывода, и я мог вручную вызвать его, но это не имеет никакого значения.

+1

Я определил, что независимо от проблемы, это в xsel. Я попытался добавить строку в конец файла (без сумасшедшего puts "цикла), который просто сбрасывает выделенный код в файл, и это содержимое правильно, независимо от того, _how_ Я запускаю скрипт. Я попробовал xclip вместо этого, и, похоже, он работает в большем количестве ситуаций, хотя я только что получил основной (ака, средний клик) буфер обмена для работы с ним. xclip работает при вызове из другого скрипта, где xsel не будет, но xclip все равно не работает через xterm -e. – Matthew

ответ

1

Как насчет того, если вы выполните его с помощью gnome-terminal -e вместо xterm -e?

UPDATE:

ОК, вот моя догадка. Вы знаете, как отправить программу терминала на задний план (либо с & после команды, либо с помощью ctl-z), а затем вы закроете терминал, который убивает программу, не так ли? Ну, xsel создает дочерний процесс для записи в буфер обмена, но его нужно убивать, когда заканчивается скрипт ruby ​​wrapper и xterm закрывается.

Это объясняет, почему пауза в конце позволяет ей работать - она ​​просто дает достаточно времени для завершения дочернего процесса до выхода терминала. Он также объясняет, почему он работает при запуске вручную - вы оставляете терминал открытым достаточно долго для завершения дочернего процесса.

Попробуйте добавить параметр -n к вашей команде xsel, и я уверен, это работает. -n держит xsel от разветвления.

+0

Нет, это тоже не работает ... с xclip _or_ с xsel. В любом случае, спасибо. Я редко использую этот скрипт, поэтому он не слишком большой, но было бы неплохо узнать, почему он делает это только ради знания. – Matthew

+0

ах, shacks. Мое мышление было, может быть, это была проблема с эмулятором терминала и _maybe_, вы открывали гном-терминал при запуске вручную. – James

+0

Я обновил свой ответ, так как у меня просто было прозрение. – James

 Смежные вопросы

  • Нет связанных вопросов^_^