Истоки и эволюция редакторов Vi и Vim
История Vi и Vim тесно переплетается с развитием программного обеспечения с открытым исходным кодом (Open Source Software). В этой статье мы отправимся в путешествие к истокам текстовых редакторов UNIX, чтобы рассмотреть ключевых участников и важные события, повлиявшие на их эволюцию.
Эта статья основана на посте Gustavo Pezzi: Understanding the Origins and the Evolution of Vi & Vim. Статья дополнена подробностями и уточнениями для более глубокого понимания.
Наше путешествие начнётся с Университета Королевы Марии, сыгравшего ключевую роль в истории редактора Vim. В 1973 году именно здесь была установлена первая в Великобритании система UNIX. Кроме того, профессор Джордж Кулурис разработал текстовый редактор под названием em. Этот редактор стал предшественником vi и вдохновил создание множества его клонов, включая Vim.
Ed
В UNIX-оболочках всё основано на тексте. Исполняемые файлы запускаются текстовыми командами, параметры передаются в текстовом формате, а потоки данных перемещаются по системе, используя текст. Практически все операции в ОС выполняются с помощью текстовых токенов. Неудивительно, что пользователи UNIX так увлечены текстовыми редакторами.
Думаю, нам следует начать с ed — редактора командной строки, созданного Кеном Томпсоном и предназначенного для работы с телетайпами, а не с экранными терминалами.
Первая заметка: телетайп — это устройство, напоминающее печатную машинку, но управляемое компьютером. В ранние годы развития компьютерных технологий мониторов ещё не существовало, и их роль выполняли телетайпы. Пользователи вводили команды на клавиатуре телетайпа, а результаты вычислений автоматически печатались на бумаге. Удобно, не так ли? Это сарказм :)
Ed — это так называемый линейный текстовый редактор. В нём редактирование текста происходило построчно, а не в привычном для нас сегодня формате, где весь текст доступен для визуального редактирования.
Редактирование одной строки за раз было вполне оправдано для телетайпов. Однако с появлением и ростом популярности видеодисплеев такой подход стал неудобным для большинства пользователей. Среди недовольных был и Джордж Кулурис из Университета Королевы Марии. Он считал команды редактора Ed слишком сложными и загадочными, неподходящими для обычных пользователей, или, как он выразился, «смертных».
На мое удивление, редактор Ed до сих пор доступен на MacOS и Ubuntu.
Для того, чтобы стало чуть понятнее, как это работает, опишу несколько команд:
a - append - добавление новой строки
. (точка) - завершить ввод строки
n - вывести все строки файла с нумерацией
w - write - сохранить файл
q - quit - выход из программы
У современного пользователя наверняка возникнет вопрос: зачем? Почему нужно редактировать текст построчно? В видео ниже автор подробно объясняет, почему так сложилось. Если же кратко, то задумайтесь: как вы могли бы переместить курсор на пишущей машинке? :)
Редактор Ed, созданный Кеном Томпсоном, был вдохновлён редактором под названием QED (Quick Editor, или “быстрый редактор”). QED также представлял собой линейный текстовый редактор, предназначенный для работы на телетайпах и разработанный для консоли SDS 940. Кен Томпсон переписал QED на языке программирования BCPL (Basic Combined Programming Language) для работы в операционной системе MULTICS, которая впоследствии стала предшественником UNIX.
Интересный факт: редактор Ed стал стандартным редактором строкового режима для операционной системы UNIX и сохраняет этот статус по сей день. Более того, он остаётся частью стандарта POSIX, обеспечивая совместимость с современными системами.
Em
После серии разочарований в использовании Ed, в феврале 1976 года Джордж Кулурис, будучи преподавателем в колледже Королевы Марии, решил усовершенствовать этот редактор. Взяв за основу оригинальный исходный код, написанный Кеном Томпсоном, он создал редактор em (Ed for Mortals — “Ed для простых смертных”).
Редактор em, созданный Кулурисом, был разработан специально для работы с дисплейными терминалами. Хотя он оставался построчным редактором, em стал одной из первых программ в UNIX, активно использовавших «режим необработанного терминала» (raw terminal mode). В этом режиме обработку всех нажатий клавиш брала на себя сама программа, а не драйвер терминального устройства.
Найти редактор em было сложнее. Но все же удалось найти исходники под современные ОС. Если решите попробовать собрать - вот репозиторий.
Однако Джордж Кулурис был далеко не единственным, кого разочаровал редактор Ed. На другой стороне Атлантики всё больше пользователей выражали недовольство работой с построчным редактором, созданным Кеном Томпсоном.
Vi
В 1976 году Кен Томпсон посетил Калифорнийский университет в Беркли, привезя с собой сломанный компилятор Паскаля для UNIX, который требовал доработки. Задачу по исправлению системы Паскаля Томпсона доверили студенту Биллу Джою. В процессе работы Джой всё чаще замечал, что редактор Ed ограничивает его возможности и замедляет процесс.
Летом 1976 года Джордж Кулурис посетил Калифорнийский университет в Беркли, привезя с собой DECtape с записанным редактором em. Он продемонстрировал свою разработку местным специалистам. Мнения разделились: некоторые посчитали, что такой обновлённый подход к текстовому редактору слишком ресурсоёмок, но другие, включая Билла Джоя, были впечатлены работой Кулуриса.
Стоит отметить, что компьютеры того времени были очень больши по размерам, но крайне слабы по производительности. К примеру, у вышеупомянутого SDS 940 было примерно от 72 КБ до 288 КБ оперативной памяти.
Вдохновившись редактором em Кулуриса, Билл Джой и Чак Хейли, оба аспиранты Калифорнийского университета в Беркли, создали новый редактор под названием en. Вскоре они расширили возможности en, разработав редактор ex. В октябре 1977 года Билл Джой добавил в ex полноэкранный визуальный режим, который получил название vi.
То есть Vi - это всего лишь "Визуальный" режим редактора Ex. Иронично правда? :)
Если вы хотите попробовать Ex самостоятельно, то для macOS можно установить при помощи пакетного менеджера homebrew. Ex - часть пакета ex-vi. Для установки запустите команду в терминале:
brew install ex-vi
Vi и ex — это на самом деле одна и та же программа с общим кодом. Можно считать, что vi — это запуск ex с дополнительным параметром, который позволяет отображать и редактировать текст на экранном терминале. По сути, vi является визуальным режимом редактора ex.
Интересный факт: визуальный режим в vi также назывался open-режимом, что можно перевести как “режим открытого редактирования текста”.
Название vi произошло от сокращённой команды visual, используемой для входа в визуальный режим из редактора ex. Со временем, как многим из нас известно, vi стало не только обозначением визуального режима, но и именем исполняемого файла, который мы запускаем из оболочки UNIX.
Джой также упомянул, что многие функции vi были вдохновлены редактором Bravo. Bravo — бимодальный текстовый редактор, разработанный в Xerox PARC для Xerox Alto.
Если захотите попробовать редактор Bravo - есть виртуальная машина Xerox Alto в браузере.
Кстати, компания Xerox и её революционные разработки, опередившие своё время, заслуживают отдельной статьи. Но об этом мы поговорим как-нибудь в другой раз.
Также стоит отметить, что Билл Джой разработал vi на терминале ADM-3A. На этом терминале клавиша Escape находилась в крайнем левом углу клавиатуры, примерно там же, где на современных клавиатурах расположена клавиша Tab. Такое расположение делало работу с Escape более удобной и естественной для пользователей того времени.
Интересный факт: многие современные пользователи vi переназначают почти неиспользуемую клавишу Caps Lock для смены режимов редактора. Это делает работу с vi быстрее и удобнее, особенно учитывая частое использование клавиши Escape.
Помимо влияния терминала ADM-3A на сочетания клавиш vi, стоит упомянуть, что Билл Джой создавал свой редактор, работая через чрезвычайно медленный модем со скоростью всего 300 бод. Эта особенность оказала значительное влияние на подход к оптимизации работы редактора и его интерфейса.
Бод — это единица измерения скорости передачи данных в телекоммуникациях, обозначающая количество символов (сигнальных изменений) в секунду. Один бод не всегда равен одному биту, так как один символ может содержать несколько бит информации в зависимости от используемой модуляции. Но это все еще очень медленно.
Вот цитата Билла Джоя из интервью о его процессе написания ex и vi:
"It took a long time. It was really hard to do because you've got to remember that I was trying to make it usable over a 300 baud modem. That's also the reason you have all these funny commands. It just barely worked to use a screen editor over a modem. It was just barely fast enough. A 1200 baud modem was an upgrade. 1200 baud now is pretty slow. 9600 baud is faster than you can read. 1200 baud is way slower. So the editor was optimized so that you could edit and feel productive when it was painting slower than you could think. Now that computers are so much faster than you can think, nobody understands this anymore."
«Это заняло много времени. Это было действительно сложно сделать, потому что нужно помнить, что я пытался сделать его пригодным для использования через модем на скорости 300 бод. Именно поэтому там есть все эти странные команды. Использовать экранный редактор через такой модем едва удавалось. Скорости едва хватало. Модем на 1200 бод был уже обновлением. Сейчас 1200 бод — это очень медленно. 9600 бод — быстрее, чем вы успеваете читать. А 1200 бод — намного медленнее. Поэтому редактор был оптимизирован так, чтобы вы могли редактировать и чувствовать продуктивность, даже когда скорость отображения была медленнее, чем скорость ваших мыслей. Теперь, когда компьютеры работают намного быстрее, чем человек успевает думать, никто этого больше не понимает.».
Джой также сравнивает разработку vi и Emacs:
"People doing Emacs were sitting in labs at MIT with what were essentially fibre-channel links to the host, in contemporary terms. They were working on a PDP-10, which was a huge machine by comparison, with infinitely fast screens. So they could have funny commands with the screen shimmering and all that, and meanwhile, I'm sitting at home in sort of World War II surplus housing at Berkeley with a modem and a terminal that can just barely get the cursor off the bottom line... It was a world that is now extinct."
«Люди, работавшие над Emacs, сидели в лабораториях MIT с тем, что в современных терминах можно назвать высокоскоростными соединениями типа Fibre Channel к хосту. Они работали на PDP-10, которая по сравнению с моими условиями была огромной машиной с невероятно быстрыми экранами. Так что они могли позволить себе забавные команды с мерцанием экрана и всем таким прочим. А тем временем я сидел дома в чем-то вроде послевоенного жилья времён Второй мировой в Беркли с модемом и терминалом, который с трудом мог поднять курсор с нижней строки экрана… Это был мир, который теперь полностью исчез.»
Билл Джой также сыграл ключевую роль в создании первой версии BSD UNIX в 1978 году, разработанной в Калифорнийском университете в Беркли. Эта версия включала редактор ex, что значительно поспособствовало его популярности за пределами университета и укрепило позиции редактора в сообществе UNIX.
Большинство пользователей проводили все свое время в визуальном режиме ex, поэтому Билл Джой решил создать жесткую ссылку под названием «vi» и добавить ее во второй дистрибутив BSD в мае 1979 года.
Билл Джой утверждал, что значительная часть популярности vi была связана с его доступностью: редактор поставлялся вместе с BSD UNIX. В то время как другие редакторы, такие как Emacs, могли стоить сотни долларов, vi был бесплатным и доступным для всех пользователей BSD, что сделало его предпочтительным выбором.
Клоны Vi
На основе vi были разработаны многие редакторы-клоны. Идея заключалась в том, чтобы либо улучшить исходный редактор, добавив в него новые функции, либо перенести интерфейс vi на другие платформы (Atari ST, Amiga, MS-DOS, OS/2 и т. д.). Vim Брэма Муленаара начинался как один из таких портов.
Stevie
Stevie (редактор ST для энтузиастов VI) — клон vi, разработанный для Atari ST.
Тим Томпсон (Тим не родственник Кену Томпсону - просто так совпало) написал оригинальную версию Stevie и опубликовал ее исходный код как бесплатное программное обеспечение в группе новостей comp.sys.atari.st в июне 1987 года. Позже Stevie также был портирован на UNIX, OS/2 и Amiga.
А вот пример его работы:
Один важный момент заключается в том, что редактор Stevie был написан с нуля и не использовал исходный код vi. Код vi, в свою очередь, был основан на коде ed, разработанном компанией AT&T. Теоретически это означало, что vi могли использовать только те, кто обладал лицензией AT&T. Именно по этой причине многие клоны vi предпочли использовать исходный код Stevie в качестве основы, избегая лицензионных ограничений, связанных с оригинальным vi.
Elvis
Elvis — это текстовый редактор, который был создан как клон популярного редактора vi, входящего в состав UNIX. Elvis был разработан в 1990 году Стивом Киркендаллом (Steve Kirkendall) и стал одной из самых популярных альтернатив vi в то время, когда оригинальный vi был тесно связан с коммерческими версиями UNIX.
Создатель Elvis, Стив Киркендалл, задумался о создании собственного текстового редактора после того, как Stevie неожиданно завершил работу с ошибкой. Это привело к потере нескольких часов его работы и подорвало доверие Киркендалла к редактору, что в итоге подтолкнуло его к разработке альтернативы.
Stevie хранил буфер редактирования в оперативной памяти, что Стив Киркендалл считал непрактичным для работы в операционной системе MINIX. Одной из главных причин, побудивших его создать собственный клон vi, было желание хранить буфер редактирования не в памяти, а во внешнем файле. Благодаря этому подходу даже в случае сбоя редактора отредактированный текст можно было восстановить из этого файла, что делало новый редактор гораздо более надёжным.
Забавный факт: когда Стива Киркендалла спросили, почему он выбрал название Elvis, он признался, что частично сделал это ради того, чтобы люди задавали ему этот вопрос. Кроме того, названия клонов vi традиционно включают буквы «vi», и Elvis не стал исключением.
Elvis стал пионером многих идей, которые позже были внедрены в другие клоны редакторов. Он получил признание за свою компактность, богатый набор функций и стал первым клоном vi, который предоставил подсветку синтаксиса для различных типов файлов. Это сделало Elvis одним из самых популярных редакторов своего времени.
Создатель MINIX, Эндрю Таненбаум, предложил сообществу выбрать основной текстовый редактор для их операционной системы между Stevie и Elvis. Выбор пал на Elvis, и он остаётся текстовым редактором по умолчанию в MINIX по сей день.
Vim
И вот мы наконец добрались до Vim! Этот редактор, пожалуй, самый популярный клон vi за всю историю. Со временем он эволюционировал в мощную и универсальную программу с активным и постоянно растущим сообществом. Хотя сегодня называть Vim клоном vi кажется не совсем корректным из-за его обширных возможностей, исторически именно так и было — Vim начинался как клон оригинального vi.
Вдохновленный предыдущим портом Stevie для Commodore Amiga, Брэм Муленаар начал работать над Vim для Amiga в 1988 году. Первоначально Vim был разработан для Commodore Amiga.
Первый публичный выпуск Vim (v1.14) состоялся в 1991 году.
Как вы можете видеть на изображении выше, имя «Vim» было аббревиатурой от «Vi IMitation». В 1993 году название было изменено на «Vi iMproved».
Интересный факт: первая общедоступная копия Vim для Amiga была включена в диск Фреда Фиша №591. Фред Фиш — известный программист, внёсший вклад в разработку GNU GDB, а также создатель серии бесплатных дисков для компьютеров Amiga. Серия Fish Disks выпускалась с 1986 по 1994 год, распространяясь по всему миру. Эти диски часто появлялись в компьютерных магазинах и клубах энтузиастов Amiga, делая программное обеспечение более доступным для широкого круга пользователей.
Создание Vim на основе исходного кода Stevie, а не оригинального vi, позволило распространять редактор без привязки к лицензии AT&T. Vim выпускается под собственной лицензией Vim, которая включает уникальное условие: она побуждает пользователей делать пожертвования на благотворительность, в частности, на помощь детям в Уганде. Это делает Vim не только инструментом для работы, но и проектом с социальной миссией.
Факт: Брам Муленаар, создатель Vim, был активным защитником негосударственной организации, базирующейся в Кибаале, Уганда. Он основал её для поддержки детей, чьи родители умерли от СПИДа. В 1994 году Муленаар работал волонтёром в Детском центре Кибаале, занимаясь проектированием систем водоснабжения и канализации. В течение последующих 25 лет он неоднократно возвращался в Уганду, продолжая свою работу и помогая детям.
Интерфейс Vim, как и у vi, основан на текстовых командах, вводимых через терминал, без использования меню или значков. Хотя Vim также поддерживает графический пользовательский интерфейс (GUI), позволяющий работать с меню и панелями инструментов, самым популярным и традиционным остаётся текстовый интерфейс, работающий в командной строке UNIX. Именно этот режим ассоциируется с мощью и гибкостью Vim.
Если вы решите попробовать на vim с GUI на macOS, то есть MacVim.
Но, в действительности он мало чем отличается от терминального образца.
Vim включает режим совместимости с vi, но при его отключении предлагает множество улучшений, недоступных в оригинальном vi. Среди таких улучшений: поддержка Unicode, расширенные регулярные выражения, автодополнение, подсветка синтаксиса и множество других функций, напоминающих инструменты современных IDE. Эти возможности делают Vim мощным инструментом как для программирования, так и для редактирования текста.
Vim сегодня
В отличие от большинства других клонов vi, Vim продолжает активно развиваться и поддерживаться большим сообществом пользователей и разработчиков. Новые функции регулярно разрабатываются и добавляются, что делает редактор всё более мощным и актуальным. Эта активная эволюция способствует сохранению популярности Vim среди как новичков, так и опытных пользователей.
Разумеется, возможности Vim можно значительно расширить с помощью множества сторонних плагинов. В сочетании с мощным встроенным языком сценариев VimScript редактор превращается в невероятно продуктивный инструмент для программирования и работы с текстом. Такая гибкость позволяет настроить Vim под практически любые задачи, удовлетворяя потребности самых требовательных пользователей.
Некоторые важные вехи с первых дней разработки 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 лет! В таблице ниже показаны некоторые вехи и улучшения Vim за последние 20 лет. Визуализация была создана @mpereira и включает в себя обзор истории разработки Vim, как видно из его репозитория git, созданного в 2004 году.
Текстовый редактор, созданный Брамом Муленааром, пользуется большой популярностью среди разработчиков программного обеспечения. В различных опросах он неоднократно упоминался как один из самых широко используемых текстовых редакторов или даже IDE. Более того, Vim до сих пор остаётся редактором по умолчанию во многих современных дистрибутивах Linux, подтверждая свою востребованность и универсальность.
Брам Муленаар продолжал работать над развитием Vim вплоть до нескольких недель до своей кончины в 2023 году. Современные компьютеры, в их привычном нам виде, во многом обязаны таким выдающимся людям, как Брам. Немногие инструменты с открытым исходным кодом могут сравниться с Vim по своему влиянию и легендарному статусу, который он заслуженно занимает в мире программирования.
P.S. Многие задаются извечным вопросом: «Как выйти из Vim?» Лично мне пришлось помучиться не только с этим, но и с тем, как выходить из Ed, Em, Ex, Bravo и Vi. Со мной все в порядке ;)
Спасибо за внимание!