有没有与 vim 配合良好的脚本版本?

有没有与 vim 配合良好的脚本版本?

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 除外)都会做出响应,将字符发送到计算机,这会将它们留在您的命令行上。

相关内容