РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

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

24.1    Внесение исправлений
24.2    Показ соответствий
24.3    Автодополнение в режиме Вставки
24.4    Повторная вставка
24.5    Копирование символов из другой строки
24.6    Вставка содержимого регистра
24.7    Сокращения
24.8    Ввод специальных символов
24.9    Диграфы
24.10    Команды обычного режима

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


24.1 Внесение исправлений

Мы уже говорили о кнопке <BS>, которая удаляет символы слева от курсора. Кнопка <Del> выполняет ту же операцию для символа, находящегося непосредственно под курсором.

Если вы неправильно набрали целое слово, то пользуйтесь командой CTRL-W:

Лошадь упала на небо ~
                    CTRL-W
Лошадь упала на ~

Если вы намудрили в текущей строке что-то совсем не то и хотите начать всё сначала, то для удаления строки пользуйтесь CTRL-U. При этом сохраняется отступ, а также текст, который находится после курсора. Удалению подлежит только текст между первым непробельным символом строки и положением курсора. В примере, приведённом ниже, нажатие CTRL-U при курсоре, расположенном на букве "у" слова "упала",

Лошадь упала на ~
       CTRL-U

приведёт к таким изменениям:

упала на ~

Если вы заметили ошибку в слове, находящемся за несколько слов до текущего положения курсора, то для её исправления вам потребуется переместить курсор назад. Например,

Лошадь упало на землю ~

Слово "упало" надо заменить на "упала". Если курсор находится в конце строки, то для исправления ошибки вам потребуется ввести следующее:

  <Esc>3berаA                     
Выйти из режима Вставки <Esc>
Вернуться на три слова назад      3b
Перейти к символу "о"        e
Заменить на "а"         rа
Вернуться в режим Вставки           A

Другой способ добиться того же самого эффекта:

  <C-Left><C-Left><Right><Right><Del>a<End>
На два слова назад <C-Left><C-Left>
Перейти к символу "о"                 <Right><Right>
Удалить "o"                               <Del>
Вставить "a"                                    a
Перейти к концу строки                                     <End>

При этом используются специальные кнопки для перемещения курсора в режиме Вставки. Это похоже на метод, которым вы бы пользовались в безрежимном редакторе. Возможно, этот метод проще для запоминания, но требует больше времени (необходимо переносить руку от клавиатуры с буквами к клавишам управления курсором, и для нажатия кнопки <End> вам наверняка придётся оторвать глаза от экрана).

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

В режиме вставки можно пользоваться следующими специальными кнопками:

<C-Home> В начало файла
<PageUp> На один экран вверх
<Home> К началу строки
<S-Left> На одно слово влево
<C-Left> На одно слово влево
<S-Right> На одно слово вправо
<C-Right> На одно слово вправо
<End> В конец строки
<PageDown> На один экран вниз
<C-End> В конец файла

Есть ещё несколько специальных кнопок, см. |вставка-спец-спец|.


24.2 Показ соответствий

Было бы неплохо, если бы можно было бы видеть, какой именно ( соответствует ) прямо в процессе набора. Vim может это делать, если включить опцию 'showmatch':

:set showmatch

Например, при наборе текста "(пример)", как только вы наберёте ), Vim переместит курсор к соответствующей открывающей скобке на какое-то мгновение и затем вернёт курсор на прежнее место.

Если соответствующей ( не было найдено, то Vim подаст звуковой сигнал. В этом случае вы будете знать, что вы где-то пропустили символ (, либо ввели слишком много ).

Соответствие также будет показано и для пар [] и {}. Вы не обязаны ждать редактор при наборе следующего символа -- как только Vim увидит, что вы продолжаете ввод, курсор сразу же переместится в требуемое положение и продолжит вставку символов.

Время, которое требуется Vim для показа соответствия, можно изменить при помощи опции 'matchtime'. Например, для показа соответствующей скобки в течение полутора секунд:

:set matchtime=15

Значение этой опции указывается в десятых долях секунды.


24.3 Автодополнение в режиме Вставки

Vim может автодополнять слова при наборе в режиме Вставки. Это работает так: вы набираете часть слова, нажимаете CTRL-P, и Vim угадывает окончание слова.

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

total = ch_array[0] + ch_array[1] + ch_array[2]; ~

Вы начинаете набор текста как обычно:

total = ch_array[0] + ch_ ~

В этот момент вы указываете Vim на необходимость дополнения слова при помощи команды CTRL-P. Vim ищет слово, которое начиналось бы так же, как и слово, расположенное под курсором. В данном случае, для "ch_" есть совпадение "ch_array". Поэтому, нажатие CTRL-P приводит к следующему результату:

total = ch_array[0] + ch_array ~

Набрав еще несколько символов вы получаете

total = ch_array[0] + ch_array[1] +  ~

Если вы теперь опять нажмёте CTRL-P, то Vim вновь выполнит поиск слова для дополнения. Поскольку перед курсором находится пробел, то будет выполнена подстановку первого слова, которое было набрано раннее, в данном случае "ch_array". Повторное нажатие CTRL-P выполнит подстановку предыдущего слова, в данном случае слова "total". Последующие нажатия CTRL-P продолжают подстановку слов, найденных в обратном порядке. Если больше ничего подходящего не найдено, то редактор возвращается к первоначальному тексту, который в данном случае отсутствует, поэтому редактор при последующих подстановках вновь покажет "ch_array".

Для поиска слов для дополнения в направлении "вперёд" используйте CTRL-N. Поскольку поиск в конце файла переходит в начало файла, то CTRL-N и CTRL-P будут находить одни и те же дополнения, только в разном порядке. CTRL-N это команда для поиска следующего ("Next") соответствия для подстановки, а CTRL-P для поиска предыдущего ("Previous").

При поиске требуемого дополнения Vim предпринимает много усилий. По умолчанию, поиск происходит в следующих местах:

  1. Текущий файл
  2. Файлы в других окнах
  3. Другие загруженные файлы (скрытые буферы)
  4. Файлы, которые есть в списке буферов, но не загружены (неактивные)
  5. Файлы меток
  6. Все файлы, на которые ссылаются #include в данном файле
ОПЦИИ

Порядок поиска соответствия для автоподстановки можно настроить с помощью опции 'complete'.

Также используется опция 'ignorecase'. Если она включена, то различия в регистре символов при подборе слова для автодополнения не учитываются.

Специально для дополнения используется опция 'infercase'. Она полезна для поиска соответствий без учёта регистра (опция 'ignorecase' также должна быть включена), но при этом для дополнения будет использовано слово без изменения регистра уже набранных символов. Иными словами, если вы набрали слово "Высоко" и Vim нашёл для подстановки слово "высококачественный", то в результате дополнения будет подставлено слово "Высококачественный".

АВТОДОПОЛНЕНИЕ СПЕЦИАЛЬНЫХ ЭЛЕМЕНТОВ

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

CTRL-X CTRL-F имена файлов
CTRL-X CTRL-L целые строки
CTRL-X CTRL-D определения #define (в т.ч. и в файлах #include)
CTRL-X CTRL-I в текущем файле и в файлах #include
CTRL-X CTRL-K слова из словаря
CTRL-X CTRL-T слова из тезауруса
CTRL-X CTRL-] метки
CTRL-X CTRL-V командная строка Vim

После каждой из этих команд можно использовать CTRL-N и CTRL-P для поиска следующего или предыдущего соответствия для дополнения.

Подробнее о каждой из этих команд читайте в |вставка-автодополнение|.

ДОПОЛНЕНИЕ ИМЁН ФАЙЛОВ

В качестве примера рассмотрим комбинацию CTRL-X CTRL-F. Она используется при поиске имён файлов. При дополнении Vim будет просматривать текущий каталог и подставлять имя файла, соответствующее набранному фрагменту одно за другим.

Предположим, в текущем каталоге имеются следующие файлы:

main.c  sub_count.c  sub_done.c  sub_exit.c

Теперь, перейдём в режим Вставки и начнём ввод текста:

Коды выхода приводятся в файле sub ~

В этот момент можно ввести команду CTRL-X CTRL-F, чтобы Vim сам дополнил слово "sub", используя имена файлов из текущего каталога. Первое совпадение будет sub_count.c, но поскольку это не то, что нам требуется, мы будем перебирать все варианты при помощи команды CTRL-N. Наконец, мы увидим требуемое имя файла:

Коды выхода приводятся в файле sub_exit.c ~

Если имя файла начинается с / (на Unix) или с C:\ (на MS-Windows), то можно таким способом вставить любое имя файла. Например, наберём "/uCTRL-X CTRL-F". Если вы на Unix, то увидите дополненное имя "/usr":

файл находится в каталоге /usr/ ~

Если снова нажать CTRL-N, то мы опять окажемся с исходным "/u". Вместо этого, снова нажмём CTRL-X CTRL-F, чтобы принять дополненное значение и опуститься на один каталог вниз по дереву файловой системы:

файл находится в каталоге /usr/X11R6/ ~

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


24.4 Повторная вставка

Если вы нажмёте в режиме Вставки CTRL-A, то редактор вставит текст , который вы набирали в последний раз, когда находились в режиме Вставки.

Например, пусть у вас есть файл, который начинается так:

"file.h" ~
/* Main program begins */~

Вы исправляете этот файл, вставляя в начале первой строки слово "#include ":

#include "file.h" ~
/* Main program begins */ ~

Теперь вы перемещаетесь в начало следующей строки по команде "j^" и начинаете новую строку "#include":

i CTRL-A

Результат выглядит так:

#include "file.h" ~
#include /* Main program begins */ ~

Слово "#include " было вставлено потому, что именно этот текст был вставлен в предыдущей вставке. Теперь просто наберите "main.h"<Enter>, чтобы закончить строку:

#include "file.h" ~
#include "main.h" ~
/* Main program begins */ ~

Команда CTRL-@ выполняет команду CTRL-A и выходит из режима Вставки. Это позволяет повторить вставку того же фрагмента ещё раз.


24.5 Копирование символов из другой строки

Команда CTRL-Y вставляет символ из строки, расположенной над курсором. Это полезно, если вы копируете содержимое предыдущей строки. Например, у вас имеется такая строка:

b_array[i]->s_next = a_array[i]->s_next; ~

Теперь вы хотели бы повторить эту строку, но вместо "s_next" вам нужно набрать "s_prev". Начните новую строку и нажмите CTRL-Y 14 раз, пока курсор не окажется под символом "n" слова "next":

b_array[i]->s_next = a_array[i]->s_next; ~
b_array[i]->s_ ~

Теперь наберите "prev":

b_array[i]->s_next = a_array[i]->s_next; ~
b_array[i]->s_prev ~

Продолжайте нажимать CTRL-Y, пока не окажетесь под следующим словом "next":

b_array[i]->s_next = a_array[i]->s_next; ~
b_array[i]->s_prev = a_array[i]->s_ ~

Теперь наберите "prev;" чтобы закончить строку.

Команда CTRL-E работает точно так же, как и CTRL-Y, но копирует символы из строки, расположенной ниже курсора.


24.6 Вставка содержимого регистра

Команда CTRL-R {регистр} вставляет содержимое регистра. Этим можно пользоваться для быстрого ввода длинного слова. Например, вам нужно набрать следующее:

r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c) ~

Эта функция определена в другом файле. Откройте его, подведите курсор к имени функции и скопируйте его в регистр v:

"vyiw

"v это указание на регистр, "yiw" -- команда копирования "внутреннего" слова. Теперь вернёмся к редактированию исходного файла, в который требуется вставить новую строку, и начнём набор в режиме Вставки:

r = ~

Теперь вставим имя функции из регистра при помощи команды CTRL-R v:

r = VeryLongFunction ~

Продолжим набор, используя команду CTRL-R v по мере необходимости для вставки слова "VeryLongFunction".

Того же самого эффекта можно было бы достичь и при помощи автодополнения, но использование регистра позволяет сократить время, если на одни и те же символы начинается слишком много слов.

Если в регистре хранятся специальные символы, такие как <BS>, то они при вставке интерпретируются так, как если бы они были набраны с клавиатуры. Если вы не хотите, чтобы так происходило (то есть, действительно хотите вставить в текст <BS>), то используйте команду CTRL-R CTRL-R {регистр}.


24.7 Сокращения

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

Чтобы Vim автоматически подставлял "смотри" вместо "см." во время набора, введите команду:

:iabbrev см. смотри

Теперь, при наборе "см." в текст будет подставляться слово "смотри". Подстановка осуществляется после набора сокращённой формы с последующим ввода символа, который не может являться частью слова, например, пробела:

Что вводится с клавиатуры Что получается
Подробнее об этом с Подробнее об этом с ~
Подробнее об этом см Подробнее об этом см ~
Подробнее об этом см. Подробнее об этом см. ~
Подробнее об этом см.<Space> Подробнее об этом смотри<Space> ~

Подстановка выполняется только после завершения ввода сокращенного слова.

СОКРАЩЕНИЯ ДЛЯ НЕСКОЛЬКИХ СЛОВ

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

:iabbrev ВВП Василий Васильевич Пупкин

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

:iabbrev #b /****************************************
:iabbrev #e <Space>****************************************/

Эти сокращения полезны для создания комментариев в "рамочках".  Комментарий начинается с #b, затем следует текст комментария, и, наконец, #e рисует последнюю строку.

Обратите внимание, что сокращение #e начинается с пробела. Обычно Vim игнорирует пробелы между левой и правой частями команды сокращения. Чтобы избежать проблем, я указываю пробел как семь набранных последовательно символов: <, S, p, a, c, e, >.

Замечание: ":iabbrev" слишком долго набирать! Не стесняйтесь пользоваться сокращением для команды сокращения: ":iab"!

ИСПРАВЛЕНИЕ ОПЕЧАТОК

Часто бывает, что одна и та же опечатка встречается постоянно. Например, набор слова "teh" вместо "the". Исправить проблему можно при помощи сокращения:

:abbreviate teh the

Таких опечаток можно составить целый список. Их можно добавлять по мере необходимости.

СПИСОК СОКРАЩЕНИЙ

Команда ":abbreviate" показывает список сокращений:

:abbreviate
i  #e          ****************************************/
i  #b         /****************************************
i  ВВП         Василий Васильевич Пупкин
i  см.         смотри
!  teh         the

"i" в первой колонке указывает на режим Вставки (Insert). Это значит, что сокращение работает только в режиме Вставки. Возможны также и другие варианты:

c режим Командной строки :cabbrev
! как режим Вставки, так и режим Командной строки :abbreviate

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

УДАЛЕНИЕ СОКРАЩЕНИЙ

Чтобы избавиться от какого-либо сокращения, используйте команду ":unabbreviate". Предположим, у вас есть сокращение:

:abbreviate @f fresh

Чтобы удалить это сокращение, пользуйтесь командой:

:unabbreviate @f

Во время набора @f будет автоматически заменено на "fresh", но вам не следует об этом волноваться, Vim поймёт, что вы от него хотите (если только у вас не определено также сокращения с краткой формой "fresh").

Чтобы избавиться от всех сокращений, пользуйтесь командой:

:abclear

Для режима Вставки и режима Командной строки также существуют свои варианты команд ":unabbreviate" и ":abclear":

:iunabbreviate
:iabclear
:cunabbreviate
:cabclear
СОКРАЩЕНИЯ И ПРИВЯЗКИ

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

:abbreviate @a adder
:imap dd disk-door

В этом случае, если вы наберёте @a, то получите "adisk-doorer" вместо "adder". Чтобы избежать этого, можно пользоваться командой ":noreabbrev", которая делает то же, что и ":abbreviate", но при этом запрещает использование результата для привязок:

:noreabbrev @a adder

К счастью, ситуация, при которой результат подстановки сокращения используется в привязках, является достаточно редкой.


24.8 Ввод специальных символов

Команда CTRL-V используется для вставки символа как есть. Иными словами, любой особый смысл, который может иметь символ, будет игнорироваться. Например, команда

CTRL-V<Esc>

вставляет символ esc прямо в текст, так что вы не покидаете режим Вставки.

Замечание: На MS-Windows CTRL-V используется для вклейки текста из буфера обмена, поэтому на этой платформе вместо CTRL-V используйте CTRL-Q. С другой стороны, на Unix CTRL-Q не будет работать на всех терминалах, поскольку часто имеет другое специальное значение.

Вы также можете пользоваться командой CTRL-V {цифры} для вставки символа с десятичным номером {цифры}. Например, символ <Del> имеет код 127 (но не обязательно кнопка <Del> должна иметь этот же код!). Для вставки этого символа наберите:

CTRL-V 127

Этот способ позволяет вводить символы с кодами до 255. Если вам надо набрать менее трёх символов, то окончанием ввода команды является любой нецифровой символ, либо вы можете использовать нули.

Каждая из перечисленных ниже команд вставляет в текст символ <Tab> и точку:

CTRL-V 9.
CTRL-V 09.
CTRL-V 009.

Для ввода кода символа в шестнадцатеричной форме используйте после ввода CTRL-V символ "x":

CTRL-V x7f

Таким способом также можно вводить символы с кодами до 255 (CTRL-V xff). Восьмеричные символы вводятся с помощью приставки "o", 16-битные символы с помощью приставки "u", а 32-битные с помощью приставки "U". Два последних примера относятся к символам Unicode:

CTRL-V o123
CTRL-V u1234
CTRL-V U12345678

24.9 Диграфы

Некоторые символы отсутствуют на клавиатуре. Возьмём, к примеру, символ авторского права (?). Для набора таких символов используются так называемые диграфы, т.е. символы, для набора которых используется два символа. Для ввода ?, к примеру, используется команда:

CTRL-K Co

Чтобы посмотреть таблицу диграфов, используйте команду:

:digraphs

Вот несколько строк из этой таблицы:

AC ? 159  NS ? 160  !I ?  161  Ct ?  162  Pd ё  163  Cu ?  164  Ye ?  165 ~
BB ?  166  SE ?  167  ': ?  168  Co ?  169  -a ?  170  << ?  171  NO ?  172 ~
-- ?  173  Rg ?  174  'm ?  175  DG ?  176  +- ?  177  2S ?  178  3S Ё  179 ~

Из этой таблицы видно, например, что по команде CTRL-K Pd в текст будет вставлен символ ё. Десятичный код этого символа -- 163.

Pd это сокращение для Pound, фунт. Название большинства диграфов выбраны так, чтобы их было проще запомнить. Если вы внимательно посмотрите на таблицу, то поймёте логику.

Если для обратной комбинации символов нет отдельного диграфа, то порядок символов в диграфе не имеет значения. Например, CTRL-K dP также вводит символ фунта, поскольку Vim будет искать диграф "Pd", не найдя диграфа "dP".
   

Замечание: Диграфы зависят от кодировки, которую вы используете. В MS-DOS диграфы будут отличаться от MS-Windows. Всегда пользуйтесь командой :digraphs", чтобы выяснить, какие диграфы доступны на вашей платформе.

Замечание для русской версии: Исходный текст русской документации набран в кодировке utf-8. В зависимости от кодировки, используемой на вашем терминале, а также от кодировки используемого вами языкового пакета, возможны расхождения между описанным здесь и фактическим видом символов. Надеемся, что смысл диграфов не теряется из вида, несмотря на возможные недоразумения в примерах.

Вы можете определить собственные диграфы. Например:

:digraph a" Д

Эта команда определяет, что CTRL-K a" вставляет символ Д. Символ можно определять и десятичным числом:

:digraph a" 228

Более подробно о диграфах читайте здесь: |диграфы|.

Другой способ вставки спецсимволов -- использование раскладок клавиатуры. Подробнее об этом читайте в |45.5|.


24.10 Команды обычного режима

Режим вставки предоставляет достаточно ограниченный набор команд, в Обычном режиме можно сделать гораздо больше. Для использования одной из команд Обычного режима вы, скорее всего, выходите из режима Вставки по команде <Esc>, выполняете команду Обычного режима, и затем возвращаетесь в режим Вставки с помощью команды "i" или "a".

Есть и более простой способ выполнить команду Обычного режима, не покидая режим Вставки: CTRL-O {команда}. Например, для удаления текста от курсора до конца файла:

CTRL-O D

Этим способом можно выполнить только одну команду Обычного режима за раз, но вы можете указать регистровую или числовую приставку команды. Вот более сложный пример:

CTRL-O "g3dw

Эта команда удаляет три слова в регистр g.


Следующая глава: Редактирование форматированного текста
Авторские права: см. Авторские права