Путь к VIM. Часть 1
(Программное обеспечение, работа в Linux)


- И.Яловой, 04/2003, ar2.mksat.net -

Оглавление:

Вступление
1. Достоинства
2. Основные принципы работы
3. Чтение файла, сохранение, выход из программы
4. Навигация по тексту
5. Редактирование
6. Удаление, копирование, вставка - работа с регистрами
7. Работа с несколькими файлами и "окнами"
8. Поиск, замена
9. Русские кодировки
10. Макросы
11. Группировка текста
12. Режим быстрой отладки
13. Параметры, которые полезно знать и настраивать
Заключение



Вступление

Необходимость использовать текстовый редактор (ТР) возникает достаточно часто - особенно у пользователя систем, подобных UNIX. Поэтому каждый стремится подобрать себе редактор по вкусу. Начнем с того, что их огромное количество, и даже под Linux их уже написано достаточно много. Среди них есть очень достойные кандидаты на звание лучшего, но ...

Оставив философский аспект выбора ТР, я просто изложу в краткой форме, как выбирал я сам. Прежде всего, мне нужен был быстрый и небольшой редактор, с подсветкой синтаксиса, макросами и возможностью оперативно выполнять команды, не выходя из редактора, ну такие как make и др. Найти такой редактор не так уж просто! Под MSDos я пользовался qedit, который имел только два достоинства - он был очень маленького размера и грузился мгновенно даже на машинах, которые уступают по быстродействию современным калькуляторам. На Amiga я пользовался CED, который умел все, кроме подсветки синтаксиса. Потом, правда, появился ProgEdit, но он был уж очень неповоротлив и работал со скоростью тормознутого текстового процессора. Он у меня не прижился. Когда я вернулся на PC (После Amiga я более-менее комфортно смог себя чувствовать только на Pentium II) то долго перебирал различные редакторы и остановился на Aditor. На мой взгляд, это лучший ТР на этой платформе. Он вполне может удовлетворить требования широких масс, оставаясь быстрым и малогабаритным. Собственно я еще не встречал ни одного человека, который бы поспорил со мной по этому вопросу. Затем началась гонка производителей железа и программного обеспечения, намек, я думаю, достаточно прозрачный. Меня как-то не слишком привлекала перспектива перманентного апгрейда и изучения новых творений софтверного гиганта. Поэтому я начал искать альтернативы. Мои впечатления о Linux подробно изложены в другом документе и здесь я не буду касаться этой темы. Скажу только, что я стал пытаться переползти на Linux.

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

О том, что VIM существует на многих платформах, я знал еще со времен Amiga. Более того, я слышал восхищенные отзывы от людей, деяния и авторитет которых вызывает глубокое уважение. Конечно, я решил попробовать.

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

Прошло некоторое время, и я нашел краткий справочник на русском языке по использованию Vi (прародителя VIM). Почитал и понял, что эта программа не для нормального человека, а исключительно для маньяков. Сейчас мне смешно вспоминать - справочник занимал неполных четыре страницы крупным шрифтом! Я решил, что по доброй воле я больше не вернусь к этому редактору.

Изменить своему решению меня заставили два обстоятельства:

первое - я хотел иметь под Linux и Windows один редактор;

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

Я решительно взялся за документацию, которая поставляется вместе с VIM. Вот тут меня ждал сюрприз - объем этой документации. Он поистине необъятный. То есть посидеть вечерок - разобраться в принципе невозможно!

Последняя моя попытка произошла совершенно случайно - нечем было заняться, и я решил распечатать и внимательно прочитать руководство по VIM. Потратив день на чтение и эксперименты, я понял, что им можно таки редактировать текст!!!

С того времени прошел год, и я, практически, пользуюсь только этим редактором. Должен признать, что он достоин того, чтобы потратить время на его изучение. Скажу честно, что каждый раз, когда я заглядываю в документацию, то нахожу новые полезные функции и возможности.

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

Я глубоко уважаю и высказываю свое почтение людям, которые самостоятельно его освоили и используют, значительно увеличив свою личную производительность, а тем, кому это не удалось, но и желание не пропало, я рекомендую ознакомиться с этим документом.

Я искренне желаю вам успеха в освоении этого замечательного редактора и постараюсь помочь, дав базовые знания и весь арсенал, необходимый для начала полноценной работы.

Авторские права

Авторские права принадлежат Яловому Илье Викторовичу © 2003. Этот документ может распространятся и изменяться в соответствии с требованиями GNU General Public License. Копия GPL доступна по адресу http://www.gnu.org/copyleft/gpl.html

1. Достоинства


Прежде всего, отмечу, что этот редактор отвечает всем требованиям, перечисленным ранее. Спорными можно назвать только его размер и скорость работы. Не пугайтесь! Занимает он вполне приемлемо и достаточно быстро работает. Но, честно говоря, эти параметры находятся очень близко от грани. Aditor занимает раза в 3 меньше и намного быстрее. Но я перестал беспокоиться по этому поводу, когда посмотрел файлы конфигурации подсветки синтаксиса! VIM - работает с синтаксисом значительно серьезнее, да и вообще когда начинаешь понимать его реальную мощь, то отпадают всякие сомнения.

Чтобы в полной мере оценить этот редактор с ним надо поработать. И именно здесь закопана собака!

Чтобы в полной мере оценить этот редактор с ним надо поработать ПРОФЕССИОНАЛЬНО. Тем не менее, постараюсь кратко сформулировать основные положительные аспекты:

  • мощнейшая система подсветки синтаксиса;

  • интеллектуальное форматирование при наборе исходных текстов программ;

  • невероятная гибкость (очень похоже на теле рекламу, но с ним действительно можно творить чудеса в плане конфигурации и настройки под конкретного пользователя или конкретные задачи);

  • различные возможности автоматизации набора и редактирования текста, включая макросы;

  • возможность выполнения команд операционной системы;

  • возможность одновременной работы с несколькими документами;

  • расширенные возможности по отладке программ (настраиваемая система разбора файла с ошибками компиляции);

  • очень удобные функции при редактировании текста;

  • наличие нескольких буферов обмена (регистров);

  • очень серьезная система поиска (от очень простого и быстрого, до сложного - с использованием регулярных выражений во всей их красе).

Перечислять можно долго, но оценить вы это сможете, только СЕРЬЕЗНО пощупав собственными руками.


2. Основные принципы работы


Как я уже говорил, работать с VIM можно, только понимая его идеологию. Чем же он отличается от "обычных" редакторов?

Далее постараюсь быть лаконичным и исключить лирику для лучшего восприятия материала - уж очень это серьезное дело. Текстовый редактор VIM может находиться в одном из трех состояний (В скобках указаны оригинальные английские названия):

  1. Режим ввода команд (NORMAL).

  2. Режим редактирования (INSERT).

  3. Режим выделения текста (VISUAL).


Существуют еще режим совместимый с VI - он нас не интересует, и режим выделения текста эмулирующий поведение обычных редакторов под Windows - Select, но при этом мы теряем больше, чем находим, и я его рассматривать не буду.

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

- NORMAL:

В этом режиме выполняются различные команды, такие как чтение-запись файлов, изменение параметров редактора и др.

- INSERT:

В этом режиме осуществляется вставка текста и непосредственное редактирование.

- VISUAL:

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

Имея три основных режима работы, мы должны оперативно между ними переключаться. Основным режимом принято считать режим NORMAL. Поэтому все переходы осуществляются через него.


Переход

Команда

Комментарий

Из режима

В режим

NORMAL

INSERT

i или "Insert"

Кнопка клавиатуры "Insert" кроме того переключает режимы вставки - замены.

INSERT

a

Вставка текста после символа, подсвеченного курсором

INSERT

o

Вставка новой строки после курсора с переходом в режим INSERT

INSERT

O

Вставка новой строки перед курсора с переходом в режим INSERT

INSERT

cc, S

Очистка строки и переход в режим INSERT

INSERT

C

Удалить правую часть строки и переход в режим INSERT

INSERT

s

Удалить подсвеченный символ и переход в режим INSERT

VISUAL

v

Режим выделения текста (с точностью до знака)

VISUAL

V

Режим выделения текста (с точностью до строки)

VISUAL

Ctrl+V (Ctrl+Q)

Режим выделения прямоугольной области текста, следует отметить, сто комбинация клавиш Ctrl+V в Windows используется для вставки текста из буфера, поэтому вместо нее следует использовать альтернативный вариант Ctrl+Q.

VISUAL

gv

Возврат к области, выделенной в прошлый раз.

NORMAL или INSERT

VISUAL

<LeftMouse>

Прекращает выделение или начинает новое

VISUAL

<RightMouse>

Продолжает выделять область

INSERT

NORMAL

ESC

Выход в режим NORMAL


NORMAL

Ctrl+O

Кратковременный выход в режим NORMAL для выполнения одной команды, после чего осуществляется автоматический возврат в режим INSERT

VISUAL

NORMAL

Ctrl+c, v, V,...

Вернуться в NORMAL можно повторив ту комбинацию, с помощью которой вы вошли в VISUAL. При этом не будет выполнено никаких действий над выделенной областью. Любая команда которая совершается над выделенной областью также переводит редактор в режим NORMAL, но подробно эти операции будут рассмотрены позже.


Далее я буду рассматривать как выполняются те операции, к которым мы привыкли, используя "традиционный" ТР с графическим интерфейсом (если кто помнит, то были строчные и экранные редакторы, так вот VIM, на мой взгляд, ближе к строчным). VIM имеет множество команд типа "удалить 10 слов от текущего положения курсора" или "перейти на 4 слова влево". Глупо говорить, что такие команды не нужны, просто современный рядовой пользователь не привык к таким командам - его орудие мышка. И вот как раз такому человеку будет интересно (надеюсь) прочитать далее, как можно выполнять привычные для него действия в таком своеобразном редакторе.



3. Чтение файла, сохранение, выход из программы


Итак, самые главные операции, которые необходимы любому ТР. Общая идея заключается в том, что VIM имеет некий набор буферов и экранов. Буфер - это собственно файл (не совсем корректно, но в первом приближении сойдет), а экран это то окно, в котором отображается буфер.

Все операции по работе с файлами, буферами и экранами осуществляются из режима NORMAL.

:edit - чтение файла и большинство вариаций на эту тему осуществляется с помощью этой команды. Общий формат команды имеет вид (здесь и далее в квадратные скобки заключаются необязательные элементы):

:e[dit][!] [++opt] [+cmd] [Имя файла]

где

++opt - это параметр позволяющий изменить значения fileformat и fileencoding, персонально для открываемого файла. Могут быть полезны следующие варианты:

++enc=koi8-r

устанавливает кодировку открываемого файла

++enc=koi8-u


++enc=cp1251


++enc=latin1


++ff=unix

строки заканчиваются символом <NL>

++ff=dos

строки заканчиваются символом <CR><NL>

++ff=mac

строки заканчиваются символом <CR>

+cmd - параметр позволяющий указать положение курсора для открываемого файла или выполнить другую команду.



Вопрос работы с различными русскими кодировками рассмотрен подробнее в соответствующем разделе.


Возможные варианты сохранения файла показаны в таблице:

Команда

Описание

NORMAL

:w[rite]

Сохранить текущий буфер

:w!

Сохранить текущий буфер не взирая на атрибут "только для чтения"

:sav[eas][!] {file}

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

:wa[ll]

Сохранить все содержимое всех буферов, котрые были изменены

:wq[!]

Сохранение файла и выход из программы


Вопрос работы с различными русскими кодировками рассмотрен подробнее в соответствующем разделе.

:q[uit] - обеспечивает выход из программы. Если один из открытых файлов был изменен и не сохранен, то для выхода из программы необходимо использовать :q! или предварительно сохранить все файлы.

4. Навигация по тексту


Для эффективного редактирования текста мы должны иметь возможность перемещаться по нему в любом направлении и к любому его фрагменту. VIM имеет для этого потрясающие и очень разноплановые возможности. Начнем с простого. для перемещения курсора традиционно используются следующие клавиши (только режим NORMAL): 'h' - влево, 'j' - вниз, 'k' - вверх, 'l' - вправо.

Такой подход обеспечивает максимальную скорость, для людей владеющих "слепой печатью", так как избавляет их от необходимости убирать руки от основной клавиатуры. Для людей владеющих "однопальцевой печатью" в последних версиях VIM добавлена возможность перемещения по файлу с помощью традиционных клавиш как в режиме NORMAL, так и в режиме INSERT. Но такие манипуляции далеко не предел возможностей VIM. Далее привожу сводную таблицу соответствующих команд. Надо заметить, что VIM поддерживает технологию подобную гиперссылкам.


Команда

Описание

Общие

<HOME>

Переход в начало строки

<END>

Переход в конец строки

NORMAL

f{символ}

Поиск указанного символа в текущей строке вправо

F{символ}

Поиск указанного символа в текущей строке влево

%

Переход к парной скобке - очень удобно при написании программ на С/С++, Lisp

{nn}G или

{nn}gg

Переход к строке nn, если номер строки не указан, то G - переход в конец, а gg - в начало документа. Эта функция очень помогает при отладке программ, однако VIM имеет специальный инструментарий для создания удобной среды разработки. Этот вопрос рассмотрен далее

CTRL+O

Возврат на предыдущую позицию (при переходах по документам с помощью меток, именованных меток, ссылок или с помощью команд gg и G)

CTRL+I

Команда обратная по действию CTRL+O. Подробнее смотрите описание использования меток.

*

Переход на следующее слово, аналогичное подсвеченному курсором. (Поиск слова, на котором в данный момент стоит курсор, далее по тексту)

#

Аналогична предыдущему, но в обратном направлении

)

Переход на начало следующего предложения

(

Переход на начало предыдущего предложения

}

Переход на начало следующего параграфа

{

Переход на начало предыдущего параграфа

[m

Переход назад к началу описания метода (Java)

[M

Переход назад к концу описания метода (Java)

]m

Переход вперед к началу описания метода (Java)

]M

Переход вперед к концу описания метода (Java)

[*

Переход назад к началу блока коментария (/*)

]*

Переход вперед к концу блока коментария (*/)

CTRL+]

Переход по ссылке

INSERT


Очень полезными могут оказаться именованные метки, особенно, когда приходится вносить изменения в нескольких частях одного документа. Для работы с именованными метками используются следующие команды:


Команда

Описание

NORMAL

m{имя}

Установить метку с именем {имя}. Именем метки может быть любая (одна) буква

'{имя}

Переход к строке с указанной меткой

`{имя}

Переход в конкретное место (строка и столбец) помеченное меткой

:marks

Показать все определенные метки


Кроме определяемых пользователем, имеются также предопределенные метки:

Метка

Описание

'

Позиция курсора до перемещения (метка, ссылка, поиск ...)

"

Позиция курсора во время последнего редактирования

[

Начало последнего изменения

]

Конец последнего изменения


5. Редактирование

Под редактированием я понимаю различные манипуляции над текстом и его форматированием. Соответственно для каждого из режима доступны различные команды. В режиме VISUAL осуществляются изменения выделенного участка текста. В режиме NORMAL в качестве обьекта редактирования выступает текущая строка, слово или символ. Корректура собственно текста осуществляется непосредственно в режиме INSERT, в котором вы можите добавлять новые символы, удалять или заменять старые. Естественно, и ввод текста осуществляется в этом режиме.


Команда

Описание

VISUAL

~

Изменить регистр выделенного фрагмента текста

c [x]

Удалить выделенный участок в регистр "x" и перейти в режим вставки

>

Сдвинуть выделенный фрагмент вправо

<

Сдвинуть выделенный фрагмент влево

!

Отфильтровать выделенные строки с помощью внешней программы

NORMAL

<DEL>, x

Удалить символ правее курсора

X

Удалить символ левее курсора

dd

Удалить текущую строку

u

Отмена последнего действия

CTRL-R

Вернуть исправления

D

Удалить до конца строки

.

Повторить последнее действие

r

Заменить символ подсвеченный курсором

~

Поменять регистр символа под курсором

INSERT

<CTRL> + A

Вставляет тект, который был введен в прошлый insert-сеанс

<CTRL> + W

Удаляет предыдущее слово

<DEL>

Удаляет следующий символ

<CTRL> + N

Автоматическое завершение слова с поиском вперед по тексту

<CTRL> + P

Автоматическое завершение слова с поиском назад по тексту

<CTRL> + T

Вставить табуляцию в начало текущей строки

<CTRL> + D

Удалить табуляцию из начала текущей строки

<CTRL> + Q

Вставляет символ, код которого следует за нажатием комбинации.

<CTRL> + X

Переходит в дополнительный режим, в котором вы можите выполнять автозавершение или другие полезные действия. Подробнее этот режим рассмотрен далее.

<CTRL> + E

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

<CTRL> + Y

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


Особый интерес представляет дополнительный режим, в который можно перейти из режима INSERT, нажав комбинацию клавиш <CTRL> + X. Чтобы выполнить требуемое действие вам необходимо выбрать одну из следующих комбинаций:


Комбинация

Описание

<CTRL> + E

Сдвиг окна на одну строку вверх (курсор остается на месте)

<CTRL> + Y

Сдвиг окна на одну строку вниз (курсор остается на месте)

<CTRL> + L

Автоматическое завершение целой строки с поиском в обратном направлении.

<CTRL> + K

Автоматическое завершение слова из файла, указанного в параметре 'dictionary'

<CTRL> + T

Автоматическое завершение слова из файла, указанного в параметре 'thesaurus'. Пример использования данной команды рассмотрен далее.

<CTRL> + I

Автоматическое завершение слова с поиском в текущем файле и всех подключаемых файлах.

<CTRL> + ]

Автоматическое завершение тэгов

<CTRL> + F

Автоматическое завершение имени файла


Особое внимание заслуживает комманда <CTRL> + T. Она представляет собой поиск в словаре. Рассмотрим пример использования этой команды. Допустим файл словаря содержит следующую строку:

великолепный замечательный прекрасный отличный превосходный

Если вы наберете великол и нажмете комбинацию <CTRL> + T, то будет вставлено слово великолепный. Последующие нажатия этой комбинации будут вставлять следующие слова соответственно: замечательный, прекрасный, отличный, превосходный.

Способов применения этой команды может быть множество, от подбора синонимов до организации удобной работы со словарём (при переводе).