Введение

Клавиатурный текстовый редактор

vi (произносится как отдельные буквы, /v/ /iː/ /'aɪ/ audio=en us vi. oga/) — текстовый редактор, ориентированный на экран, первоначально созданный для операционной системы Unix. Портативный поднабор поведения vi и программ, основанных на нём, а также язык редактора ex, поддерживаемый в этих программах, описан (и, таким образом, стандартизирован) спецификацией Single Unix и POSIX. Оригинальный код для vi был написан Биллом Джоем в 1976 году как визуальный режим редактора строк под названием ex, который Джой разработал вместе с Чаком Хейли. Bill Joy's ex 1.1 был выпущен как часть первого дистрибутива Berkeley Software Distribution (BSD) Unix в марте 1978 года. Лишь в версии 2.0 ex, выпущенной в рамках Second BSD в мае 1979 года, редактор был установлен под названием "vi" (что сразу переводило пользователей в визуальный режим ex) и стал известен под этим именем. Некоторые современные реализации vi могут проследить происхождение своего исходного кода до Билла Джоя, другие — это совершенно новые, в значительной степени совместимые переосмысления. Название "vi" происходит от кратчайшей однозначной аббревиатуры команды visual ex, которая переключает редактор строк ex в полноэкранный режим. Название произносится как /v/ /iː/ /'aɪ/ (английские буквы v и i). Помимо различных несвободных вариантов vi, распространяемых с проприетарными реализациями Unix, vi был выпущен под открытой лицензией вместе с OpenSolaris, и существует несколько клонов vi с открытым исходным кодом. Опрос, проведённый в 2009 году среди читателей Linux Journal, показал, что vi был наиболее широко используемым текстовым редактором среди респондентов, обогнав gedit, второй по популярности редактор, почти в два раза (36% против 19%).

Создание

vi был создан на основе последовательности редакторов командной строки UNIX, начиная с ed, который представлял собой редактор строк, разработанный для работы с телепринтерами, а не с дисплейными терминалами. В корпорации AT&T, где и возник ed, люди, казалось, были довольны таким простым и неудобным редактором, как ed, вспоминает Джордж Кулурис, будучи преподавателем в Королевском колледже. Редактор em был разработан для дисплейных терминалов и являлся визуальным редактором, работающим построчно. Он был одной из первых программ в Unix, активно использовавшей "режим прямого ввода с терминала", при котором работающая программа, а не драйвер терминального устройства, обрабатывала все нажатия клавиш. Когда Кулурис посетил Калифорнийский университет в Беркли летом 1976 года, он привез DECtape с em и показал редактор разным людям. Некоторые считали этот новый тип редактора потенциально ресурсоемким, но другие, включая Билла Джоя, были впечатлены. Затем он "расширил" en, чтобы создать версию ex 0.1, над которой он работал с июня по октябрь 1977 года, добавив в ex полноэкранный визуальный режим, который и стал vi. vi и ex используют общий код; vi – это исполняемый файл ex, запускаемый с возможностью отображения редактируемого текста на компьютерном терминале, то есть визуальный режим ex. В более поздней литературе название vi объясняется как сокращение от слова "visual". Кроме того, vi – это команда оболочки для запуска ex/vi непосредственно из оболочки в визуальном режиме, что позволило представить его редактор аудитории за пределами UC Berkeley. Начиная с этого выпуска BSD Unix, единственными редакторами, поставляемыми с системой Unix, были ed и ex. В интервью 1984 года Джой объяснил успех vi тем, что он распространялся бесплатно, в то время как другие редакторы, такие как Emacs, могли стоить сотни долларов. Таким образом, при вызове как vi, ex автоматически запускался в визуальном режиме. Следовательно, vi не является эволюцией ex, vi – это ex. Джой описал ex 2.0 (vi) как очень большую программу, едва помещавшуюся в память PDP 11/70, поэтому, хотя сегодня vi может рассматриваться как небольшая и легкая программа, в начале своей истории это было не так. К версии 3.1, поставляемой с 3BSD в декабре 1979 года, полная версия vi больше не помещалась в память PDP 11; редактор также был слишком велик для работы на PC/IX для IBM PC в 1984 году. Джой оставался ведущим разработчиком vi до версии 2.7 в июне 1979 года. Обсуждая происхождение vi и причины прекращения разработки, Джой сказал:

Порты и клоны

До версии 3.7 редактора vi, созданной в октябре 1981 года, изменения в кодовой базе vi происходили медленнее и более разрозненно, что приводило к взаимной несовместимости. В UC Berkeley вносились изменения, но номер версии не обновлялся выше 3.7. Коммерческие поставщики Unix, такие как Sun, HP, DEC и IBM, получили копии исходного кода vi, и их операционные системы – Solaris, HP-UX, Tru64 UNIX и AIX – продолжали поддерживать версии vi, непосредственно происходящие от релиза 3.7, но с добавленными функциями, такими как настраиваемые привязки клавиш, шифрование и поддержка широких символов. В 1983 году vi был одним из нескольких UNIX-инструментов, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories. В то время как коммерческие поставщики могли работать с кодовой базой Билла Джоя, многие пользователи не имели такой возможности. Поскольку Джой начал с редактора ed Кен Томпсона, ex и vi являлись производными работами и не могли распространяться, за исключением лиц, имеющих лицензию AT&T. Тем, кто искал бесплатный редактор в стиле Unix, приходилось искать альтернативы. К 1985 году версия Emacs (MicroEMACS) была доступна для различных платформ, но только в июне 1987 года появился STEVIE (ST Editor for VI Enthusiasts) – ограниченный клон vi для Atari ST. В начале января 1990 года Стив Киркендалл опубликовал новый клон vi, Elvis, в новостной группе Usenet comp.os.minix, стремясь создать более полный и точный клон vi, чем STEVIE. Он быстро привлек значительный интерес в ряде сообществ энтузиастов. Эндрю Таненбаум попросил сообщество выбрать один из этих двух редакторов в качестве клона vi для Minix; был выбран Elvis, и он остается клоном vi для Minix по сей день. В 1989 году Линн Джолиц и Уильям Джолиц начали портировать BSD Unix для работы на процессорах класса 386, но для создания бесплатного дистрибутива им необходимо было избегать любого кода, содержащего компоненты AT&T, включая vi Джоя. Чтобы восполнить пробел, образовавшийся после удаления vi, их дистрибутив 386BSD 1992 года принял Elvis. Последователи 386BSD – FreeBSD и NetBSD – последовали этому примеру. Однако в UC Berkeley Кит Бостик хотел создать замену vi Джоя для 4.4BSD Lite, полностью совместимую по ошибкам. Используя Elvis Киркендалла (версия 1.8) в качестве отправной точки, Бостик создал nvi и выпустил его весной 1994 года. Гуннар Риттер портировал кодовую базу vi Джоя (взятую из 2.11BSD, февраль 1992) на современные операционные системы на базе Unix, такие как Linux и FreeBSD. Первоначально распространение его работы было технически незаконным без лицензии AT&T, но в январе 2002 года эти правила лицензирования были смягчены, что позволило законное распространение в качестве проекта с открытым исходным кодом. Риттер продолжал вносить небольшие улучшения в кодовую базу vi, аналогичные тем, которые вносили коммерческие поставщики Unix, все еще использующие кодовую базу Джоя, включая изменения, необходимые для соответствия стандарту POSIX.2 для vi. Его работа доступна как Traditional Vi. Однако, хотя vi Джоя снова стал доступен для BSD Unix, это произошло после того, как различные варианты BSD уже приняли nvi, который предоставлял ряд улучшений по сравнению с традиционным vi и отказался от некоторых устаревших функций (например, режима открытия для редактирования одной строки за раз). Таким образом, BSD Unix, где началась кодовая база vi Джоя, больше не использует её, а Unix-системы, разработанные AT&T, которым в первые дни не хватало редактора Джоя, теперь используют и поддерживают модифицированные версии его кода.

Влияние

За годы, прошедшие с момента создания, vi стал фактическим стандартом редактора Unix и любимым редактором хакеров за пределами MIT, пока примерно после 1984 года не появился Emacs. Спецификация Single UNIX требует наличия vi, поэтому каждая соответствующая система должна его содержать. Vi до сих пор широко используется пользователями семейства операционных систем Unix. Около половины респондентов в опросе USENET 1991 года отдали предпочтение vi. В 1999 году Тим О’Рейли, основатель одноименной издательской компании, специализирующейся на компьютерной литературе, заявил, что его компания продала больше экземпляров книги по vi, чем книги по Emacs.

Интерфейс

vi — это модальный редактор: он работает в режиме вставки (где вводимый текст становится частью документа) или в режиме команд (где нажатия клавиш интерпретируются как команды, управляющие сеансом редактирования). Например, вводя в режиме команд, редактор переключается в режим вставки, но повторный ввод в этот момент помещает символ "i" в документ. Из режима вставки нажатие переключает редактор обратно в режим команд. Считается, что разделение режимов ввода текста и команд в vi позволяет выполнять как редактирование текста, так и команды, не отрывая руки пользователя от базовой позиции. Поскольку немодальные редакторы обычно резервируют все клавиши с буквами и символами для вывода символов, любые специальные команды для действий, отличных от добавления текста в буфер, должны быть назначены клавишам, не выводящим символы, например, функциональным клавишам или комбинациям клавиш-модификаторов, таких как , и с обычными клавишами. Vi обладает свойством, что большинство обычных клавиш связаны с какой-либо командой для позиционирования, изменения текста, поиска и т. д., либо по отдельности, либо в комбинациях клавиш. Многие команды можно вводить вслепую, не используя или другие типы редакторов, как правило, требуют от пользователя перемещения рук с базовой позиции при вводе вслепую: Для использования мыши для выбора текста, команд или элементов меню в редакторе с графическим интерфейсом. Для клавиш со стрелками или функций редактирования (Home / End или функциональные клавиши). Для вызова команд с помощью клавиш-модификаторов в сочетании со стандартными клавишами печати. Например, в vi замена слова — это текст замены, который представляет собой комбинацию двух независимых команд (изменение и перемещение по слову) вместе с переходом в режим вставки и выходом из него. Текст между положением курсора и концом слова заменяется текстом замены. Операцию можно повторить в другом месте, вводя , в результате чего слово, начинающееся в этом месте, будет заменено тем же текстом замены. В учебнике по взаимодействию человека и компьютера на первой странице отмечается, что "одной из классических проблем пользовательского интерфейса, о которой рассказывают преподаватели HCI по всему миру, является отсутствие обратной связи редактора vi при переключении между режимами. Многие пользователи совершали ошибку, вводя текст в режиме команд или вводя команду в режиме вставки".

Современные производные и клоны

Vim "Vi IMproved" имеет множество дополнительных функций по сравнению с vi, включая (скриптуемое) выделение синтаксиса, поддержку мыши, графические версии, визуальный режим, множество новых команд редактирования и большое количество расширений в области команд ex. Vim входит в состав практически любого дистрибутива Linux (а также поставляется с каждой копией macOS). Vim также имеет режим совместимости с vi, в котором он более совместим с vi, чем обычно, хотя некоторые функции vi, такие как режим открытия, отсутствуют в Vim, даже в режиме совместимости. Этот режим управляется опцией. Vim автоматически включает его при запуске в ситуации, когда программное обеспечение может быть ожидаемо совместимым с vi. Функции Vim, не конфликтующие с совместимостью с vi, всегда доступны, независимо от настроек. Vim был создан на основе порта STEVIE на Amiga. Elvis — бесплатный клон vi для Unix и других операционных систем, написанный Стивом Киркендаллом. Elvis представил ряд функций, которые теперь присутствуют в других клонах vi, включая возможность использования клавиш курсора в режиме ввода. Он был первым, кто реализовал выделение синтаксиса цветом (и обобщил выделение синтаксиса для нескольких типов файлов). Elvis 1.x послужил отправной точкой для nvi, но Elvis 2.0 добавил множество функций, включая несколько буферов, окон, режимов отображения и схем доступа к файлам. Elvis является стандартной версией vi, поставляемой с Slackware Linux, Kate OS и MINIX. Самая последняя версия Elvis — 2.2, выпущенная в октябре 2003 года. nvi — реализация текстового редактора ex/vi, первоначально распространявшаяся в составе финальной официальной версии Berkeley Software Distribution (4.4 BSD Lite). Это версия vi, поставляемая со всеми BSD-совместимыми дистрибутивами с открытым исходным кодом. Она добавляет историю команд и редактирования, автодополнение имен файлов, несколько буферов редактирования и многооконный режим (включая несколько окон в одном буфере редактирования). Помимо версии 1.79, выпущенной в октябре 1996 года, которая является рекомендуемой стабильной версией, существуют "разрабатываемые выпуски" nvi, последний из которых — 1.81.6, выпущенный в ноябре 2007 года. vile изначально был создан на основе ранней версии Microemacs в попытке привнести парадигму многооконного/многобуферного редактирования Emacs пользователям vi и впервые был опубликован в Usenet alt.sources в 1991 году. Он обеспечивает бесконечную отмену, совместимость с UTF-8, многооконную/многобуферную работу, язык расширения макросов, выделение синтаксиса, хуки для чтения и записи файлов и многое другое. BusyBox, набор стандартных утилит Linux в одном исполняемом файле, включает в себя крошечный клон vi. Neovim — рефакторинг Vim, стремящийся его заменить.