Vim的文档中有关于:open命令的说明:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.


它没有评论“模拟”的性质,以及为什么认为这是模拟而不是具有不同行为的真实命令。当从ex模式(Q)运行时,它的确确实符合上述说明。

但是,似乎也有一个不同的open命令。从普通命令行运行,或者从带有不同参数的ex模式运行时,它似乎是:edit的同义词。从带有/pattern/的命令模式运行时,它将定位光标并显然运行:edit(仅当:edit失败时才显示光标位置。)它也可以作为:open /pattern/ file运行,后者定位光标并运行:edit file

我的问题是:为什么没有对此进行记录?与:edit有什么不一样的地方吗? :open曾经是:edit的同义词,只是后来为了试图中途遵守POSIX而进行了更改?

#1 楼

vi的“开放模式”对于只有一行的终端(例如硬拷贝终端)很有用。在打开模式下,vi具有文件的“单行视图”。左右移动光标将重画整行,并且删除的字符以不同的方式打印。

vim所做的“模拟”只是支持该命令,使其像:visual一样起作用(如文档所述),并且由于:visual“否则与:edit相同”,这可能就是您看到它的原因从源代码角度来看,:edit是在:openex_docmd.c)中实现的。它可以处理提供正则表达式的情况,但是总是以对ex_open()的调用结尾。

do_exedit():edit:badd的实现包含在:visual函数中。相同的文件,该函数是对ex_edit()的直接调用(没有其他功能)。因此,除了处理正则表达式参数外,还会调用相同的代码。 do_exedit()有点毛茸茸,它的行为会根据发出的实际命令进行大量修改,但是从不显式检查命令标记的打开/编辑/可视化。因此,这三个命令导致在do_exedit()中运行几乎相同的代码。

#2 楼

从Vi的显示编辑简介:


如果您使用的是硬拷贝终端或没有游标可以移至底线的终端,则仍可以使用vi的命令集,但模式不同。当您发出vi命令时,编辑器将告诉您它正在使用开放模式。此名称来自ex中的open命令,该命令用于进入相同的模式。

可视模式和open模式之间的唯一区别是文本的显示方式。

在打开模式下,编辑器使用单个行窗口进入文件,并且在文件中前后移动会导致显示新行,始终在当前行下方。 vi的两个命令在打开时的工作方式不同:z和^ R。 z命令不带参数,而是在当前行周围绘制一个上下文窗口,然后将您返回到当前行。

如果您在硬拷贝终端上,则^ R命令将重新输入当前行。在这样的终端上,编辑器通常使用两行代表当前行。第一行是您开始对其进行编辑时的副本,并且您在此行下方的行上进行工作。删除字符时,编辑器将键入多个\,以显示被删除的字符。编辑器还会在进行此类更改后立即重新打印当前行,以便您可以再次看到该行的样子。屏幕模式。您可以通过输入ex并使用打开的命令来执行此操作。我只能假设它仍然存在,以便与POSIX兼容。

尽管有相似之处,但无论如何,:open都不能替代:open