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


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

Оглавление:

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


6. Удаление, копирование, вставка - работа с регистрами

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


Команда

Описание

VISUAL

ab

Выделить фрагмент ограниченный символами "(" и ")" включительно

ib

Выделить фрагмент ограниченный символами "(" и ")"

aB

Выделить фрагмент ограниченный символами "{" и "}" включительно

iB

Выделить фрагмент ограниченный символами "{" и "}"

ap

Выделить параграф

a[

Выделить фрагмент ограниченный символами "[" и "]" включительно

i[

Выделить фрагмент ограниченный символами "[" и "]"

a<

Выделить фрагмент ограниченный символами "<" и ">" включительно

i<

Выделить фрагмент ограниченный символами "<" и ">"

:

Выполнить ex- команду для выделенного фрагмента

["x] D

Удалить выделенные строки в регистр "х"

["x] Y

Скопировать выделенный фрагмент в регистр "х"

["x] p

Заменить выделенный фрагмент содержимым регистра "х"

u

Установить для выделенного фрагмента нижний регистр

U

Установить для выделенного фрагмента верхний регистр

NORMAL

["x] p

Вставить текст из регистра "х" после курсора

["x] P

Вставить текст из регистра "х" до курсора

["x] y

Копировать текущую строку в регистр "х"

INSERT

<CTRL> + R

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

0-9, a-z, ", %, #, *, +, :, ., -, =


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

  1. безымянный регистр "";

  2. 10 нумерованных регистров от "0 до "9;

  3. Регистр малого удаления "-;

  4. 26 именованных регистров от "a до "z или от "A до "Z;

  5. 4 регистра, доступных только для чтения: ":, "., "%, "#;

  6. регистр выражения "=;

  7. регистры выделения "* и "+:

  8. регистр "Черная дыра" - "_;

  9. последний шаблон поиска "/.

Безымянный регистр используется при всех операциях копирования или удаления, если только в качестве целевого регистра не указана "Черная дыра". В последнем случае удаленный фрагмент не копируется ни в дин из регистров. Если при вставке текста не указан регистр-источник, то в качестве источника используется безымянный регистр. Если в качестве целевого регистра при копировании указать безымянный регистр, то запись осуществляется в регистр "0.

Нумерованные регистры заполняются скопированными или удаленными фрагментами текста. При этом регистр "0 содержит последний скопированный фрагмент, если не было указано целевого регистра. Регистр "1 содержит последний удаленный фрагмент, если только не было указано другого регистра и если удаленный фрагмент содержит более одной строки текста. При удалении фрагментов размером менее строки, он копируется в регистр "-. При каждом успешном удалении фрагмент из регистра "1 переносится в регистр "2, из "2 в "3 и так далее. Содержимое регистра "9 безвозвратно теряется.

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

Назначение остальных регистров очевидно по названию и указано в таблице

Специальные регистры:

Символ

Описание

<">

Безымянный регистр, содержащий последний удаленный или скопированный текст

<%>

Имя редактируемого файла

<#>

Альтернативное имя файла

<*>

Содержимое буфера обмена (X11 непосредственное выделение)

<+>

Содержимое буфера обмена

</>

Последний ключ поиска

<:>

Последняя команда

<.>

Последний вставленный текст

<->

Последнее "короткое" удаление (меньше строки)

<=>

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



7. Работа с несколькими файлами и "окнами"


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

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


Команда

Описание

NORMAL

:sp

Разделить текущее окно на два по горизонтали. В результате вы имеете два вида на один файл. Первоначальное окно делится пополам.

<CTRL> + W S

<CTRL> + W

<CTRL> + S

:vs

Разделить текущее окно на два по вертикали. В результате вы имеете два вида на один файл. Первоначальное окно делится пополам.

<CTRL> + W v

<CTRL> + W

<CTRL> + V

:new

Создает новое окно (горизонтальное разделение), в котором начинается редактирование пустого (нового) файла.

<CTRL> + W n

<CTRL> + W

<CTRL> + N

:vne

Создает новое окно (вертикальное разделение), в котором начинается редактирование пустого (нового) файла.

8. Поиск, замена

VIM имеет очень мощные средства для поиска и замены текста. Эти механизмы основаны на так называемых регулярных выражениях. Если читатель знаком с этой технологией, то мои объяснения будут излишни, если нет - то это тема для отдельной статьи. Рассмотри наиболее употребимые варианты.

Простой поиск осуществляется с помощью команды "/" или "?" в нормальном режиме для поиска вперед или назад по тексту соответственно. После символа команды необходимо указать шаблон для поиска. Для повторного поиска необходимо нажать соответствующую команду (без шаблона). Удобной особенностью поиска является автоматическая подсветка найденных слов.

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

Для замены дного фрагмента текста (шаблон) на другой (новый текст) необходимо использовать следующую форму записи команды:

[range]s/шаблон/новый текст/[i][g][c]

где [range] - указывает где именно необходимо осуществить операцию замены. Возможны следующие варианты этого параметра: % - весь текст, 1 - первая строка, . - текущая строка, $ - последняя строка, .,$ - от текущей строки и до конца файла, и так далее. Параметры в конце команды определяют ее поведение следующим образом: i - игнорировать регистр, g - заменять все слова в строке, иначе заменяется только первое найденное слово, c - подтверждать каждую замену.

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

9. Русские кодировки

Одной из проблем, с которой можно встретиться при редактировании документов, содержащих русский текст, является используемая кодировка. Для русского текста широко используются три основные кодировки (реально их больше, но остальные постепенно уходят в прошлое): Dos (альтернативная кодировка 866), Win (cp1251), Koi8-ru (Основная кодировка, используемая в семействе операционных систем Unix). Даже эти несколько разновидностей могут доставить значительно неудобствое в работе. Как вы уже догадались Vim поддерживает работу с различными кодировками. Более того, он поддерживает двухбайтную кодировку и различные направления письма. Хотя для нас это не играет особой роли.

Для поддержки различных кодировок необходимо добавить библиотеку iconv.dll (Для работы в Windows), которая распространяется отдельно. В современных дистрибутивах Linux все необходимое уже есть изначально.

За формат текстового документа отвечают два основных параметра: fileformat и fileencoding. Первый параметр определяет способ формирования строк в документе. Он может принимать следующие значения: dos (конец строки обозначается парой кодов <CR><NL>), unix (<NL>), mac (<CR>). Второй параметр определяет собственно кодировку. Она может принимать множество значений, но нас интересуют только несколько : koi8-r, koi8-u, 866, cp1251 и др.

Эти параметры можно установить для редактора глобально, при открытии файла, локально для буфера или для уже открытого файла. Как это все работает рассмотрим на примере. Допустим, у нас есть некий файл "dos.txt". Он набран в MS Dos в соответствующей кодировке. Но мы этого не знаем и пытаемся открыть его на редактирование в ОС Linux. Для этого мы выполняем команду :e dos.txt. Файл открывается, и его формат распознан автоматически, о чем свидетельствует пометка [dos] в строке статуса, но кодировка к сожалению не распознана, в результате чего мы наблюдаем на экране абракадабру. Однако отобразить этот файл в нормальном виде не составит труда. Необходимо набрать команду :e ++enc=866, при этом русские буквы примут свой обычный вид, а строка статуса дополнится пометкой [converted]. Теперь мы можем работать с этим файлом без проблем. При сохранении его формат сохранится. Но если мы хотим преобразовать его в более удобный для нас формат, то достаточно набрать :set fenc=koi8-r и пометки в строке статуса исчезнут, а сохраненный файл будет в нашем выбранном формате и кодировке. Работа непосредственно с командами может показаться неудобной. И с этим можно согласиться, но если вы планируете часто выполнять подобные операции, то ничего не стоит добавить эти операции в графическое меню или назначить им горячие клавиши.


10. Макросы


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

Есть и более простой способ для повторения простых действий - линейный алгоритм, без ветвлений. Этот так называемые "сложные повторения" или "записи". Эти макросы записываются непосредственно в именованные регистры. Для начала записи необходимо в режиме NORMAL нажать "q" и имя того регистра, в который необходимо осуществить запись. Окончание записи осуществляется повторным нажатием "q". Для повтора записанных действий в режиме NORMAL используется команда "@" + имя регистра, а в режиме INSERT - <CTRL>+R + имя регистра.

Есть еще один метод быстрой подстановки фиксированных слов (словосочетаний или даже целых выражений). Этот метод использует так называемые аббревиатуры. Для описания своей аббревиатуры необходимо выполнить команду :iabbrev за которой следует аббревиатура и ее расшифровка соответственно. Пример: :iabbrev M$ Microsoft. После выполнения этой команды, если вы введете M$ с последующим пробелом, то автоматически будет подставлена соответствующая расшифровка "Microsoft".

11. Группировка текста

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

Группировка может быть осуществлена одним из следующих способов:

  • вручную;

  • по левому отступу, больший означает глубину вложенности;

  • по вычисляемому выражению, определяющему группировку;

  • в соответствии с подсветкой синтаксиса;

  • в соответствии с командой diff - скрываются одинаковые фрагменты текста;

  • По специальным маркерам в тексте.


Рассмотри только первый способ группировки. Группировки, созданные вручную теряются при закрытии файла. Чтобы их сохранить необходимо выполнить команду :mkview. Восстановление сохраненных группировок осуществляется с помощью команды :loadview. Другие команды для работы со сгруппированным текстом приведены в таблице:

Команда

Описание

VISUAL

zf

Группирует (скрывает) выделенный фрагмент текста

NORMAL

zfap

Скрывает параграф, содержащий курсор

zf

Создать маркеры группировки

zd

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

zE

Удаляет все группировки в текущем окне (действует на группировки, созданные вручную и с помощью маркеров)

zo

Открыть текущую группировку

zc

Скрыть (закрыть) текущую группировку

zO

Открыть текущую группировку (рекурсивно)

zC

Скрыть (закрыть) текущую группировку (рекурсивно)

zM

Скрыть все группировки

zR

Открыть все группировки

INSERT

12. Режим быстрой отладки

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



Команда

Описание

NORMAL

:make

Запуск сборки проекта.

:cc [номер]

Отображение ошибки с указанным номером

:cn

Перейти к следующей ошибке

:cp

Перейти к предыдущей ошибке

:cr

Перейти к первой ошибке

:cla

Перейти к последней ошибке

:cq

Выйти из программы с возвратом кода ошибки

:cf [имя файла]

Загрузить указанный файл в качестве файла ошибок

:cl

Отобразить все ошибки

:copen

Открыть окно со списком ошибок

:cclose

Закрыть окно со списком ошибок


Важной деталью работы в этом режиме является распознание формата файла ошибок. Очевидно, что различные компиляторы генерируют их поразному. Более того, в некоторых из них, этот формат можно задавать или выбирать. Для работы с конкретным компилятором необходимо настроить систему разбора файла с ошибками. Делается это с помощью команды :compiler {название}. По сути, при выполнении этой команды запускается скрипт, который настраивает параметры VIM на работу с указанным компилятором. Эти параметры можно легко настроить и вручную или написать свой скрипт.

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

Установка параметров осуществляется командой :set. Она имеет следующие варианты исполнения:

  • :set - показывает все опции, значения которых отличаются от их стандартных значений;

  • :set all - показывает все опции, кроме терминальных;

  • :set termcap - показывает только терминальные опции;

  • :set {option}? - показывает значение опции {option};

  • :set {option} - если {option} - логическая, то устанавливает ее в состояние "on", иначе показывает значение;

  • :set no{option} - устанавливает опцию в состояние "off"

  • :set {option}! - инвестирует значение опции;

  • :set {option}& - устанавливает значение опции в ее стандартное значение;

  • :set {option}={value} - устанавливает значение опции равным {value}.


Параметр

Сокр.

Тип

Описание

autoindent

ai

триггер

При начале новой строки отступ копируется с предыдущей

autowrite

aw

триггер

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

backup

bk

триггер

Создает резервную копию файла при перезаписи. Оставляет ее после успешного окончания записи. Если вы не хотите оставлять резервную копию после успешного завершения записи, то сбросьте значение этого параметра в "off" и установите параметр writebackup

backupcopy

bkc

строка

Определяет метод создание резервной копии: "yes" - копирует существующий файл и перезаписывает старый; "no" - переименовывает существующий файл и создает новый, "auto" - выбирает наиболее оптимальный вариант.

binary

bin

триггер

Эту опцию необходимо установить перед попыткой редактирования бинарных файлов

dictionary

dict

строка

Список файлов, разделенных запятыми. По этим файла происходит поиск при авто-завершении ключевых слов (<CTRL>-X + <CTRL>-K).

display

dy

строка

Изменяет способ отображение текста. Представляет собой список флагов разделенных запятыми: "lastline" - если последняя строка, отображаемая в окне, не может быть показана полностью, то видна ее часть, иначе она заменяется символами "@" ; "uhex" - непечатные символы отображаются в шестнадцатиричном виде как <xx>, вместо использования ^C и ~C.

errorfile

ef

строка

Имя файла с ошибками в режиме быстрой отладки

errorformat

efm

строка

Описание формата строки файла с ошибками, записанное в стиле scanf

fileencoding

fenc

строка

Кодировку текущего файла

fileformat

ff

строка

Формат текущего файла

foldclose

fcl

строка

Если равно "all", то группировки автоматически закрываются, когда курсор выходит за их пределы.

foldmethod

fdm

строка

Определяет метод группировки для текущего окна: "manual" - ручная группировка; "indent" - группируются строки с одинаковым отступом ; "expr" - уровень группировки определяется по вычисленному выражению; "marker" - группировка осуществляется в соответствии с маркерами; "syntax" - группируются элементы с подсветкой синтаксиса; "diff" - группируется текст, не содержащий изменений

ignorecase

ic

триггер

Игнорировать регистр при поиске

makeef

mef

строка

Имя файла ошибок, возникших при выполнении команды :make. Усли не указано, то используется автоматически сгенерированное имя.

makeprg

mp

строка

Программа, используемая при выполнении команды :make.

modeline

ml

логич.

Включает непосредственное включение строки конфигурации в редактируемый файл.

shiftwidth

sw

число

Число пробелов, используемых при автоотступе.

showbreak

sbr

строка

Символы, которыми обозначаются автоматически перенесенные строки

showmatch

sm

триггер

Если установлено, то при вводе закрывающей скобки происходит быстрая подсветка соответствующей ей открывающей скобки.

tabstop

ts

число

Размер табуляции

textwidth

tw

число

Максимальное число символов, которые могут быть введены в одну строчку. Если установить равным 0, то данная функция отключается.

thesaurus

tsr

строка

Список файлов , по которым осуществляется поиск словарных статей. (<CTRL>+X + <CTRL>+T)

undolevels

ul

число

Максимальное число изменений, которые могут быть отменены

visualbell

vb

триггер

Заменить звуковой сигнал визуальным

wrap


триггер

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

writebackup

wb

триггер

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



Заключение

Я очень надеюсь, что этот документ оказался вам полезен, и вы узнали из него что-то новое. Для людей, которые только познакомились с VIM, хочу заметить, что перечисленные и описанные здесь возможности - это только вершина айсберга. Действительно, VIM таит в себе огромную мощь. На его основе программист может легко организовать удобную среду разработки. Несмотря на то, что в среде профессиональных программистов, особенно *nix - ориентированных, этот редактор высоко оценен, я хотел бы привести еще несколько доводов в его пользу. Общественное признание VIM еще выражается и в том, что такие ведущие, в своих областях, интегрированные среды разработки как MSVisualStudio и KDevelop имеют возможность интеграции с VIM. На мой взгляд, это достаточно серьезный довод!

Тем не менее, этот документ далек от идеала, ему не хватает примеров, не освещены очень многие варианты применения VIM. Возможно, в нём содержатся некоторые ошибки - как грамматические, так и смысловые. То есть, это - не готовый продукт, а только первая версия. Поэтому я надеюсь, что заинтересованные люди примут участие в редактировании и дополнении данного документа. Ваши замечания и благодарности :-) можете отсылать по адресу i_yalovoy@mail.ru.