|
Редактору vi -- программе и человеку Андрей Зубинский |
||||
| Компьютерное Обозрение #14, 12 - 18 апреля 2000
URL: http://itc.ua/1663 |
||||
Первоапрельское настроение, весенний авитаминоз и, наконец, бурный поток информации о программах-однодневках, ориентированных на потребительский рынок, -- вот неполный перечень причин, побудивших взяться за написание этой статьи. Ну а если серьезно, -- предмет нашей беседы представляет собой одно из самых ярких явлений технологической культуры, на протяжении двадцати лет существования которого неоднократно предпринимались попытки "примерить лавровый венок" текстового редактора всех времен и народов. Но... ни одна из существующих на сегодняшний день замечательных, удобных, красивых и каких угодно еще программ для редактирования текста не стала культовой. Тяжеловесные мастодонты, включающие в себя "почти все" возможности и использующие операционную систему "в качестве драйвера", могут быть массовыми, эффективными для решения ряда задач, им посвящаются пудовые книги в "конфетных" суперобложках. Многочисленные легковесные редакторы, соревнующиеся между собой в удобствах и минимализме, также завоевывают симпатии большого числа пользователей. Однако сообщество пользователей "остальных" (не-vi) текстовых редакторов обладает одним примечательным свойством -- здесь принято менять симпатии с невиданной легкостью, "...как перчатки". И только попавшие в "цепкие лапы vi" превращаются в настоящих ортодоксов: "нет редактора, кроме vi, и Билл Джой -- пророк его".
К середине 1978 г. Джой усовершенствовал систему, предопределив еще большую ее популярность, -- работа над vi требовала поддержки самых разных алфавитно-цифровых терминалов (АЦТ), и "другой Билл" создает неотъемлемый элемент любой современной ОС Unix -- интерпретатор специального языка, позволяющий прикладным программистам "навсегда забыть" о различиях всевозможных АЦТ. Знаменитая подсистема termcap жива и здравствует по сей день в любой версии ОС Unix. Начиная с этого момента, Джой создает "вторую редакцию BSD", которая чуть ли не мгновенно расходится тиражом более 70 экземпляров (не следует думать, что это мало -- в те времена на одной Unix-машине вполне могли работать несколько сотен пользователей). Джой самостоятельно берет на себя практически всю ответственность за "детище": он дает консультации по телефону, вносит изменения в дистрибутив в соответствии с отзывами пользователей и продолжает совершенствование ОС. Все это отнимает кучу времени, и когда в 1982 г. он получает предложение от группы энтузиастов, собирающейся создать компанию, специализирующуюся в проектировании рабочих станций для ОС 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?
|
| © Издательский Дом ITC. 1993-2002. Все содержание, включая идеи оформления и стиль, являются объектом авторского права. Копирование и размещение материалов на других сайтах без письменного разрешения ООО "Издательский Дом ╡ТС" не допускается. |
