Редактору vi -- программе и человеку
Андрей Зубинский

Компьютерное Обозрение #14, 12 - 18 апреля 2000
URL: http://itc.ua/1663

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


Слабонервным
следует удалиться...


Когда эта статья задумывалась, автор буквально попал в тупик -- ну что можно написать о программке размером всего неполных 260 KB. Даже и стыдно как-то говорить о такой чепухе, когда все, что меньше 10 MB, уже и за программу не считается. Но, как говорится, охота пуще неволи -- и вот, слушайте неправильную сказку о самых неправильных текстовом редакторе и его авторе-хакере. Неправильной сказка будет потому, что она страшно начинается...

Итак, vi. Верьте или не верьте, но это самый ужасный из всех кошмарных пользовательских интерфейсов, в котором совершенно обыденны команды типа "abbr dater^M^[:.!date+\%D^MkJA". Истинная история редактора vi (с трудом найденная в Usenet) утверждает, что его название представляет собой аббревиатуру имени и фамилии разработчика -- известного в узких кругах Vincent Idioth (Винсента Идиоса). Великий и ужасный Винс разработывал vi для очень специфичного круга пользователей -- для... считывателей перфокарт, ведь во времена "больших" ЭВМ настоящими пользователями компьютеров были именно они. Все эти суетящиеся люди, подносившие Самым Главным Устройствам колоды перфокарт, только думали, что Компьютер их замечает. На самом деле они были всего лишь носильщиками с невысокой надежностью, а их досадные ошибки раздражали Самые Главные Устройства... Винс первым понял это и создал по-настоящему дружественную программу для Старших Считывателей Перфокарт. Успех был ошеломляющим, и один из восхищенных Компьютеров сообщил своей знакомой IBM370, возглавляющей тогда еще не очень большую компанию Intel, о талантливом разработчике. Винса пригласили в Команду, и весь свой талант он приложил к разработке архитектуры микропроцессора 8086 -- настолько замечательной, что перенесшая несколько косметических операций IBM360, самая старая и уважаемая в компании IBM, безоговорочно приняла 8086 в качестве основного CPU для будущих персональных компьютеров. После двух особенно ярких успехов Винса на процессорном поприще (естественно, это 80286 и Pentium 60 MHz) уже все Компьютеры знали о Винсенте Идиосе, и его гений наконец-то востребовала Большая Политика (старик Cray X-MP, установленный в Самом Главном Месте, всегда уважал Винса и внимательно следил за его успехами). Дальнейшая судьба Идиоса, конечно же, стала Большой Тайной, но доподлинно известно, что Винсент добился впечатляющих успехов на посту главного PR президента Б. Клинтона...

Правда, некоторые ошибочно полагают, что vi на самом деле означает римскую цифру "шесть", а настоящим автором этой программы являлся знаменитый Демьен Торн, которому посвящен не менее знаменитый роман "Знамение". Однако в некоторых преданиях компьютеров дальнего Севера, например, утверждается, что роман был написан забытой полярниками на дрейфующей льдине PDP-11 с помощью самого редактора vi, так что вопрос первичности дьявола и vi до сих пор остается открытым.

Большой научный интерес представляет эпос Компьютеров-акынов, ведущих кочевой образ жизни. В нем присутствует несколько преломленный образ Винсента Идиоса, витиевато переплетающийся с мотивами индуизма, буддизма и Ислама. В частности, многие ученые, ежедневно работающие с vi, считают достоверными легенды о "Шестируком Винсе" -- по их мнению, именно такое количество рук и обязательная четырехпалость являются однозначно оптимальной комбинацией для нормального пользователя vi.


Самые веселые
в Silicon Valley


Сказки сказками, а компанию, одним из основателей которой по сей день является настоящий автор vi, заслуженно считают в Силиконовой Долине самой забавной. Особенно в Апрельский День Дурака (April Full's Day). Существует даже небольшой исторический материал, позволяющий уверенно утверждать, что богатые не только плачут. В 1985 г. в этой компании 1 апреля взяли, да и потихонечку вывезли... офис своего чуть ли не самого главного начальника. Пришел он на работу -- а работы-то и нет... В следующем, 1986 г., опять же в злополучном офисе "самого", 1 апреля возник из ниоткуда Фольксваген Жук. Ровно через год отметили автора vi, установив его Феррари на пьедестал перед основным административным зданием компании. В 1988 г. разгул достиг апогея (по советским меркам, конечно же) -- кабинет флагмана Компании был превращен в площадку для гольфа. 1 апреля 1989 г. смеялось до упаду все прогрессивное программистское человечество -- Компания объявила борьбу с ошибками в ПО (ошибка по-английски -- bug), для чего... упаковала свой административный корпус в целлофан, провела дезинсекцию и украсила получившееся в результате огромным транспарантом "NO BUGS". В последующие годы Компания запускала в аквариумы свои компьютеры и работала на них в водолазных костюмах, и веселилась, веселилась, веселилась...

И, надо сказать, что поводы для веселья у Компании находились всегда. Хотя бы потому, что "в миру" она известна под названием Sun, а в числе основателей ее значится один из самых ярких хакеров, очень много сделавший для "освобождения" и развития ОС Unix, -- Вильям Джой (William Joy). Да и забавной Sun считают не случайно -- несмотря на все заверения аналитиков и всю статистику рынка дела у Sun идут неплохо, а в своем (корпоративном) секторе ее позицию и авторитет можно считать незыблемыми.


Другой Билл

В программной индустрии "другой Билл" -- это титул. За ним кроются годы работы, заслуженное уважение в кругах профессионалов и, наконец, недюжинные способности в областях, весьма далеких от компьютинга. Хотя Биллу Джою не занимать способностей в своей профессиональной области -- ему мы обязаны существованием и всех версий Берклиевской ветки ОС Unix, и редактора vi, и сетевой файловой системы NFS, и архитектуры микропроцессоров семейства SPARC. К сожалению (с точки зрения журналиста, конечно же), Билл Джой -- очень скромный человек, и найти обширную информацию о нем трудно. Хотя принадлежащие его перу известные труды, в частности самое "свежее" эссе "Почему будущее не нуждается в нас" ("Why the future doesn t need us"), позволяют достаточно точно представить себе облик настоящего хакера и просто веселого человека, "совсем другого Билла".

В 1975 г. один из авторов ОС Unix, Кен Томпсон, привез в свою альма матер -- Университет Калифорнии в Беркли, новейшую по тем временам версию Unix. Два талантливых студента, Чак Хэйли и Билл Джой, буквально влюбились в новую ОС и приступили к разработке компилятора с языка Pascal. Как и положено в Unix, для начала понадобилось сделать ОС "под себя", и Джой начинает искать подходящие технологические средства. В 1976 г. состоялась, возможно, определяющая всю дальнейшую историю встреча Джоя и британского программиста из Лондонского колледжа Королевы Марии (Queen Mary) Джорджа Колоуриса (George Coulouris), который привез в Беркли свой редактор em. По воспоминаниям Колоуриса, "...однажды за соседним терминалом оказался этот блестящий хакер -- студент Билл Джой, который сообщил мне, что пишет компилятор с Pascal. Я показал ему em, и он сказал: "симпатично, отделу технической поддержки наверняка понравится...". Впоследствии оказалось, что em, созданный с учетом условий маленького ВЦ колледжа, совершенно непригоден в огромной системе Беркли... Примерно через неделю я увидел Джоя за модификацией исходных текстов em... Затем на основе em Джой создал редакторы ex и vi...".

К началу 1978 г. Джой закончил и компилятор с Pascal, очень быстро получивший распространение, а для нового, растущего круга пользователей, понадобилась полнофункциональная версия инструментальной ОС. В марте 1978 г. Джой создает дистрибутивную магнитную ленту под названием "Unix Pascal System" (в описании указаны авторы -- Б. Джой, С. Грэхем, К. Томпсон). Первый BSD-релиз буквально взорвал университетский мир -- предельно простая и либеральная лицензия, текст которой занимал всего одну машинописную страничку, и стоимость полного дистрибутива $50 привели к тому, что Unix стала самой доступной ОС в мире.

К середине 1978 г. Джой усовершенствовал систему, предопределив еще большую ее популярность, -- работа над vi требовала поддержки самых разных алфавитно-цифровых терминалов (АЦТ), и "другой Билл" создает неотъемлемый элемент любой современной ОС Unix -- интерпретатор специального языка, позволяющий прикладным программистам "навсегда забыть" о различиях всевозможных АЦТ. Знаменитая подсистема termcap жива и здравствует по сей день в любой версии ОС Unix.

Начиная с этого момента, Джой создает "вторую редакцию BSD", которая чуть ли не мгновенно расходится тиражом более 70 экземпляров (не следует думать, что это мало -- в те времена на одной Unix-машине вполне могли работать несколько сотен пользователей). Джой самостоятельно берет на себя практически всю ответственность за "детище": он дает консультации по телефону, вносит изменения в дистрибутив в соответствии с отзывами пользователей и продолжает совершенствование ОС. Все это отнимает кучу времени, и когда в 1982 г. он получает предложение от группы энтузиастов, собирающейся создать компанию, специализирующуюся в проектировании рабочих станций для ОС Unix, Джой с радостью соглашается... Восход "солнца" начинается.


А что же vi?

Первый из них -- Путь, но им
редко пользовались для столь
ничтожной цели.

Р. Желязны. Хроники Амбера

Что же такого магического в этом редакторе двадцатилетней давности? Почему в любой конференции, посвященной любой версии ОС Unix, от вас обязательно потребуют знание этого редактора? Почему свирепый модератор конференции беспощадно прервет флейм по поводу недостатков vi? И наконец, почему никто из профессионалов не сможет кратко и быстро ответить на первый из этого короткого перечня вопрос "почему"?

Давайте попробуем разобраться по порядку. Для начала уясним, как выглядит (с точки зрения пользователя) vi. Даже такая простая попытка знакомства уже вызывает трудности -- vi выглядит... никак. Хотя, для преодоления испуга, можно попробовать привести пример более "дружелюбных" и удобных модификаций vi, оснащенных GUI (одна из удачных разработок vi-последователей, Elvis, доступна чуть ли не для всех ОС).

Второй вопрос, с ответом на который следует определиться раз и навсегда, трудно даже сформулировать. Скажем так: чем отличается работа по редактированию текста в vi (и отличается ли вообще) от аналогичных действий в более привычных, пользовательско-ориентированных редакторах? И здесь уместна (даже целесообразна) вполне допустимая аналогия со... стилем поведения хорошо знакомых экранных персонажей. Действия пользователя обычного ("дружелюбного") GUI-ориентированного текстового редактора напоминают... поведение персонажей Сталлоне -- вот он целится курсором мыши, нажимает на курок (извините, на кнопку), производит "выстрел". В vi все не так -- здесь пользователь, скорее, Коломбо, и даже если у него есть "пистолет" (курсор мыши), применить его, вероятно, не придется (короче говоря, забудьте его дома -- руки болеть не будут, это без шуток: туннельный синдром и vi -- понятия несовместимые).

Как бы продолжая отвечать на второй вопрос, хочется отметить самую важную особенность vi, подтверждающую точность аналогии "пользователь-Коломбо": vi -- командный редактор, требующий развитого алгоритмического мышления. Собственно говоря, основная прелесть vi как раз и заключается в этом "алгоритмизме", становящимся явным по мере освоения редактора. Пользователь vi не просто вынужден думать, он вынужден думать как программист (естественно, допустим и примитивный подход, но... то, что годится для Коломбо, Рэмбо подходит с трудом). Далее это утверждение будет понятно.

И наконец, последнее. vi -- важнейший интеграционный механизм ОС Unix, позволяющий достаточно "прозрачно" и эффективно создавать новые сущности при необходимости (и упорно мешающий желающим делать это просто так, нарушая основной закон Оккама). В этом утверждении кроются два важных следствия. Во-первых, несмотря на наличие нескольких очень мощных реализаций vi-совместимых современных редакторов, например для ОС Windows, одного только vi слишком мало, для полноценной работы желающим "юниксфицировать" Windows понадобится какая-либо программная "прослойка" -- имитатор Unix. Во-вторых, здесь кроется ответ на некоторые возмущенные письма читателей, содержащие следующие ключевые фразы: "...я программист...поставил Unix такой-то...в нем даже нет интегрированной среды разработки...удалил и вернулся к Borland C++ Builder...". Простонародным языком это переводится как "а слона-то я и не приметил...". Unix и есть интегрированная среда разработки, в которой vi играет далеко не последнюю роль.

Ну а теперь подробнее... Алгоритмичность vi становится понятна после знакомства с форматом командных языков (да, у этого малыша есть мощные командные языки). Для визуального режима редактирования его можно представить в следующем виде:

повторитель команда ограничитель-указатель

Повторитель -- это число, указывающее, сколько раз должна быть выполнена команда. Например, передвижение курсора на начало третьего после текущего слова можно осуществить "по-Рэмбовски" -- удержанием стрелки клавиатуры и "выцеливанием" момента совпадения курсора и начала слова, а можно "по-Коломбовски": "3 W". Если в этом случае достоинства Коломбо неочевидны, то при необходимости отредактировать текст программы с шестого слова, начинающегося со строки ClassDef, Рэмбо проигрывает очевидно -- ему предстоит продолжительное "путешествие стрелками", Коломбо же ограничится "6/ClassDef".

Перечень команд vi достаточно обширен и включает в себя всевозможные перемещения курсора (побуквенно, пословно, построчно, по предложениям, по абзацам, с поиском подстроки, в начало/конец строки, в первый отображаемый символ строки и т. д.), команды изменения текста, копирования/вставки и пр. Запоминаются они достаточно просто, единственный способ их выучить -- пользоваться vi, а к числу полезных правил относится "регистровая инверсия" (если команда "z" выполняет определенное действие, то команда "Z" -- как правило, обратное действие). Например, если команда "x" удаляет символ "после" курсора (на экране -- под курсором), то "X" -- перед курсором.

Ограничитель-указатель (ОУ) используют многие команды vi (в тех из них, что допускают одновременно наличие и повторителя, и ограничителя-указателя, последний является частью или параметром команды). Смысловое значение -- специфицирование объекта, над которым будет выполнена команда. В его роли обычно выступает... одна из команд перемещения курсора.

Среди всех команд vi особо выделяется одна -- "!", позволяющая передать указанный следующим за ней ОУ фрагмент текста на вход любой программы X Unix и заменяющая этот фрагмент результатом выполнения "X". С помощью "!" можно по-настоящему "тесно" интегрировать vi с остальными утилитами ОС -- в заботливых руках vi умеет, например, проводить проверку правописания "на лету" (с использованием внешней независимой программы-spellchecker), очень красиво форматировать обычный текст (достаточно использовать внешний форматизатор), искать и подставлять синонимы из лингвистической сети WordNet, заменять сложные математические выражения на каком-либо интерпретируемом языке на результат их вычисления и так до бесконечности...

Отдельный и очень выразительный командный язык подсистемы vi -- строкового редактора ex, позволяет с легкостью делать вещи, вообще немыслимые для всяких там "дружелюбных штучек". Аббревиатуры (":abbr имя расширение") дают возможность динамически (или статически) вводить сокращения для часто используемых фрагментов текста, например, определив ":abbr zz Университет Калифорнии в Беркли", в дальнейшем достаточно набрать в тексте слово zz, чтобы получить фразу "Университет Калифорнии в Беркли". Аббревиатуры можно "забывать", если они начинают мешать. Ну а для настоящих профессионалов vi/ex предоставляет просто фантастические средства -- команды ":map" и ":map!", 36 буферов для копирования/удаления фрагментов текста, 26 "закладок"...


Почему мы любим vi?

Экран 1
Два варианта исполнения vi классический терминальный и более современный (Elvis), с возможностями рендеринга html-страниц
Скорее всего, потому, что vi заставляет думать -- а это, как известно, процесс хоть и утомительный, но весьма полезный: в ходе такой "примитивной" работы, как редактирование текста, vi иногда "подсказывает" удивительные по красоте, лаконичности и полезности решения, составляющие, по большому счету, основы мастерства под названием "программирование". И еще потому, что "ухоженный" vi позволяет смело "вывешивать" на экране кнопочку с надписью "Мой компьютер" -- этот компьютер действительно мой, потому что я "сделал его" для себя, под свои задачи, интересы, способности. Ну и, наконец, потому что мы любим ярких, талантливых и удачливых людей, таких, как Билл Джой -- автор культового редактора.



© Издательский Дом ITC. 1993-2002.

Все содержание, включая идеи оформления и стиль, являются объектом авторского права. Копирование и размещение материалов на других сайтах без письменного разрешения ООО "Издательский Дом ТС" не допускается.