InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Vim... Быть может он действительно - лучший?


Владимир Попов, СофтТерра


Обзор весьма мощного и очень популярного текстового редактора Vim, с примерами работы и рассуждениями о том, что же должен уметь толковый текстовый редактор.

За годы общения с вычислительной техникой мне пришлось увидеть множество средств набора и редактирования текста. Консоли "МИРа" и "Саратова", терминалы ЕС, уже вполне "зрелые" редакторы DEC-овских VMS/RSX, "радуга" редакторов под MS DOS и так далее. Менялись платформы и операционные системы, средства вывода и ввода, неизменной оставалась потребность в создании программного обеспечения, а значит - в программах, с помощью которых это ПО создается. Есть, правда, еще IDE (интегрированные среды разработки), есть visual (визуальные) средства, но нет программирования без программ-редакторов. Текстовые процессоры, а тем более издательские системы - принципиально другие продукты, для написания программ явно избыточные с одной стороны и недостаточные с другой. Именно хорошего редактора не хватает в стандартном наборе современного пользователя MS Windows, коих большинство среди сидящих за IBM PC. Можно добавить: к сожалению, но факт от этого фактом быть не перестанет.

Будет неправильно сказать, что написание текстов программ - дело только профессиональных программистов. Даже если не принимать во внимание энтузиастов, то отмахнуться от того обстоятельства, что всякий, задумавший обзавестись своей страничкой в Интернет, попадает в положение программиста - просто невозможно. Число последних неминуемо "стремится" к числу пользователей Сети, имя которым - "легион". Поэкспериментировав какое-то время с MS Word, Adobe Photoshop и FrontPage, большинство таких программистов-"неофитов" приходит к выводу, что лучший инструмент написания html-кода - notepad. Вам не приходилось слышать такое утверждение? Оно не беспочвенно: notepad едва ли не единственный именно редактор среди наиболее распространенных программ для MS Windows. "Именно редактор" означает в данном случае инструмент для эффективного ввода и модификации текста, не отягощенный средствами создания лучшего дизайна, расширенными возможностями печати и тому подобное. Но если такую популярность получил notepad - редактор, уступающий по своим возможностям даже вспомогательным встроенным редакторам интегрированных сред разработки вроде Borland-овских Turbo и оболочек вроде Far, то, может, имеет смысл обратить внимание на редакторы, используемые профессиональными программистами?

В мире UNIX самым заметным в этом классе, безусловно, является vi (VIsual editor) и его современный "потомок" - vim (Vi IMprooved - улучшенный). Он чаще других вызывается по умолчанию, его интерфейс чаще упоминается рядом с определениями "совместимый" и "подобный" и так далее. Но, быть может, это - дань традиции? В большой степени - да. Утверждение о том, что этот редактор - лучший, нуждается в доказательстве. Некоторые доводы в пользу этого и приводятся ниже.

Прежде всего, условием необходимым, хотя и не достаточным, является функциональная полнота редактора: он должен уметь все, что только может потребоваться при работе с текстом. Термин "все" конкретизировать невозможно, но достаточно будет сказать, что vim имеет ограниченное только здравым смыслом количество буферов (фактически - открытых файлов) и окон (в данном случае название "окно" очень точно отражает суть происходящего: есть файл, а есть окно, через которое мы содержимое этого файла рассматриваем). Окно может занимать всю площадь экрана, а может - часть, причем любую, то есть экран может делиться как по горизонтали, так и по вертикали. Переключения - произвольны. Сказанное справедливо как для графического, так и для консольного режимов. Кроме стандартной для "взрослых" редакторов возможности создания макрокоманд (фиксированных последовательностей элементарных команд редактора), есть развитый язык программирования. Редактор имеет 5 режимов (modes):

  • "Вставки/замены": обычное экранное редактирование, когда нажатие цифробуквенных клавиш вызывает ввод соответствующих символов в редактируемый текст, клавиши позиционирования перемещают указатель, а функциональные клавиши выполняют назначенные (вами или - по умолчанию) действия;
  • "Нормальный": текст не модифицируется, клавиши позиционирования перемещают указатель, все остальные клавиши (или их последовательности) выполняют назначенные действия, опять-таки - вами или по умолчанию;
  • "Визуальный": режим выделения области с помощью мыши, клавиш перемещения курсора или специальных "меток"
  • "Операторный": вводимые символы детализируют введенный непосредственно перед этим оператор. Благодаря вводу в этом режиме оператор удаления, например, удалит N символов, слов, строк или область выделенную в визуальном режиме;
  • "Командный": для ввода команд, а точнее тех из них, которые вы или авторы не сочли нужным связать с функциональными или обычными клавишами и их последовательностями;

По умолчанию <Esc> (иногда - два нажатия) возвращает в "нормальный" режим, <Ins> - переводит в режим "вставки", а из него - в режим "замены". Двоеточие в "нормальном" режиме даст перевод в "командный" режим. Символы операторов из, опять-таки, "нормального" режима переводят в "операторный". Символы <v> и <V> - в "визуальный". Поскольку действия редактора по нажатию любой из клавиш в любом режиме программируются, то, как вы, вероятно, уже догадались, у увлекшегося настройкой vim пользователя, этот редактор вполне может стать воистину неузнаваемым.

Здесь мы подходим ко второй сильной стороне vim - исключительной модифицируемости. Нужно ли это? Берусь утверждать: да. Меняются клавиатуры, хотя их типов, впрочем, и в каждый конкретный период - предостаточно, если говорить не только об IBM PC. Меняются устройства ввода, задачи, наконец. У vim как у достойного члена семейства наиболее типичных UNIX-приложений настройки хранятся в конфигурационном файле, каких, в свою очередь, может быть множество. По одному на тип решаемых задач, например. И название и местоположение конфигурационного файла традиционно для UNIX: .vimrc в "домашнем" каталоге пользователя. Пример (vimrc_example.vim) - в каталоге самого vim (для Linux обычно -/usr/share/vim/vimNN/, где NN - номер версии. Одним словом, если вы "создаете" свой редактор практически сами, то такое решение претендует на звание "решение навсегда": не в смысле неизменности, разумеется, а в смысле постоянной готовности соответствовать вашим новым требованиям.

Впервые познакомившемуся с возможностями конфигурации vim, трудно устоять перед соблазном "подогнать" его под "милый сердцу" прототип: для кого-то - MultiEdit, для кого-то - nedit, а для кого-то - и notepad. Это не сложно. Однако не стоит торопиться: vim имеет возможности, которых, вполне возможно, не было у "прототипа", а познакомившись с ними однажды, вы, быть может, уже не захотите от них отказываться. Перечислить все эти возможности вряд ли удастся уже хотя бы потому, что как всякая открытая система, vim развивается усилиями многих людей и быть в курсе всех разработок просто не реально. Попытаюсь перечислить наиболее известные возможности. Подразумеваются настройки "по умолчанию", ввод в "нормальном" режиме, кроме тех случаев, когда оговаривается иное. Двоеточие говорит о переходе в командный режим.

Разумеется, можно как угодно позиционироваться в файле:

  • [n]G - переход на строку n, 0G - BOF, $G - EOF
  • ) | ( - следующее | предыдущее предложения
  • } | { - то же для параграфа
  • ]] | [[ - то же для секции, функции
  • % - ответная скобка (matching)
  • `` - предыдущее местонахождение, с точностью до символа
  • '' - то же, с точностью до строки
  • более того, в последних версиях vim все перемещения по файлу в пределах сессии протоколируются, а <Ctrl-O>/<Ctrl-I> позволяют перемещаться по зафиксированным в этом протоколе позициям.

Весьма удобным является механизм меток, к которым всегда можно вернуться:

  • mx - пометить текущую позицию буквой "x" (буква, разумеется, любая)
  • `x - перейти к метке "x"
  • 'x - перейти к строке с меткой "x"

Еще одна возможность, довольно редко встречающаяся у редакторов, - множество именованных буферов. В последних версиях MS Windows это называется многостраничным clipboard-ом. Буферы, как и метки, метятся одной буквой:

  • "x - именованный буфер с меткой "x". С таким буфером возможны все стандартные операции:
    y - копировать (yank)
    d - вырезать (cut)
    p - вставить (paste). Причем вставлять можно как перед ( <[p> ), так и после ( <]p> ) позиции под курсором. Если эта позиция - начало или конец строки, то разница довольно существенна.
  • буфер, именованный как "* совпадает с clipboard X-Window.

Разумеется, есть множество средств поиска/замены:

  • /text - искать "text" ниже
  • ?text - то же, но выше, то есть в предшествующей курсору части текста
  • n - повторить поиск в том же направлении
  • N - то же, но в обратном направлении
  • * - найти слово такое же, как под курсором ниже по файлу
  • # - то же, но выше по файлу
  • :[address]s/text/replacement/[gci] - в адресном пространстве address заменить "text" на "replacement".
    Опции: { global-confirm-insensitive case },
    что означает: { все-с запросом подтверждения-игнорируя регистр }
  • :g/text/replacement/g - то же для всех совпадений в буфере.
    Для тех, кто знает, что такое регулярные выражения, отметим, что они в операторах поиска/замены - работают.
    Не нужно пугаться "многословного" синтаксиса: вспомните о программируемых клавишах и вы поймете, что достаточно ввести нужную фразу в .vimrc лишь однажды.

Разумеется, есть полный список файловых операций. Перечислять все вряд ли имеет смысл: в них нет ничего "экзотического". Интереснее упомянуть "автозаполнение": набрав пару-тройку первых символов и не выходя из режима "вставки", нажмите <Ctrl-n> (или <Ctrl-p>): vim начнет предлагать варианты продолжения слова из имеющихся в вашем файле. Для пишущих на С добавлю: и в include-файлах тоже. Меня, в свое время, эта возможность примирила с длинными, информативными метками и именами переменных: я перестал в них ошибаться. Еще один сюрприз: <[i> покажет в командной строке определение переменной, находящейся под курсором, а <[d> - определение макро, если символы под курсором являются переменной или макрокомандой, разумеется. И еще "фокус" - справка по поводу кода символа под курсором, причем сразу во всех системах исчисления кроме двоичной, разве что. Последовательное нажатие <ga> даст практически полную информацию по поводу символа под курсором.

Разумеется, можно отказаться от сделанных изменений (undo), введя просто <u>, а можно восстановить сразу всю редактируемую строку: <U>. Иногда бывает нужно отказаться от отмены изменений (undo the undo's). Можно и это: <Ctrl-R>

Можно изменить регистр символа под курсором нажатием <~>. И, напоследок, часто весьма облегчающая жизнь точка <.> - повторить последнюю операцию.

Теперь понятно, почему не достаточно одного режима: все разнообразие функций трудно покрыть только функциональными клавишами, а использование клавиш обычных требует отказа на какое-то время от режима экранного редактирования. Среди множества установок, задаваемых командами ":set ..." есть и задающая режим вставки как действующий по умолчанию, что делает vim похожим на большинство экранных редакторов. Попробуйте. И, скорее всего, вы убедитесь, что заданный по умолчанию разработчиками "нормальный" режим с точки зрения затрат времени экономичнее.

Похожая ситуация с предложенными разработчиками для использования по умолчанию клавишами. Для не знакомых с UNIX назначение клавиш для поиска, копирования, вставки кажется непривычным. Однако, если вместе с vim вы будете осваивать, например, Linux, то очень скоро обнаружите, что те же клавиши "работают" и при просмотре man-страниц, и в популярной screen, и даже для стандартного интерпретатора командной строки bash, оказывается, существует vi-подобный режим. Одним словом, в UNIX-среде освоение vim либо проходит легче, если вы не совсем "чайник", либо "пригодится" при дальнейшем знакомстве с системой.

Разумеется, vim имеет подсветку синтаксиса, причем для десятков языков программирования и конфигурационных файлов. Для версии 5.6 подкаталог syntax содержит 189 файлов общим объемом более мегабайта, что, в свою очередь, составляет почти пятую часть объема дистрибутива.

Разумеется, vim прекрасно документирован: без малого 2 мегабайта файлов в текстовом формате, снабженных системой перекрестных ссылок и поиска. Плюс небольшой скрипт, превращающий эти текстовые файлы в универсальные html.

Разумеется, vim портирован практически на все платформы. Включая все известные ОС от MicroSoft, не в упрек будь сказано софтверному гиганту.

И это еще не все. Полтора десятка утилит, разработанных специально для vim, дополняют и без того немалый список возможностей. Среди них средства для создания перекрестных ссылок с файлами других форматов, "рисование" псевдографикой, таблицы, дополняющие форматеры, конвертеры и тому подобное.

Ну, и, разумеется, vim бесплатен. Если быть точным, то за него не обязательно платить. Плата же, если таковая случится, переводится в фонд помощи детям Уганды. Не единичный в мире Open Source, но, тем не менее, весьма благородный жест разработчиков.

Нужно признать, что vim сложен или, по крайней мере, непривычен для пользователей не-UNIX систем. Именно им пригодились бы все возможности конфигурирования, но их изучение кажется в начале пути таким "изнурительным"... Не стоит отчаиваться. Кроме документации в составе дистрибутива vim, стоит познакомиться с сайтом www.vim.org. Там можно обнаружить ссылки на сайты энтузиастов vim, предлагающих свои конфигурационные файлы для разных операционных сред. Очень интересен сайт vim.online, где все желающие делятся своим опытом работы с vim. На август 2001-го на сайте - более 100 советов, среди которых нет бесполезных, а тем более неверных.

В заключение нужно сказать о недостатках. Не без этого.

Внутренняя сложность vim может сделать его довольно медлительным на "слабых" машинах. Заметное время уходит на поиск, медленно может перемещаться маркер в "визуальном" режиме. Заметить это можно, повторюсь, только на машинах типа Pentium-166, например, но - можно.

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

А попробовать, все-таки - стоит. Особенно работающим в разных операционных средах. Если вам действительно нужен редактор, попробуйте и вы, почти наверняка, не пожалеете.


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua