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

Быстрый набор в командной строке

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

20.1    Редактирование командной строки
20.2    Сокращения командной строки
20.3    Дополнение командной строки
20.4    История командной строки
20.5    Окно командной строки

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


20.1 Редактирование командной строки

При использовании команды, начинающейся с двоеточия (:), а также вводе команд поиска / или ?, Vim перемещает курсор в самую нижнюю строку экрана, где вы можете ввести команду или шаблон для поиска. Эта строка называется Командной Строкой, в том числе и в тех случаях, когда она используется для ввода команд поиска.

Наиболее очевидный и простой способ редактирования командной строки - использовать во время набора кнопку <BS>, которая удаляет символ перед курсором. Для удаления других символов, набранных раннее, требуется сначала переместить курсор в необходимую позицию.

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

:s/колка/мышка/

Перед тем, как нажать <Enter>, вы замечаете, что вместо "колка" надо было набрать "кошка". Для исправления ошибки вы нажимаете <Left> девять раз. Курсор оказывается сразу после "кол". Теперь нажмите <BS> и "ш" для внесения исправлений:

:s/кошка/мышка/

Теперь можно нажать <Enter>. Перед выполнением команды нет необходимости перемещать курсор в конец командной строки.

Для перемещения в командной строке чаще всего используются следующие кнопки:

<Left> один символ влево
<Right> один символ вправо
<S-Left> или <C-Left> одно слово влево
<S-Right> или <C-Right> одно слово вправо
CTRL-B или <Home> в начало командной строки                    
CTRL-E or <End> в конец командной строки

Замечание: <S-Left> (кнопка перемещения курсора влево с нажатой клавишей Shift) и <C-Left> (кнопка перемещения курсора влево с нажатой клавишей Control) будут работать не на всех клавиатурах. Это же касается и остальных комбинаций с Shift и Control.

Кроме того, для перемещения курсора в командной строке, можно пользоваться мышью.

УДАЛЕНИЕ

Как уже было сказано, <BS> удаляет символ перед курсором. Для удаления всего слова целиком в командной строке пользуйтесь CTRL-W.

/the fine pig ~

             CTRL-W

/the fine ~

CTRL-U удаляет весь текст в строке, позволяя вам начать ввод с начала.

ЗАМЕНА

Кнопка <Insert> переключает между режимом вставки символов и режимом замены символов. Начните набор текста:

/маленькая серая мышка ~

Подведите курсор к началу слова "серая", дважды нажав <S-Left> (или 11 раз кнопку <Left>, если <S-Left> не работает). Теперь нажмите <Insert> для перехода в режим замены и наберите "белая".

/маленькая белая мышка ~
ОТКАЗ ОТ ВЫПОЛНЕНИЯ

Если вы хотели выполнить команду : или /, но потом передумали, то нажмите CTRL-C или <Esc>.

Замечание: <Esc> это кнопка выхода отовсюду. К сожалению, в старом добром Vi нажатие кнопки <Esc> в командной строке приводило к исполнению команды! Vim использует <Esc> более привычным способом, для прекращения выполнения команды. При желании вы можете вернуть Vim поведение в стиле Vi при помощи опции 'cpoptions'. Кроме того, при использовании привязок (которые могли быть написаны для Vi) <Esc> работает в стиле Vi. Таким образом, CTRL-C будет работать всегда.

Если вы находитесь в начале командной строки, то нажатие <BS> прекратит ввод команды. Это всё равно, что удаление символа ":" или "/", с которого начинается строка.


20.2 Сокращения командной строки

Некоторые команды ":" слишком длинные для набора. Мы уже отмечали, что ":substitute" можно сокращать до ":s". Вообще, сокращать можно любую ":" команду.

Насколько короткой может быть команда? У нас 26 букв латинского алфавита, а команд намного больше. Например, ":set" также начинается с ":s", но ":s" у нас уже используется для команды ":substitute". Поэтому, ":set" сокращается до ":se".

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

:s[ubstitute]

Это значит, что самая краткая форма ":substitute" это ":s". Последующие символы не являются обязательными, так что будут также работать варианты ":su" и ":sub".

В руководстве пользователя мы используем либо полное имя команды, либо краткую версию, которая, тем не менее, понятна. Например, ":function" можно сократить до ":fu", но поскольку многим людям не понятно, что это значит, то мы будем использовать ":fun".

В сценариях Vim рекомендуется использовать полное имя команды. Это позволяет облегчить внесение изменений в сценарий позднее. Исключение составляют некоторые часто используемые команды, такие как ":w" (":write") и ":r" (":read").

В частности, команда ":end" могла бы значить ":endif", ":endwhile" или ":endfunction". Так что лучше использовать в сценариях полное имя.

КОРОТКИЕ НАЗВАНИЯ ОПЦИЙ

В руководстве пользователя везде используются длинные версии названий опций. У многих опций также имеются сокращенные имена. В отличие от ":" команд, для опций всегда существует только одно сокращение. Например, краткое название опции 'autoindent' -- 'ai'. Таким образом, следующие две команды делают одно и то же:

:set autoindent
:set ai

Полный список длинных и коротких имён опций можно найти здесь: |список_опций|.


20.3 Дополнение командной строки

Данная особенность уже сама по себе является веской причиной для того, чтобы перейти с Vi на Vim. Как только вы привыкнете к дополнению командной строки, вы уже не сможете без неё жить.

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

info.txt
intro.txt
bodyofthepaper.txt

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

:edit bodyofthepaper.txt

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

:edit b<Tab>

В результате получится требуемая команда. Что произошло? Кнопка <Tab> производит автоматическое дополнение слова, находящегося перед курсором, в данном случае слова "b". Vim смотрит в каталог и сам находит файлы, которые начинаются на "b". Поскольку такой файл один, то Vim подставляет его имя в командную строку.

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

:edit i<Tab>

Vim подаст звуковой сигнал и выдаст следующее:

:edit info.txt

Звуковой сигнал означает, что Vim нашёл несколько соответствий, и показывает первое по алфавиту из найденных. Если вы нажмёте <Tab> еще раз, то получите

:edit intro.txt

Таким образом, если в первый раз <Tab> не показывает нужное имя файла, то нажмите эту кнопку ещё раз. Процесс можно повторять, пока вы не переберёте все соответствия.

Если вы нажмёте <Tab> на месте последнего соответствия, то Vim вернётся к тому, что вы набрали:

:edit i

После этого процесс начинается снова. Vim как бы ходит по кругу в списке соответствий. Для того, чтобы просмотреть список в обратном порядке, нажимайте CTRL-P:

      <------------------- <Tab> -------------------------+
                                  |
          <Tab> -->               <Tab> -->
:edit i              :edit info.txt          :edit intro.txt
          <-- CTRL-P               <-- CTRL-P
   |
   +---------------------- CTRL-P ------------------------>
КОНТЕКСТ

Если вместо ":edit i" вы наберёте ":set i" и нажмёте <Tab>, то получите

:set icon

Почему не ":set info.txt"? В Vim дополнение командной строки является контекстно-зависимым. Это значит, что список слов для дополнения зависит от команды, которая набрана перед словом. Сразу после команды ":set" имя файла никогда не используется, но зато используется имя опции.

И вновь, при повторном нажатии <Tab>, Vim покажет следующее слово из списка для подстановки. Поскольку опций, начинающихся на одну букву, может быть довольно много, то лучше сначала набрать несколько символов:

:set isk<Tab>

будет дополнено до

:set iskeyword

Теперь введите "=" и опять нажмите <Tab>:

:set iskeyword=@,48-57,_,192-255

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

<Tab> дополняет командную строку используя те элементы, которые должны быть на месте дополнения. Поэкспериментируйте, чтобы понять как это работает. В некоторых ситуациях вы возможно не получите то, что хотите. Такое возможно в тех случаях, когда Vim не знает, чего вы хотите, или если дополнение в данной ситуации не реализовано. В таких случаях в строку будет вставлен буквальный символ <Tab> (отображается как ^I).

СПИСОК СОВПАДЕНИЙ ДЛЯ ДОПОЛНЕНИЯ

Если соответствий много, то вам, возможно, захочется увидеть их список. Для этого нажмите CTRL-D. Например, нажатие CTRL-D после

:set is

приводит к

:set is
incsearch  isfname    isident    iskeyword  isprint
:set is

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

Если вы следили внимательно, то заметили, что "incsearch" не начинается с "is". В данном случае, "is" является сокращённой формой "incsearch" (многие опции имеют полную и сокращённую форму). Vim достаточно смышлён, чтобы понимать, что вы возможно хотите подставить вместо сокращённой формы имени полную.

И ЭТО ЕЩЁ НЕ ВСЁ!

Команда CTRL-L дополняет слово до наиболее длинного однозначного соответствия. Если вы наберёте ":edit i" и у вас есть файлы "info.txt" и "info_backup.txt", то вы получите ":edit info".

Опция 'wildmode' используется для тонкой настройки дополнения.
Опция 'wildmenu' может быть использована для получения списка соответствий в виде, напоминающем меню.
Опция 'suffixes' перечисляет расширения файлов, которые менее значимы и появляются в конце списка файлов.
Опция 'wildignore' задаёт шаблон имён файлов, которые вообще не появляются в списке для дополнения.

Более подробно обо всём этом см. |дополнение_командной_строки|.


20.4 История командной строки

В главе 3 мы уже рассказывали об истории вкратце. Её смысл в том, что для подстановки предыдущей команды в строку можно пользоваться кнопкой <Up>, а <Down> используется для перемещения к более новым командам в истории.

На самом деле в Vim имеется четыре истории. Здесь мы будем говорить об историях, которые используются для команд ":" и команд поиска "/" и "?". Команды поиска пользуются одной историей, поскольку обе пользуются одними и теми же шаблонами для поиска. Две другие истории ведутся для выражений и для строк ввода функции input(). См. |история_командной_строки|.

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

:se<Up>

Vim сам вернётся к предыдущей команде, которая начиналась с "se". Скорее всего это будет именно та команда ":set", которая вам нужна. По крайней мере, вам придётся нажимать кнопку <Up> гораздо меньшее количество раз.

Кнопка <Up> сравнивает уже набранный в командной строке текст с хранящимся в истории и показывает только совпадающие строки.

Если вы не находите то, что ищете, то воспользуйтесь кнопкой <Down>, чтобы вернуться к тому, с чего вы начинали и поправьте текст команды. Или нажмите CTRL-U, чтобы очистить командную строку и начать всё заново.

Для просмотра всех строк в истории:

:history

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

:history /

CTRL-P (previous, предыдущий) в данном случае делает то же, что и кнопка <Up>, но при этом не имеет значения, что вы уже набрали к данному моменту. Аналогично, CTRL-N (next, следующий) работает так же, как и <Down>.


20.5 Окно командной строки

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

Окно командной строки открывается с помощью команды

q:

Теперь в нижней части экрана Vim появилось небольшое окно, которое содержит историю команд и пустую строку в самом низу:

+-------------------------------------+
|другое окно                  |
|~                      |
|file.txt=============================|
|:e c                      |
|:e config.h.in                  |
|:set path=.,/usr/include,,          |
|:set iskeyword=@,48-57,_,192-255     |
|:set is                  |
|:q                      |
|:                      |
|командная-строка=====================|
|                      |
+-------------------------------------+

Редактор переходит в Обычный режим. Для перемещения курсора можно использовать обычные команды "hjkl". Например, переместите курсор на пять строк вверх к строке ":e config.h.in". Введите "$h" для того, чтобы подвести курсор к "i" в "in" и введите "cwout". Строка меняется на

:e config.h.out ~

Теперь нажмите <Enter> для выполнения команды. Окно командной строки закроется автоматически.

Команда <Enter> выполняет строку, которая находится под курсором, независимо от того, находится редактор в режиме Вставки или в Обычном режиме.

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

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

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

Замечание переводчика: по команде q/ открывается окно командной строки команд поиска.


Следующая глава: Уйти, чтобы вернуться
Авторские права: см. Авторские права