История Vi и Vim идёт параллельно с историей опенсорсного ПО. В этой статье мы окунёмся в прошлое, чтобы исследовать процесс зарождения текстовых редакторов UNIX, попутно рассмотрев наиболее значимые решения в этой сфере и исторические события, связанные с их эволюцией.
Недавно я отправился в Лондон посетить альма-матер моей жены, Университет королевы Марии[1]. Остановившись выпить кофе, я прочёл сообщение о том, что Брам Моленар[2], создатель Vim, покинул наш мир.
Честно говоря, при том, что у меня дома растет новый член семейства, и параллельно я ещё записываю новый курс по ассемблеру MIPS для своего обучающего портала[3], мне стало сложно уследить за последними новостями. Поэтому признаюсь, известия о кончине Брама я получил почти с недельным запозданием.
Я не знал Брама лично и далеко не являюсь экспертом по Vim, но тот факт, что тогда я как раз посещал Университет королевы Марии, заставил меня на мгновение приостановиться и поразмышлять о связи этого места с длинной и яркой историей Vim.
Университет королевы Марии сыграл важную роль в истории этого редактора. Именно здесь в 1973 году была установлена первая в Великобритании система UNIX, и здесь же профессор Джордж Кулурис[4] разработал редактор em. Создание em вызвало лавинообразный эффект разработки vi и многих его клонов.
Лондонский университет королевы Марии, где в 1976 году преподавал Джордж Кулурис
Ed
Оболочка UNIX невероятно перегружена текстом. Исполняемые файлы вызываются с помощью текста, параметры парсятся через текст, потоки данных перемещаются по системе тоже через текст, и практически всё в этой оболочке выполняется с помощью токенов текста. Не удивительно, что пользователи UNIX столь трепетно относятся к текстовым редакторам.
Здесь, пожалуй, стоит начать с ed, редактора командной строки, созданного Кеном Томпсоном для работы не с видеотерминалами, а с телепринтерами[5].
Teletype Model 15
Ed относится к так называемым строчным редакторам. Редактирование строк по одной идеально подходило для телепринтеров, но с ростом популярности видеодисплеев большинству пользователей работа с ed начала надоедать. К этим пользователям также относился Джордж Кулурис, который считал команды ed загадочными и не подходящими для «простых смертных».
Строковый редактор Ed
На создание ed Томпсона вдохновил другой редактор, QED[6] (quick editor, быстрый редактор). QED также был ориентирован на построчную обработку в телепринтерах, разработанных для консоли SDS 940[7]. Кен Томпсон переписал этот редактор, используя BCPL[8] для выполнения MULTICS[9] (предшественницы UNIX).
Интересный факт: Ed стал строчным редактором для UNIX и остаётся частью стандарта POSIX[10] по сей день. В конце концов, «Ed is the standard text editor[11]».
Em
После череды разочарований в использовании ed в феврале 1976 года, находясь на должности лектора в Университете королевы Марии, Кулурис решил доработать этот редактор, взяв за основу исходники кода Кена Томпсона. Так родился em[12] (Ed для смертных).
Em предназначался для работы с видеотерминалами. Это был визуальный редактор для построчной работы, также являвшийся одной из первых программ UNIX, активно использовавшей «режим ввода без обработки», в котором все нажатия клавиш обрабатывались при выполнении программы (а не драйвером устройства терминала).
Но ed расстраивал не только Кулуриса. Недовольство этим редактором проявляло всё больше людей и по другую сторону океана.
Vi
В 1976 году Томпсон посетил Калифорнийский университет[13], куда привёз с собой сломанный компилятор Pascal для UNIX, который нужно было исправить. В итоге эта задача была возложена на студента того же университета, Билла Джоя[14]. Однако постепенно Джой заметил, что ed его тормозит.
Калифорнийский университет, где Билл Джой был студентом выпускного курса, когда разработал vi
Летом 1976 года, когда Кулурис приехал в Калифорнийский университет, он привёз с собой DECtape[15] с em и показал его разным специалистам. Некоторые сочли этот новый вид текстового редактора пожирателем ресурсов в то время, как других, включая Билла Джоя, программа Кулуриса впечатлила.
Билл Джой
Вдохновлённый редактором em и собственными доработками редактора ed, Билл Джой и Чак Хейли (оба выпускники университета) создали новый редактор, который назвали en. Вскоре после этого они «расширили» его, разработав ex[16]. В октябре 1977 года Билл Джой добавил в ex полноэкранный режим, и ex превратился в vi[17].
Редактор vi способен отрисовывать и редактировать текст в полноэкранном режиме
Код в vi и ex был общий. Можно рассматривать vi как запуск ex с дополнительным параметром, активирующим отрисовку и редактирование текста на видеотерминале компьютера. По факту vi просто является визуальным режимом для ex.
Название «vi» происходит из аббревиатуры команды ex (vi), отвечающей за вход в визуальный режим внутри редактора. Позднее, как большинство из нас знают, vi фактически стал исполняемым именем, которое вызывается из оболочки UNIX.
Джой также отмечал, что в основе многих функциональных возможностей vi лежал редактор Bravo[18]. Bravo был бимодальным текстовым редактором, разработанным в Xerox PARC для Xerox Alto[19].
Bravo был WYSWYG-редактором документов, способным использовать множество шрифтов и оснащённым растровым экраном Xerox Alto
Также важно добавить, что Билл Джой разрабатывал vi, используя терминал ADM-3A[20]. В этом терминале клавиша Escape расположена в дальней левой части клавиатуры, там же, где в современных находится клавиша Tab.
Многие сокращения vi и навигационные клавиши, которые мы используем до сих пор, стали наследием раскладки клавиш на ADM-3A
Помимо того, что используемые в vi сокращения основывались на раскладке ADM-3A, также нужно сказать, что Билл Джой создавал свой редактор, работая через крайне медленный модем со скоростью 300 бодов.
В одном из интервью[21] он прокомментировал процесс написания ex и vi так:
«Это заняло много времени и оказалось реально трудной задачей, поскольку вы должны помнить, что я пытался сделать его пригодным к использованию по модему со скоростью 300 бодов. По той же причине там и появились все эти забавные команды. По модему экранный редактор использовать едва получалось. Скорости не хватало. Потом я сделал апгрейд до 1 200 бодов. Сейчас 1 200 уже весьма медленно. Если передача со скоростью 9 600 бодов опережает скорость нашего чтения, то 1 200 намного медленнее неё. Поэтому я оптимизировал редактор так, чтобы можно было заниматься редактированием и ощущать продуктивность при отрисовке, происходящей медленнее потока мышления[22]. Теперь, когда компьютеры работают намного быстрее, чем человек думает, никто этого уже не понимает».
Джой также сравнил разработку vi и Emacs:
«Люди, создававшие Emacs, трудились в лабораториях MIT, используя оптоволоконное, говоря современным языком, подключение к хосту. Они работали на PDP-10, огромной машине с невероятно быстрыми экранами. Это позволяло им создавать смешные команды, настраивающие мерцание экрана и прочее, в то время, как я сидел дома в Беркли, в жилье, напоминавшем пережитки Второй мировой войны, используя модем и терминал, на котором курсор едва отрывался от нижней строки. Сегодня этот мир уже вымер».
В 1978 году Билл Джой также занимался в Калифорнийском университете созданием первой версии ОС BSD[23], основанной на исходном коде UNIX, куда входил редактор ex. Это помогло увеличить популярность его редактора за пределами университета.
Большинство пользователей проводили всё своё время в визуальном режиме ex, поэтому Билл решил создать жёсткую ссылку, называемую vi, которую добавил во второй дистрибутив BSD в мае 1979 года.
Джой также утверждает, что основной причиной роста популярности vi стал тот факт, что он был доступен и включён в BSD в то время, как другие редакторы вроде Emacs могли стоить сотни долларов.
Клоны Vi
На основе vi было создано немало клонов. Идея состояла в том, чтобы либо улучшить исходный редактор, расширив его функциональность, либо портировать его на другие платформы (Atari ST, Amiga, MS-DOS, OS/2 и так далее). Один из таких портов и стал в последствии редактором Vim[24], который разработал Моленар.
▍ Stevie
Stevie[25] (ST Editor для энтузиастов VI) был клоном vi для Atari ST[26].
Тим Томпсон написал первую версию Stevie и разместил его исходный код в виде бесплатного ПО в новостной группе comp.sys.atari.st[27] в июне 1987 года. Позднее Stevie также портировали на UNIX, OS/2 и Amiga.
Редактор Stevie на Atari ST
Одной важнейшей деталью Stevie было то, что он писался с нуля без использования исходного кода vi. Код vi был основан на коде ed, который разрабатывался в AT&T. Теоретически это означало, что vi может быть использован только обладателями лицензии AT&T. Именно поэтому многие клоны vi также предпочли использовать исходный код Stevie, а не vi.
▍ Elvis
Elvis[28] – этот редактор занимает в моём сердце особое место, поскольку он был первым клоном vi, который я использовал профессионально. Какое-то время я жил на юге Бразилии, когда как раз получил свою первую должность программиста.
Именно с помощью Elvis я впервые познакомился со всеми возможностями vi. Мы использовали его в далёких 90-х для редактирования исходного кода MUMPS[29] и ZIM[30] под запуск на серверах с HP-UX[31] и Solaris[32]. Моей первой работой было портирование старой базы данных MUMPS для использования этого блестящего языка в 4-м поколении, называемого ZIM (сегодня уже не существует).
Серверы многих наших клиентов располагались в удалённых сельских районах страны, что означало крайне медленное и непостоянное подключение к интернету. Если вам доводилось подключаться и редактировать текст на сервере, где отображение вашего ввода на экране занимает долгие секунды, то вы поймёте, что имел ввиду Билл Джой, когда говорил о забавных командах vi, которые зачастую вызывались односимвольными инструкциями.
Elvis был одним из первых клонов vi, в котором появилась поддержка GUI и выделение синтаксиса
Создатель Elvis, Стив Киркендалл, начал подумывать о написании собственного редактора, после того как его подвёл Stevie, из-за которого он потерял много часов усердного труда.
Stevie хранил буфер редактирования в RAM, что, по мнению Киркендалла, в операционной системе MINIX[33] было непрактичным решением. Одним из основных мотивов Стива к написанию собственного клона vi стало желание, чтобы новый редактор хранил буфер редактирования в файле, а не в RAM. Благодаря этому, даже если редактор давал сбой, редактируемый текст всё равно можно было извлечь из этого файла.
Интересный факт: когда Киркендалла спрашивали: «Почему Elvis?», он говорил, что отчасти он выбрал это имя, чтобы в последствии его спрашивали, почему он выбрал именно его. Кроме того, клоны vi, как правило, содержат в своём названии буквы vi.
В Elvis впервые появились многие идеи, которые были адаптированы в более поздних клонах. Этот редактор любили за его лаконичность и богатую функциональность. Вдобавок к этому, он был первым редактором, в котором появилось выделение синтаксиса и обобщение выделения синтаксиса на несколько типов файлов.
Создатель MINIX, Эндрю Таненбаум[34], обратился к сообществу с просьбой выбрать для их первой операционной системы в качестве основного редактора Stevie или Elvis. Выбор пал на Elvis, и он по сей день остаётся базовым редактором этой ОС.
Vim
И вот мы подобрались к Vim[24]. Это, пожалуй, самый популярный клон vi за всю историю. Он развился в невероятно мощную программу с активным сообществом, которое продолжает расширяться. Сейчас его уже сложно назвать клоном vi, но именно в качестве него он начинал.
Вдохновлённый предыдущим портом Stevie для Commodore Amiga[35], Брам Моленар начал работать над Vim для Amiga в 1988 году.
Да, так и есть… Изначально Vim создавался для Commodore Amiga. Меня всегда удивляет тот факт, что это известно не всем программистам, включая тех, кто использует Vim постоянно.
Первый публичный релиз Vim (v. 1.14) состоялся в 1991 году.
Vim v1.14 в рабочем пространстве Commodore Amiga
Как видно на картинке выше, имя Vim – это акроним для Vi IMitation. В 1993 году оно было изменено на Vi iMproved.
Интересный факт: публичная копия Vim для Amiga была включена в диск Фреда Фиша #591[36]. Фред Фиш был программистом, известным своей работой над GDB[37] для GNU, а также выпуском серии дисков с бесплатным ПО для Amiga. Серия Fish Disks[38] продолжала выходить с 1986 по 1994 годы. Фиш распространял свои диски по миру через компьютерные магазины и клубы энтузиастов Amiga.
Использование в качестве основы Vim исходного кода Stevie, а не vi, означало, что программу можно будет распространять без необходимости получать лицензию на исходный код AT&T. Vim выпускается под лицензией Vim[39], которая сопровождается обращением, призывающим пользователей сделать пожертвование на нужды детей в Уганде.
Экран запуска Vim
Моленар являлся правозащитником в неправительственной организации в Кибаале, Уганда, которую основал с целью поддержки детей, чьи родители умерли от СПИДа. В 1994 году он выступил добровольцем на должность инженера по водоснабжению и канализации в детском центре Кибаалы и в течение последующих двадцати пяти лет неоднократно туда возвращался.
Интерфейс Vim, как и в vi, основан не на меню или иконках, а на командах, отдаваемых через текстовый интерфейс. В Vim также есть режим GUI, позволяющий использовать меню и панели инструментов, но самым популярным его режимом по-прежнему является текстовый UI в командной строке UNIX.
В Vim есть режим совместимости, но когда он не используется, у редактора есть множество преимуществ в сравнении с vi. Некоторые из них – поддержка символов Unicode, регулярные выражения, автодополнение, выделение синтаксиса и многие другие небольшие IDE-подобные функции.
▍ Vim сегодня
В отличие от других клонов vi, Vim по-прежнему находится в активной разработке, будучи окружён обширным сообществом пользователей и разработчиков. Для него продолжают создавать новую функциональность, делая всё более эффективным.
Кроме того, естественно, собственную функциональность Vim можно расширить одним из множества сторонних плагинов. В комбинации с мощным кастомным скриптовым языком, VimScript[40], этот редактор можно превратить в невероятно продуктивный инструмент программирования.
Я решил не упоминать какие-либо плагины Vim и не перечислять в этой статье различные его конфигурации, поскольку это не было её изначальной целью. Если вы посмотрите какую-нибудь из моих лекций[3], то увидите, что я использую Vim, но совсем без излишеств. Помимо внесения некоторых косметических изменений, я добавил единственный плагин под названием YouCompleteMe[41]. Но я уверен, что для улучшения вашего Vim есть и более качественные ресурсы.
Vim можно расширять сторонними плагинами, которые способны практически превратить ваш редактор в IDE-подобную программу
Важные моменты в начале истории разработки Vim:
1988: (Vim 1.0) Разработка Vi IMitation на Amiga;
1991: (Vim 1.14) Первый публичный релиз на диске Фреда Фиша #591;
1993: (Vim 1.22) Порт на UNIX и переименование в Vi Improved;
1994: (Vim 3.0) Появление нескольких окон;
1996: (Vim 4.0) Появление графического пользовательского интерфейса;
1998: (Vim 5.0) Появление выделения синтаксиса;
2001: (Vim 6.0) Появление сворачивания и многоязычности;
2006: (Vim 7.0) Появление проверки правописания и поддержки вкладок.
Сегодня Vim уже более 30 лет. На графике ниже[42] показаны некоторые значимые этапы его жизни и улучшения за последние 20 лет. Построил этот график @mpereira[43]. Он отражает историю разработки Vim с позиции репозитория GIT[44], созданного в 2004 году.
Созданный Брамом Моленаром редактор является легендой среди разработчиков. В некоторых опросах он неоднократно назывался одним из самых используемых редакторов или IDE и по-прежнему является базовым во многих современных дистрибутивах Linux.
Моленар прекратил обновлять Vim лишь за несколько недель до своей кончины. Вычислительный мир, каким мы его знаем сегодня, в значительной степени развивался усилиями людей, подобных Браму, и лишь немногие инструменты с открытым исходным кодом заслужили такого признания, как Vim.
Оглядываясь назад и размышляя об истории этих редакторов, мы испытываем чувство восторга, ведь они сыграли непосредственную роль в развитии компьютерных наук.
Находясь здесь, в здании Университета королевы Марии, где эти события происходили почти 50 лет назад, и используя Vim для написания этой статьи, я получаю невероятные впечатления. Глядя на мигающий курсор текста, я преисполняюсь тёплыми чувствами, очень схожими с ощущениями, которые возникают, когда я смотрю на океан или какое-нибудь столетнее дерево. Такое созерцание подталкивает нас к размышлению о времени, которое было до нас, и событиях, которые способствовали формированию знакомого нам современного мира.