man script
说:
某些交互式命令,例如 vi(1),会在打字稿文件中创建垃圾。脚本最适合不操作屏幕的命令,结果旨在模拟硬拷贝终端。
我尝试了一下,启动一个脚本会话,然后启动 vim,输出中似乎确实有控制字符。scriptreplay
完成后重播打字稿还在我的命令行上留下了一些控制字符。
然而,它做到了大多工作,甚至可以正确捕获带有分割窗口的 vim 会话。流氓控制角色似乎是一个轻微的烦恼,而不是一个根本问题。那么是否有一个类似的程序可以script
在没有这种烦恼的情况下工作呢?
答案1
简短:可能不会
长的:
首先,手册页中的评论script
讨论了获取该文本并制作纯文本(无控制字符)版本的问题,该版本显示您最初在屏幕上看到的内容。该scriptreplay
工具是一种解决方法,它不会尝试创建纯文本文件,而是像电影一样重播文本。
typescript
保存的文件很难script
转换为纯文本文件,因为全屏文本编辑器(例如vim)使用光标寻址。 vim 不是每次进行更改时都重新绘制整个屏幕(原则上这将允许您看到一系列屏幕),而是在屏幕上移动光标来进行更改。
如果您不进行更改(包括滚动),您当然可以获得一个带有很少控件的简单屏幕。但问题并不是问那种特殊情况。
如果您能够使 vim 使用没有光标寻址的终端描述,那么它“可能”被迫重新绘制(而不是移动光标)。然而,vim 默认使用它的内置终端描述,通常忽略终端数据库(参见代码)。例如,在终端数据库中,dumb
没有游标寻址。 vim 的版本有光标寻址:
/*
* The most minimal terminal: only clear screen and cursor positioning
* Always included.
*/
{(int)KS_NAME, "dumb"},
{(int)KS_CL, "\014"},
#ifdef TERMINFO
{(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH",
ESC_STR "[%i%p1%d;%p2%dH")},
#else
{(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")},
#endif
因此,您将进行光标移动(并更新屏幕)。
您看到的控制字符回显到终端是一个不同的功能。 vim 向终端发送转义序列如果它可能是一个 xterm,询问它是什么版本(打开 vim 的一些可选功能)。这是一个标准的 VT100 转义序列(设备属性DA
),因此许多终端(xterm 除外)都会做出响应,将字符发送到计算机,这会将它们留在您的命令行上。