从文本/命令自动生成终端窗口截图以获取文档?

时间:2014-02-28 01:31:24

标签: macos unix graphics

好的,我希望堆栈溢出是正确的问题:我已经搜索到了很高的范围,到目前为止还没有找到一个好的解决方案。

我正在为命令行和编程新手写一堆文档,包括他们在与终端窗口交互时可能会看到的很好的截图。我正在考虑在重构文本中执行此操作,以便我可以保持版本控制和多格式(以便以后转换为html,latex / pdf等)。有没有什么方法可以将命令/代码/文本/等保存在文档中以进行版本控制,但仍然以自动方式生成用户友好的截图,以包含在最终文档中?作为一个例子,也许在我的标记中我有类似的东西(我对restructuredtext指令还不是很熟悉,但它们看起来非常强大):

.. terminal:: ls_example.png
pre:
   /Users/soneil/Documents/test% ls
post:
   /Users/soneil/Documents/test% ls
   testfile  todo.txt
   /Users/soneil/Documents/test% 

并获取终端窗口的两个屏幕截图,其中包含相应的文本。更复杂的部分是编辑器之类的ansi字符:

.. terminal:: nano_example.png
pre:
   /Users/soneil/Documents/test% ls
   testfile  todo.txt
   /Users/soneil/Documents/test% nano todo.txt
post:
   (Either the contents of test.txt right here [with or without editor decoration as well, 
    which could be faked if needed], 
    or let a script actually run the command and capture the output somehow)

导致类似:

上一页:http://d.pr/i/a1JS

发布:http://d.pr/i/Edu4

(很抱歉这些链接,我想我的图片声誉还不够,我也没有足够的声誉来发布两个以上的链接)。

我现在正在研究OSX,但我并没有依赖终端应用程序(甚至是OSX,真的)。如果我可以指定窗口的cols / rows也是很好的。涉及编程,imagemagick,ttyrec等的创意解决方案欢迎;我甚至考虑过与Terminal.app的Applecript交互,但收效甚微。我希望用ansi颜色(例如top,htop的视图)和最好是窗口chrome来获得另一端的东西,所以像png这样的栅格格式到目前为止似乎是合乎逻辑的。

呼!谢谢你的时间 -

1 个答案:

答案 0 :(得分:0)

您自动生成屏幕截图的想法很棒,但如果您实际将它们作为图像文件执行,那么它就不会那么好,因为人们无法从中复制和粘贴它们。

我建议使用AppleScript和Mavericks终端中的复制格式文本功能来制作终端显示的富文本副本,并将其转换为HTML以包含在文档中。

这是一个红宝石脚本:

#!/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby

command = '/bin/ls -G /'

clipboard = `osascript -e '
tell application "Terminal"
    set newTab to do script
    delay 0.1
    do script "#{command}" in newTab
    delay 0.1
    activate newTab
    -- ⌘-A select all
    tell application "System Events" to keystroke "a" using command down
    -- ⌘-C copy
    tell application "System Events" to keystroke "c" using command down
    delay 0.1
    do script "exit" in newTab
end tell
get the clipboard as «class RTF »
'`

# this returns "«data RTF 7B5C…27D»"; need to strip out the hex data
hex_data = /[A-F0-9]{2,}/.match(clipboard).to_s
data = [hex_data].pack('H*')

converter = IO.popen('textutil -cat html -stdin -stdout', 'w+')
converter.puts data
converter.close_write
puts converter.gets(sep='')

command发送到终端,复制终端内容,从剪贴板中抓取终端内容,并将其转换为HTML。

如果您将该输出直接输入浏览器 you get a copy of your terminal, with fonts and colours preserved, all copy-and-pastable

enter image description here

输出HTML可能有点混乱,但由于它已经是Ruby内部的数据,您可以编写代码来清理它。如果您仍然希望终端输出周围的终端框架,您可以使用CSS。

希望这有帮助!