Исправление буфера обмена osascript для OSX Mountain Lion

В моем приложении Ruby я долгое время использовал следующую функцию для записи в буфер обмена:

def pbcopy(text)
  IO.popen("osascript -e 'set the clipboard to do shell script \"cat\"'","w+") {|pipe| pipe << text}
end

Я получил этот код из здесь, и он заменил мое предыдущее использование pbpaste через обратные кавычки, потому что это казалось намного более надежным с UTF8 и другими вещами. Он всегда работал отлично, однако с новым OSX Mountain Lion он перестал работать. osascript -e 'установить для буфера обмена значение «привет»» работает хорошо, так что это может быть что-то с конвейером, который не работает. Любая помощь приветствуется!


person Stian Håklev    schedule 25.07.2012    source источник


Ответы (2)


Я только что попробовал это, и он отлично работал с символами UTF-8:

def pbcopy(text)
  IO.popen("pbcopy", "w+") {|pipe| pipe << text}
end

pbcopy "smörgåsbord"
puts `pbpaste`
person Henrik N    schedule 28.07.2012
comment
Символы все еще перепутаны, когда я пытаюсь вставить текст в текстовое представление на 10.8. - person Lri; 30.07.2012
comment
Не для меня, если я вставлю в TextEdit или поле адреса Chrome. Возможно, это разные версии Ruby (у меня 1.9.3) или локальная среда. У меня тоже 10.8. - person Henrik N; 30.07.2012

do shell script "cat" больше не возвращает STDIN.

Однако вы можете получить аргументы с помощью обработчика on run. Форма {input, parameters} работает только в Automator.

system("osascript", "-e", "on run {input}
set the clipboard to input
end", "あä")

Вы также можете установить переменную __CF_USER_TEXT_ENCODING:

IO.popen("__CF_USER_TEXT_ENCODING=$UID:0x8000100:0x8000100 pbcopy", "w") { |i|
  i << "あä"
}
person Lri    schedule 30.07.2012
comment
Первый предложенный вами пример, похоже, не работает - ничего не попадает в буфер обмена в OSX ML. - person Stian Håklev; 31.07.2012
comment
@StianHåklev Вы правы; on run {input} отсутствовали фигурные скобки. - person Lri; 31.07.2012