Что делает: open do в vim?

18

В документации 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) он действительно ведет себя так, как описано.

Тем не менее, также есть другая команда открытия. При запуске из обычной командной строки или из ex-режима с другими аргументами это выглядит как синоним :edit. При запуске из командного режима с помощью /pattern/, он позиционирует курсор и, по- видимому, запускается :edit(при этом положение курсора становится очевидным только в том случае, если: редактирование не выполняется.) Он также может быть запущен как :open /pattern/ file, что позиционирует курсор и запускает:edit file

Мой вопрос: почему это не задокументировано? Есть ли отличия от того, :editчто я не замечаю? Был ли :openкогда-то синоним для :editи только изменен позже в попытке на полпути соответствовать POSIX?

Random832
источник

Ответы:

13

«Открытый режим» vi был полезен для терминалов, которые имели одну строку, таких как печатные терминалы. В открытом режиме у vi был «однострочный просмотр» файла. Перемещение курсора перерисовывает всю строку, а удаленные символы печатаются по-разному.

«Симуляция», которую выполняет vim - это просто поддержка команды, заставляющая ее действовать (как сказано в документации) как :visualи так :visualкак «в противном случае то же самое :edit, что и», возможно, поэтому вы видите, что она действует как :edit.

С точки зрения исходного кода, :openреализовано в ex_docmd.c( ex_open()). Он делает некоторые вещи, чтобы иметь дело со случаем, когда ему предоставляется регулярное выражение, но всегда заканчивается вызовом do_exedit().

Реализация :edit, :baddи :visualсодержится в ex_edit()функции в том же файл, и эта функция является прямым вызовом к do_exedit()(ничего). Таким образом, кроме обработки параметра регулярного выражения, вызывается тот же код. do_exedit()это немного сложно, и его поведение сильно изменяется в зависимости от фактической команды, которая была выполнена, но он никогда явно не проверяет жетоны команд для open / edit / visual. Таким образом, три команды приводят к более или менее одинаковому запуску кода do_exedit().


источник
8

От введения к редактированию отображения с помощью Vi :

Если вы находитесь на печатном терминале или на терминале, у которого нет курсора, который может сдвинуться с нижней строки, вы все равно можете использовать набор команд vi, но в другом режиме. Когда вы даете команду vi, редактор скажет вам, что она использует открытый режим. Это имя происходит от команды open в ex, которая используется для входа в тот же режим.

Единственная разница между визуальным режимом и открытым режимом - это способ отображения текста.

В открытом режиме редактор использует окно с одной строкой в ​​файле, а перемещение вперед и назад в файле приводит к отображению новых строк, всегда ниже текущей строки. Две команды vi по-разному работают в open: z и ^ R. Команда z не принимает параметры, а рисует окно контекста вокруг текущей строки, а затем возвращает вас к текущей строке.

Если вы находитесь на печатном терминале, команда ^ R перепечатает текущую строку. На таких терминалах редактор обычно использует две строки для представления текущей строки. Первая строка - это копия строки, когда вы начали ее редактировать, и вы работаете над строкой под этой строкой. Когда вы удаляете символы, редактор печатает несколько символов, чтобы показать вам символы, которые были удалены. Редактор также перепечатывает текущую строку вскоре после таких изменений, чтобы вы могли снова увидеть, как выглядит эта строка.

Иногда полезно использовать этот режим на очень медленных терминалах, которые могут поддерживать vi в полноэкранном режиме. Вы можете сделать это, введя ex и используя команду open.

:openявляется артефактом происхождения Вима как клона Vi, который сегодня совершенно бесполезен. Я могу только предположить, что он остается там для совместимости с POSIX.

Несмотря на смутное сходство, :openэто не альтернатива :editникакому воображению.

romainl
источник