Що означає: відкрити робити in 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.

Він не коментує характер "моделювання", і чому це вважається імітацією, а не реальною командою з різною поведінкою. Запускаючи з колишнього режиму (Q), він дійсно веде себе так, як описано.

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

Моє запитання: Чому це не документально підтверджено? Чи є якісь відмінності від того, :editщо я не помічаю? Був :openколись синонімом :editі лише змінився пізніше, намагаючись наполовину відповідати POSIX?

Відповіді:


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()трохи волохатий, і його поведінка сильно модифікується на основі фактичної команди, яка була видана, але вона ніколи прямо не перевіряє, чи лексеми команди відкриті / редагують / візуальні. Таким чином, три команди приводять до більш-менш одного і того ж коду do_exedit().


8

Від вступу до редагування дисплея за допомогою Vi :

Якщо ви знаходитесь на терміналі копіювання або терміналі, у якого немає курсору, який може переміститися з нижнього рядка, ви все одно можете використовувати набір команд vi, але в іншому режимі. Коли ви дасте команду vi, редактор скаже вам, що вона використовується у відкритому режимі. Ця назва походить від відкритої команди в ex, яка використовується для входу в той же режим.

Єдина відмінність візуального режиму від відкритого режиму - це спосіб відображення тексту.

У відкритому режимі редактор використовує у вікні один рядок, а переміщення у файлі назад та вперед призводить до відображення нових рядків, завжди нижче поточного рядка. Дві команди vi працюють у відкритому режимі по-різному: z і ^ R. Команда z не приймає параметрів, а навпаки малює вікно контексту навколо поточного рядка, а потім повертає вас до поточного рядка.

Якщо ви знаходитесь на терміналі копіювання, команда ^ R буде повторно вказати поточний рядок. У таких терміналах редактор зазвичай використовує два рядки для представлення поточного рядка. Перший рядок - це копія рядка, коли ви почали його редагувати, і ви працюєте над рядком під цим рядком. Коли ви видаляєте символи, редактор вводить число \, щоб показати вам символи, які видаляються. Редактор також передрукує поточний рядок незабаром після таких змін, щоб ви могли знову побачити, як виглядає рядок.

Іноді корисно використовувати цей режим на дуже повільних терміналах, які можуть підтримувати vi в повноекранному режимі. Це можна зробити, ввівши ex та використовуючи відкриту команду.

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

Незважаючи на розпливчасті подібності, :openце не є альтернативою :editжодному розтягуванню уяви.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.