Как передать текстовые данные из консоли ruby в буфер обмена без сохранения в файл?
Я пытаюсь передать массив, содержащийся в глобальной переменной, которую я создал, в мой буфер обмена на моем Mac.
Это очень долго, поэтому я не хочу выделять, копировать и вставлять на моей консоли.
Я хочу использовать встроенный код Unix, в частности, pbcopy
функция для консоли Mac ноутбука, которая позволяет мне передавать текст в буфер обмена моего компьютера, готовый к вставке.
Если бы я сделал это с сохранением файла, я бы сделал что-то вроде этого (в ruby):
stringdata = <<blah blah blah process, lets say it failed and the progress data is stored in this variable so we can skip forward to where the script screwed up in a process when we start up and handle the error instance(s)>>
File.open("temp.txt"){|f| f.write(stringdata)}
`cat temp.txt | pbcopy`
Но могу ли я сделать это без создания временного файла?
Я уверен, что это возможно. Все вещи в тексте возможны. Заранее спасибо за решение
3 ответа
Вместо этого вы можете просто повторить его, если в строке нет символов новой строки; в противном случае используйте IO
учебный класс.
С помощью echo
:
system "echo #{stringdata} | pbcopy"
ИЛИ ЖЕ
`echo #{stringdata} | pbcopy`
Затем Ruby просто скопирует текст из памяти и вставит его в команду оболочки, которая открывает канал между echo
а также pbcopy
процессы.
С использованием IO
учебный класс:
Если вы хотите сделать это Ruby, мы просто создадим канал с pbcopy
используя класс IO. Это создает общие файлы между процессами, в которые мы пишем, и pbcopy
будет читать с.
IO.popen("pbcopy", "w") { |pipe| pipe.puts "Hello world!" }
Вот простой однострочный метод, который вы можете вставить в консоль IRB:
def pbcopy(arg); IO.popen('pbcopy', 'w') { |io| io.puts arg }; end
Как только это определено, вы можете просто сделать
pbcopy stringdata
или скопируйте результат последней команды с помощью
pbcopy _
Конечно, вы также можете поместить определение метода в инициализатор или что-то, например, .irbrc
или же .pryrc
если вы используете pry. Вот более симпатичная и немного более умная версия:
def pbcopy(arg)
out = arg.is_a?(String) ? arg : arg.inspect
IO.popen('pbcopy', 'w') { |io| io.puts out }
puts out
true
end
Вы можете использовать мой гем буфера обмена для Ruby-API для системного буфера обмена (который также не зависит от платформы, в macOS он будет использовать тот же pbcopy
Утилита под капотом), так что вы можете использовать ее из IRB:
require 'clipboard'
Clipboard.copy(stringdata);p
Обычно copy
Метод возвращает строку, которая была скопирована. Это причина ;p
немного: это трюк, чтобы вернуться nil
чтобы консоль не отображала фактические строковые данные.