Будет неправильно сказать, что написание текстов программ - дело только профессиональных программистов. Даже если не принимать во внимание энтузиастов, то отмахнуться от того обстоятельства, что всякий, задумавший обзавестись своей страничкой в Интернет, попадает в положение программиста - просто невозможно. Число последних неминуемо "стремится" к числу пользователей Сети, имя которым - "легион". Поэкспериментировав какое-то время с 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 символов, слов, строк или область выделенную в визуальном режиме;
- "Командный": для ввода команд, а точнее тех из них, которые вы или авторы не сочли нужным связать с функциональными или обычными клавишами и их последовательностями;
По умолчанию
Здесь мы подходим ко второй сильной стороне 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 все перемещения по файлу в пределах сессии протоколируются, а
/ позволяют перемещаться по зафиксированным в этом протоколе позициям.
Весьма удобным является механизм меток, к которым всегда можно вернуться:
- 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 лишь однажды.
Разумеется, есть полный список файловых операций. Перечислять все вряд ли имеет смысл: в них нет ничего "экзотического". Интереснее упомянуть "автозаполнение": набрав пару-тройку первых символов и не выходя из режима "вставки", нажмите
Разумеется, можно отказаться от сделанных изменений (undo), введя просто , а можно восстановить сразу всю редактируемую строку: . Иногда бывает нужно отказаться от отмены изменений (undo the undo's). Можно и это:
Можно изменить регистр символа под курсором нажатием <~>. И, напоследок, часто весьма облегчающая жизнь точка <.> - повторить последнюю операцию.
Теперь понятно, почему не достаточно одного режима: все разнообразие функций трудно покрыть только функциональными клавишами, а использование клавиш обычных требует отказа на какое-то время от режима экранного редактирования. Среди множества установок, задаваемых командами ":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"-раскладка. При работе с текстами программ это, как правило, не важно, а вот если обрабатываемый текст - исключительно кириллица, то переключение раскладки каждый раз, когда потребуется команда, вызываемая алфавитными клавишами из "нормального" режима, - раздражает. Быть может, стоит для работы с подобными текстами иметь свой конфигурационный файл с "акцентом" на использование функциональных клавиш, не зависящих от раскладки клавиатуры.
А попробовать, все-таки - стоит. Особенно работающим в разных операционных средах. Если вам действительно нужен редактор, попробуйте и вы, почти наверняка, не пожалеете.
Парадоксально, но, признав некоторую сложность vim, сейчас я попытаюсь обосновать утверждение о его исключительной простоте. Парадокса, собственно, никакого и нет: все зависит от того, с чьей позиции смотреть. Для пользователя, только что загрузившего дистрибутив vim, он действительно сложен. Достаточно сказать, что в файле index.txt свыше 1200 строк, а ведь этот файл - всего лишь перечень доступных команд с краткими описаниями в одно, максимум два предложения. 1000, пусть 500 команд не способствуют желанию познакомиться с редактором. Не будем торопиться. Во-первых, команды довольно часто дублируются. Во-вторых, часть из них унаследована от vi и предполагает возможность ввода на любом алфавитно-цифровом терминале. Современному пользователю более естественным покажется использование функциональных клавиш и клавиш позиционирования курсора, мыши, наконец. Все эти возможности vim, разумеется, поддерживает, но и старые варианты набора команд не отменяются. Список сокращается: предположим, до 150 команд. Не так уж и много для редактора, который может "все" (уточнять и в этот раз не будем), но есть ли основания говорить об "исключительной простоте"? Как это ни странно, есть. И основания эти следующие:
- логика интерфейса, заложенная авторами, позволяет свести все многообразие команд к сочетаниям значительно меньшего числа их "составляющих";
- исключительная модифицируемость vim дает возможность создавать "проблемно-ориентированные", при желании - очень простые конфигурации;
- гибкая система помощи, которую, кстати, можно дополнять самостоятельно и на любом языке;
- если же потребуется конфигурация, воспользоваться которой можно сразу, не обременяя себя знакомством с документацией, то можно воспользоваться возможностью создания меню, которая у vim тоже есть.
Таким образом сконфигурированный, документированный и дополненный системой меню vim становится "образцом дружественности" к пользователю. Вас что-то не устраивает? Cделайте так, как считаете более удобным! Для этого не нужно обладать какими-то специальными знаниями, но что-то ДЕЛАТЬ - действительно нужно. Здесь придется еще раз признать (и напомнить), что vim написан программистами и для программистов. Но поскольку ряды последних все ширятся, то и круг пользователей также должен расширяться. Если это не так, то, возможно, и потому, что вышеупомянутые более чем 1000 строк одного перечисления команд кого-то "оттолкнули" при знакомстве. Именно на этого кого-то и ориентирован данный материал.
Для начала стоит объяснить, зачем все-таки нужно такое количество команд, если большинство редакторов вполне обходится системой меню. Для примера предлагаю взять части текста, выделяемые для выполнения над ними какой-то операции и называемые, как правило, текстовыми объектами. Можно выделять их мышью, как это и делается во многих редакторах: решение универсальное, но крайне не эргономичное - попробуйте выделить абзацев 5-6. В общем случае текстовым объектом может быть символ, слово, предложение, абзац, текст в целом плюс блоки, которые, в свою очередь, могут быть ограничены угловыми, квадратными, фигурными или круглыми скобками (мы ведь говорим о тексте программы). Курсор (или указатель мыши) в момент выбора также может находиться в начале, конце или внутри текстового объекта. Можно, конечно, "метить" начало и конец текстового объекта - но это бывает так утомительно... Согласитесь, также, что меню, отражающие все эти возможности, выглядело бы весьма громоздким. А вот как это сделано в vim: если курсор в начале объекта, то первая буква команды выделения - (add), а если внутри, то (inner). Теперь осталось указать, что является объектом. Вторая буква - ,
или . Нетрудно догадаться об их происхождении : word, sentence, paragraph, block. Не ошибетесь, если предположите, что любая из возможных скобок в качестве второго символа команды, означает, что объект - это блок, ограниченный этим типом скобок. Изящно. И просто. А между тем, это без малого три десятка команд в визуальном режиме.
Логика интерфейса такова, что если вы обнаружили какую-то возможность в одном из режимов, то почти наверняка найдете аналогичную в другом. Упомянутые в первой статье
, как и прежде, будут означать следующий и предыдущий варианты автозаполнения.
"Универсальными" могут быть не только последние символы команд, как в предыдущих примерах, но и первые. Прежде всего, это уже упоминавшиеся - разделить (split),
- копирование, удаление, вставка (yank, delete, paste). Аналогично,
Некоторые символы сохраняют свое назначение и в командном режиме: - фильтр, <@x> - выполнить содержимое регистра 'x', '<' и '>' - уменьшить и, соответственно, увеличить "отступ" строк. Вообще, командный режим стоит несколько "особняком", поскольку является практически самодостаточным: в нем доступны практически все действия, инициируемые командами остальных режимов, разве что объем ввода будет больше. Зато текст команд достаточно "прозрачен". Например:
:buffer N - перейти к буферу N;
:Print - распечатать;
:set - показать или установить опции.
А количество вводимых символов уменьшается благодаря допустимым сокращениям и уже неоднократно упоминавшемуся автозаполнению. Перечислять эти самые "EX" команды нет смысла - их без малого три сотни, а вот просмотреть этот список - стоит. Хотя бы для того, чтобы знать, какие еще возможности имеет vim. Кроме команд, дублирующих команды других режимов, мы найдем здесь команды управления буферами (==открытыми файлами), меню, "привязкой" команд к клавиатурным последовательностям (map), средства программирования, индексации (tags), управления редактором и многое, многое другое.< BR>
Так мы подошли к следующему достоинству vim, обеспечивающему его "простоту" - исключительным возможностям настройки. Прежде всего обратимся к конфигурационному файлу vimrc (для графического режима - gvimrc). На www.vim.org стоит взять vimrc.forall - файл написанный Свеном Гуксом (Sven Guckes) "на все случаи жизни". Файл прекрасно прокомментирован и действительно при некоторых модификациях может устроить многих. Но лучше использовать его как "руководство к действию". Познакомившись для начала с командой map:
map \\
которая заменяет
set langmap=йцу...ЙЦУ...;qwe...QWE...
Три точки в данном случае означают "все остальные символы на клавиатуре" в нижнем и верхнем регистрах для раскладок ru и us. <;> перед 'qwe' отделяет "подменяемый" набор от "подменяющего". Точку с запятой (в наборе, а не разделяющую) и двойные кавычки нужно исключать (quote) с помощью backslash (\), как обычно. Данная опция делает не нужным переключение раскладки клавиатуры, когда требуется латинский символ в нормальном режиме - несуществующий, как видите, недостаток vim, о котором я писал в первой статье. Спасибо всем указавшим на эту опцию. Что касается Свена Гукса, то, позаботившись о вводе таких необходимых ему умляутов, он действительно не учел нашу привязанность к кириллице - вполне простительно для жителя Берлина. Следующая секция vimrc.forall научит использовать сокращения - abbreviations. Дело вкуса. Занятно использовать сокращения в качестве "автокорректора" опечаток: aslo->also. Или - записной книжки: Ysnail->Sven Guckes
map
imap
cmap
Последние две команды можно заменить одной: map!
map
map n
будет по
Последующие секции, описывающие применение автокоманд для использования vim в качестве почтового клиента, PGP-шифрование и операции с синтаксисом, очень интересны, но уже не имеют отношения к разговору о "простоте" vim.
Вышеизложенное должно было убедить читателя, что "не так страшен vim..." и изучать устрашающих размеров help может быть, и не придется... У меня, во всяком случае, на каком-то этапе знакомства в этим редактором сложилось впечатление, что имей я под рукой 1-2 странички подсказок... А почему - нет? Поскольку по
- Предположим, Ваш файл называется myhelp.txt. Первой строкой в него вставим что-то вроде: *myhelp.txt* . Текст может быть любым - это всего лишь ссылка, на которую будет позиционироваться система поиска в help-файлах.
- В файле help.txt, в строке, например, второй (чтобы сразу была видна на экране) вставим указатель. Например: |$MyHelp| . Текст, опять-таки значения не имеет, а символ <$> поставлен на первую позицию лишь затем, что бы наша ссылка оказалась поближе к началу индексного файла tags.
- В индексный файл tags вносим строку:
$MyHelp myhelp.txt /*myhelp.txt*
Все элементы строки, надеюсь, понятны: первый - ссылка, второй - имя файла, третий - позиция в этом файле. Файл tags - сортирован по алфавиту и, если не хотите сортировать его заново, строку нужно поместить в соответствующее место. В данном случае между строками, $LANG.... и $VIM...
Готово. Запускаем vim, нажимаем
Ну, а поскольку "эталоном" дружественности интерфейса долгое время считалась система выпадающих меню, то осталось посмотреть, как таковая реализуется в vim. Дистрибутив содержит файл menu.vim, активный по умолчанию только для графической среды. Для появления меню в консольном режиме во все тот же vimrc нужно вставить следующие команды:
source $VIMRUNTIME/menu.vim
set wildmenu
set cpo-=<
set wcm=
map
На месте
amenu 10.330 &File.&Close
Элементы строки разделяются пробелами. В данном случае первый из них, amenu - команда, обеспечивающая появление данной позиции меню во всех (all) режимах. Второй - число, часть до точки которого определяет позицию в главном (горизонтальном), а после точки - в выпадающем (вертикальном) меню. Подобным образом лексемы до и после точки третьего элемента строки представляют собой текстовое содержание позиции меню. Пробелы и точки в составе этих лексем исключаются (quote) с помощью обратной косой черты (backslash). Допустим только один служебный символ -
Таким образом vim может обретести интерфейс, проще которого (при заданном уровне функциональности) уже не будет. Все желаемые усовершенствования Вы можете сделать сами. Средств для этого - достаточно. Не стану утверждать, что путь к этой "простоте" так уж, извините за тавтологию, прост, но "нет ничего ценнее хорошего инструмента". В том числе и для программиста.
Многих возможностей vim, кстати, ни, первая ни вторая статья даже не касались. Вне рассмотрения остались интеграция с Perl и Python, программирование пользовательских функций, форматирование текста и многие другие темы, достойные отдельного обсуждения.