СПРАВОЧНИК ПО VIM - Брам Мооленаар
Команды, которые здесь рассматриваются, управляют позицией курсора в файле.
Если новая позиция находится за пределами экрана, то происходит прокрутка экрана (см. также опции 'scrolljump' и 'scrolloff').
- Перемещения и операторы
- Перемещения курсора влево и вправо
- Перемещения курсора вверх и вниз
- Перемещения по словам
- Перемещения по текстовым объектам
- Выделение текстовых объектов
- Отметки
- Прыжки
- Различные перемещения
Общие замечания:
Для выяснения текущий позиции в файле используйте команду "CTRL-G" |CTRL-G| или команду "g CTRL-G" |g_CTRL-G|. При включённой опции 'ruler' позиция курсора постоянно отображается в строке состояния (это немного замедляет работу Vim).
Опытные пользователи предпочитают перемещаться в тексте при помощи кнопок hjkl, поскольку они находятся всегда под рукой. Начинающие часто предпочитают использовать кнопки управления курсором, поскольку они не в курсе, что делают кнопки hjkl. Запомнить значение этих кнопок достаточно просто: j выглядит как стрелка, указывающая вниз.
Опция 'virtualedit' позволяет перемещать курсор в положение, где отсутствуют набранные символы.
1. Перемещения и операторы
Команды для перемещения могут быть использованы после команд-операторов; в этом случае команда выполняется над фрагментом текста, над которым перемещается курсор. Иными словами, команда оператор может быть выполнена для текста, заключённого между текущим положением курсора и положением курсора после перемещения. Операторы чаще всего используются для изменения или удаления текста. В Vim имеются следующие операторы:
c | изменение |
d | удаление |
y | копирование в регистр (без изменения текста) |
~ | изменение регистра символов (при включённой опции 'tildeop') |
g~ | изменение регистра символов |
gu | перевод в нижний регистр |
gU | перевод в верхний регистр |
! | фильтрование текста с помощью внешней программы |
= | фильтрование текста с помощью 'equalprg' или выполнение форматирования отступов в стиле C, если значение указанной опции пустое |
gq | форматирование текста |
g? | кодирование текста по алгоритму ROT13 |
> | сдвиг вправо |
< | сдвиг влево |
zf | определить складку |
Если число-приставка указывается и в перемещении, и в операторе, то эти два число умножаются. Например: команда "2d3w" удаляет шесть слов.
После применения оператора курсор как правило остаётся в начале фрагмента текста, над которым производилась операция. Например, "yfe" не перемещает курсор, но "yFe" перемещает курсор влево к символу "e" от позиции, где было начато копирование.
Оператор может повлиять как на строки между двумя позициями курсора, так и на символы. Как правило, за некоторыми исключениями, те перемещения, которые изменяют строку, где находится курсор, приводят к построчному изменению текста, а перемещения, которые изменяют позицию курсора в строке, приводят к посимвольному изменению.
Посимвольное перемещение может быть включительным или исключительным. При включительном перемещении фрагмент текста, над которым производится операция, включает как начальный символ, так и конечный. При исключительном перемещении конечный символ не включается в область применения операции. Построчные перемещения всегда включают как начальную, так и конечную позиции курсора.
Далее указывается, какие перемещения являются построчными, включительными или исключительными. Имеется, однако, два основных исключения:
- Если перемещение является исключительным, а конец перемещения приходится на колонку 1, то конец перемещения переносится в конец предыдущей строки и перемещение становится включительным. Например, "}" перемещает курсор в первую строку после абзаца, однако "d}" не включает эту строку.
- Если перемещение является исключительным, конец перемещения приходится на колонку 1 и начало перемещения приходится на первый непробельный символ в строке или на символ, находящийся перед первым непробельным символом, то перемещение становится построчным. Пример: если абзац начинается с пробелов, то при выполнении команды "d}" в позиции курсора на первом непробельном символе будут удалены все строки абзаца, включая пробелы. При последующей вклейке удалённые строки будут помещены в позиции ниже текущей позиции курсора.
Замечание: обратите внимание, что в режиме ожидания оператора (когда введена команда-оператор, но еще не введено перемещение для указания на фрагмент текста, над которым должна быть произведена операция) можно использовать специальный набор привязок. Подробнее смотрите |:omap|.
Вместо последовательного ввода оператора и перемещения, можно также использовать Визуальный режим: курсор помещается в начало необходимого фрагмента текста, затем вводится команда "v", курсор перемещается в конец фрагмента и уже затем вводится команда-оператор. При этом текст между начальной и конечной позициями курсора выделяется подсветкой, так что можно наглядно видеть над каким фрагментом текста будет выполнена операция. Это позволяет чувствовать себя более свободным, но требует нажатия дополнительных кнопок и накладывает ограничения на отмену операции. См. главу о Визуальном режиме |визуальный_режим|.
В качестве перемещения можно также использовать ":"-команду. Например, "d:call FindEnd()". Но такая операция не может быть повторена с помощью ".", если команда занимает несколько строк.
Это можно повторить:
d:call search("f")<CR>
а это повторить нельзя:
d:if 1<CR>
call search("f")<CR>
endif<CR>
КАК ЗАСТАВИТЬ ПЕРЕМЕЩЕНИЕ БЫТЬ ПОСТРОЧНЫМ, ПОСИМВОЛЬНЫМ ИЛИ БЛОКОВЫМ
Если вы хотите переопределить тип перемещения, то можно использовать "v", "V" или CTRL-V сразу после оператора.
Пример:
dj
удаляет две строки
dvj
удаляет фрагмент от позиции курсора до символа, расположенного ниже курсора
d<C-V>j
удаляет символ, расположенный в позиции курсора и символ, расположенный в позиции ниже курсора.
Будьте внимательны при переопределении построчного перемещения в посимвольное или блоковое -- колонка не всегда может быть определена.
2. Перемещения курсора влево и вправо
Все эти команды перемещают курсор в необходимую колонку текущей строки. Перемещение заканчивается при достижении курсором начала или конца строки, за исключением команды "$", которая может перемещать курсор к одной из следующих строк. О том, как добиться, чтобы эти команды позволяли переходить через границы строки, читайте в справке по опции 'whichwrap'.
3. Перемещения курсора вверх и вниз
Перечисленные команды вызывают перемещение курсора в указанную строку. Перемещение заканчивается при достижении первой или последней строки. Первые две команды помещают курсор (по возможности) в той же колонке, которая была после последней команды, которая вызвала изменение текущей колонки, за исключением команды "$" -- в этом случае курсор помещается в позицию последнего символа строки.
4. Перемещения по словам
Эти команды позволяют изменять позицию курсора по словам или СЛОВАМ.
Слово состоит из последовательности букв, цифр и символов подчёркивания, а также других непробельных символов. Слова разделяются пробельными символами (пробелами, табуляцией, символами конца строки <EOL>). Символы, которые могут входить в состав слова, определяются значением опции 'iskeyword'.
СЛОВО состоит из последовательности непробельных символов. СЛОВО разделяется пробелами. Пустая строка также считается как словом, так и СЛОВОМ.
Последовательность строк в закрытой складке считается словом из одного символа. Команды "w" и "W" ("e" и "E") перемещают курсор в начало (конец) первого слова или СЛОВА после спрятанных в складке строк. Команды "b" и "B" перемещают курсор в начало первого слова или СЛОВА перед закрытой складкой.
Особый случай: команды "cw" и "cW" выполняются как "ce" и "cE", если курсор находится не на пробельном символе, поскольку "cw" это команда для "изменения слова", а слово не включает следующий за ним пробел. {Vi: если курсор находится на пробеле, за которым следуют другие пробелы, то команда "cw" изменяет только первый пробел; это, вероятно, глюк Vi, поскольку команда "dw" удаляет все пробелы}
Ещё один особый случай: если при использовании перемещения "w" совместно с оператором последнее слова, над которым произошло перемещение, находится в конце строки, то конечной позицией фрагмента текста для операции будет конец этого слова, а не первое слово следующей строки.
В Vi команда "e" реализована довольно глючно. Например, команда "e" останавливается на первом символе строки, если предыдущая строка -- пустая. Однако, этого не происходит при использовании команды "2e". В Vim команды "ee" и "2e" совершенно одинаковы, что кажется более логичным, хотя это и приводит к небольшой несовместимости между Vim и Vi.
5. Перемещения по текстовым объектам
Эти команды позволяют перемещаться между тремя видами текстовых объектов.
Предложения заканчиваются на символ '.', '!' или '?', за которым следует конец строки, пробел или табуляция. Между '.', '!' или '?' и символом конца строки, пробелом или табуляцией в предложении также может быть любое количество закрывающих ')', ']', '"' и '''. Разделители абзацев и разделов также могут быть разделителем предложения.
Если в опции 'cpoptions' присутствует флаг 'J', то после знака препинания должно быть по меньшей мере два пробела и символы <Tab> не считаются пробелом. Определение предложения изменить нельзя.
Абзац начинается после пустой строки, а также с определённого набора макросов, указанных в значении опции 'paragraphs'. Значение этой опции по умолчанию -- "IPLPPPQPP LIpplpipbp", что соответствует макросам ".IP", ".LP" и т. д. (Здесь речь идёт о макросах nroff, поэтому точка должна быть в первой колонке). Разделителем абзаца также является разделитель раздела. Замечание: это не включает '{' или '}' в первой колонке. Кроме того, пробельная строка, состоящая из одних пробелов, в отличие от пустой строки, НЕ является разделителем абзацев.
Раздел начинается после символа протяжки страницы (<C-L>) в первой колонке, а также с определённого набора макросов, указанных в значении опции 'sections'. Значение этой опции по умолчанию -- "SHNHH HUnhsh", что соответствует макросам nroff ".SH", ".NH", ".H", ".HU", ".nh" и ".sh".
Команды "]" и "[" останавливают перемещение на символах '{' и '}' в первой колонке текста. Этими командами удобно пользоваться при поиске начала и конца функции в программе на языке C. Обратите внимание, что первый символ этой команды определяет направление поиска, а второй символ -- тип скобки, которая будет найдена.
Если в вашей программе '{' или '}' не находятся в первых колонках, но вы, тем не менее, хотите использовать команды "[[" и "]]", то можете попробовать использовать такие привязки:
:map [[ ?{<CR>w99[{
:map ][ /}<CR>b99]}
:map ]] j0[[%/{<CR>
:map [] k$][%?}<CR>
[эти команды набираются как есть, см. |<>|]
6. Выделение текстовых объектов
Обсуждаемые в этом разделе команды можно использовать только в Визуальном режиме или после оператора. Команды, которые начинаются с символа "a" выделяют объект, включая пробелы, а команды, которые начинаются с символа "i" выделяют "внутренний", "inner", объект без пробелов, либо только пробелы. Таким образом, команды "внутреннего" выделения всегда выделяют меньший фрагмент текста, чем команды выделения полного объекта.
В {Vi нет этих команд}.
Эти команды доступны только в версиях Vim, в которых при компиляции была включена особенность |+textobjects|.
При использовании после оператора
Для неблоковых объектов:
- Команды, начинающиеся с "a": Оператор применяется к объекту и пробелу после объекта. Если после объекта нет пробела или курсор находится на пробеле перед объектом, то включается пробел перед объектом.
- "Внутренние" команды, начинающиеся с"i": Если курсор находится на объекте, то оператор применяется к объекту. Если курсор находится на пробеле, то оператор применяется к пробелу.
Для блоковых объектов:
- Оператор применяется к блоку, в котором находится курсор, или к блоку, к которому относятся скобки, если курсор находится на скобке. Внутренние команды, начинающиеся с "i" не включают в операцию сами скобки, а команды, начинающиеся с "a" -- включают.
При использовании в Визуальном режиме
Если начало и конец Визуальной области совпадают (как сразу после ввода команды "v"):
- Выбирается один объект, тот же что и при использовании команды совместно с оператором.
Если начало и конец Визуальной области находятся в разных позициях:
- Для неблоковых объектов область расширяется на один объект или пробелы вплоть до следующего объекта, или происходит и то и другое при выполнении команды, начинающейся с "a". Направление расширения Визуальной области зависит от позиции курсора в Визуальной области (начального и конечного). Для блоковых объектов происходит расширение выделения на один блок снаружи от выделения.
В качестве примера, приведём список команд удаления, от наименьших по величине объектов к наибольшим. Обратите внимание, что для одного символа и целой строки используются обычные команды vi.
Обратите внимание на различие между командами перемещения и объектами. Команда перемещения выполняется от текущей позиции курсора до позиции остановки перемещения. При использовании объекта команда применяется ко всему объекту целиком, независимо от позиции курсора внутри объекта. Например, сравните команды "dw" и "daw": команда "dw" удаляет символы от текущей позиции курсора до начала следующего слова, а "daw" удаляет слово в позиции курсора, включая пробелы до или после него.
7. Отметки
Прыжок к какой-либо отметке выполняется одним из двух способов:
- При помощи ` (обратной кавычки): Курсор помещается в позицию отметки. Выполняется |исключительное| перемещение.
- При помощи '(одинарной кавычки): Курсор помещается в позицию первого непробельного символа строки, содержащей указанную отметку. Выполняется построчное перемещение.
Отметки никак не видны в тексте. Это просто позиция в файле, которая запоминается редактором Vim. Не путайте отметки и именные регистры, они никак друг с другом не связаны.
'a - 'z | отметки со строчными именами, действуют в пределах одного файла |
'A - 'Z | отметки с прописными именами, действуют глобально: к такой отметке можно, например, перейти из другого файла. |
'0 - '9 | числовые отметки, устанавливаются из файла .viminfo lines: |
Vim помнит отметки, имена которых представляют собой строчные буквы, до тех пор, пока файл сохраняется в списке буферов. Если вы удалите файл из списка буферов, то все локальные отметки для этого файла также будут утрачены. Если вы удаляете строку, содержащую отметку, то эта отметка также стирается.
Для удаления отметки необходимо проделать следующее: создать новую строку, поместить в ней отметку, а затем удалить эту строку. Например, "o<Esc>mxdd". Следует, однако, иметь ввиду, что это приводит к изменению файла, причём использование "u" не помогает, поскольку команда отмены в том числе восстанавливает отметки.
Локальные отметки могут использоваться совместно с операторами. Например, "d't" удаляет строки от позиции курсора до отметки 't'. Совет: используйте отметку 't' для начала файла ("Top", "Верх"), 'b' для конца файла ("Bottom", "Низ") и т.д. Локальные отметки восстанавливаются при использовании команд отмены операции и повторного выполнения.
Отметки, имена которых представляют собой прописные буквы от 'A до 'Z, являются глобальными: помимо позиции курсора в них также запоминается имя файла {Vi: глобальных отметок нет} Глобальными отметками можно пользоваться для перемещений между файлами. Глобальная отметка могут использоваться совместно с оператором только если она определена в текущем файле. Номер строки для отметки остаётся правильным даже в том случае, если вы удаляете или добавляете строки в файле, или временно переходите к редактированию другого файла. Если опция 'viminfo' не пустая, то глобальные отметки сохраняются в файле .viminfo. См. |viminfo-глобальные_отметки|.
Отметки, имена которых являются цифрами от '0 до '9, следует рассмотреть отдельно. Их значения нельзя установить напрямую. Эти отметки применимы только если используется файл viminfo |файл_viminfo|. В отметке '0 сохраняется позиция курсора в момент, когда вы в последний раз закончили работу с Vim, в отметке '1 -- позиция курсора в момент предыдущего выхода, и т.д. Чтобы указать файлы, для которых не должны сохраняться числовые отметки, используйте флаг "r" в значении опции 'viminfo'. Подробнее см. |viminfo-глобальные_отметки|.
'[ `[ | Переход к первому символу изменённого или скопированного раннее фрагмента текста. Vi не имеет такой возможности. |
'] `] | Переход к последнему символу изменённого или скопированного раннее фрагмента текста. Vi не имеет такой возможности. |
После выполнения оператора курсор помещается в начало фрагмента текста, над которым выполнялась операция. После выполнения команды вклейки ("p" или "P"), курсор иногда помещается в первую вклеенную в текст строку, а иногда -- в позицию последнего вклеенного символа. Четыре указанные выше команды позволяют перенести курсор в другой конец фрагмента. Например: после копирования 10 строк вы хотите перейти к последней скопированной строке: "10Y']". После вклейки нескольких строк по команде "p" можно переместиться к самой нижней: "p']". Это полностью применимо к тексту, который был только что вклеен.
Замечание: после удаления текста начальная и конечная позиция курсора совпадают, за исключением режима Визуального блока. Эти команды не работают, если в текущий файл ещё не были внесены изменения.
'< `< | Переход к первому символу последнего Визуально выделенного фрагмента в текущем буфере. Vi не имеет такой возможности. |
'> `> | Переход к последнему символу последнего Визуально выделенного фрагмента в текущем буфере. Vi не имеет такой возможности. |
'' `` | Переход к позиции перед последним прыжком, либо к позиции, где была в последний раз отдана команда "m'" или "m`". Отметка не устанавливается, если была применена команда-модификатор |:keepjumps|. См. также |восстановление_позиции|. |
'" `" | Переход к позиции курсора на момент предыдущего закрытия текущего буфера. По умолчанию -- первый символ первой строки. Подробнее о том, как этим можно пользоваться для каждого открытого файла, см. |прыжок_к_последней_позиции|. Для каждого буфера запоминается только одна позиция. Она не изменяется до тех пор, пока остаётся открытым хотя бы одно окно с данным буфером. Vi не имеет такой возможности. |
'^ `^ | Переход к позиции, где курсор находился в последний момент, когда был прекращён режим вставки. Именно эта отметка используется в команде |gi|. Отметка не устанавливается, если была применена команда-модификатор |:keepjumps|. Vi не имеет такой возможности. |
'. `. | Переход к позиции, где было сделано последнее изменение. (Имеется в виду позиция в начале или около начала изменения, но иногда команда может выполнять целую серию изменений и тогда речь может идти о позиции ближе к концу внесённого изменения. Например, при вставке слова позицией, помеченной отметкой '.', будет последний символ слова.) Vi не имеет такой возможности. |
'( `( | Переход в начало текущего предложения, как по команде |(|. Vi не имеет такой возможности. |
') `) | Переход в конец текущего предложения, как по команде|)|. Vi не имеет такой возможности. |
'{ `{ | Переход в начало текущего абзаца, как по команде |{|. Vi не имеет такой возможности. |
'} `} | Переход в конец текущего абзаца, как по команде |}|. Vi не имеет такой возможности. |
Следующие команды сами по себе не являются отметками, но выполняют переходы к заданным отметкам:
8. Прыжки
"Прыжки" выполняются следующими командами: "'", "`", "G", "/", "?", "n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H", а также командами, которые начинают редактирование нового файла. Перед выполнением "прыжка" текущая позиция курсора запоминается, и к ней можно вернуться по команде "''" или "``", если только эта строка не была изменена или удалена.
Совершённые прыжки запоминаются в списке прыжков. При помощи команд CTRL-O и CTRL-I можно перемещаться к позиции курсора, соответствующей более раннему или более позднему прыжку, и назад, передвигаясь таким образом по списку прыжков. Для каждого окна существует свой собственный список прыжков. Максимальное количество прыжков, хранящихся в списке, равняется 100
Доступно только в Vim, скомпилированном с особенностью +jumplist.
Например, после трёх совершённых прыжков список прыжков может выглядеть так:
прыжок стр кол файл или текст ~
3 1 0 какой-то текст ~
2 70 0 другая строка ~
1 1154 23 конец. ~
> ~
В колонке "файл или текст" показано имя файла или текст в позиции прыжка, если этот прыжок находится в текущем файле (отступы в списке не показываются, а длинные строки обрезаются по ширине окна).
Если в данный момент курсор находится в строке 1167, то команда CTRL-O позволяет переместиться в строку 1154. Результат выглядит так:
прыжок стр кол файл или текст ~
2 1 0 какой-то текст ~
1 70 0 другая строка ~
> 0 1154 23 конец. ~
1 1167 0 что-то ещё ~
Указатель помещается в позицию последнего прыжка. Следующая команда CTRL-O использует позицию в списке, расположенную выше указателя, а команда CTRL-I -- позицию ниже указателя. Если указатель находится ниже последней позиции в списке, то это значит, что команды CTRL-O или CTRL-I ещё не использовались.
В данном случае команда CTRL-O добавляет текущую позицию курсора (строку 1167) к списку прыжков, чтобы можно было вернуться к ней по команде CTRL-O.
Последующие команды CTRL-O позволяют переместиться к строкам 70 и 1. При помощи команды CTRL-I можно затем опять вернуться к строкам 1154 и 1167. Обратите внимание, что число в колонке "прыжок" можно указывать в виде числовой приставке в командах CTRL-O и CTRL-I для перехода в нужную позицию.
При использовании команды прыжка текущая позиция курсора добавляется в конец списка прыжков. Если такая строка уже присутствует в списке прыжков, то она удаляется. Поэтому, при повторном вводе команды CTRL-O в прежнюю позицию можно вернуться только один раз.
При использовании команды-модификатора |:keepjumps|, прыжки не сохраняются в списке прыжков.
После выполнения команды CTRL-O, приводящей к прыжку в строку 1154, можно выполнить другую команды прыжка, например "G", и список прыжков будет соответствующим образом изменён:
прыжок стр кол файл или текст ~
4 1 0 какой-то текст ~
3 70 0 другая строка ~
2 1167 0 что-то ещё ~
1 1154 23 конец. ~
> ~
Номера строк соответствующим образом изменяются при удалении или вставке строк, если только вы не заканчиваете редактирование файла без записи изменений, как например по команде ":n!".
При разделении окна список прыжков копируется в новое окно.
Если в списке значений опции 'viminfo' указан элемент ', то список прыжков сохраняется в файле viminfo и восстанавливается при запуске Vim.
ПРЫЖКИ ПО СПИСКУ ИЗМЕНЕНИЙ
При внесении изменений позиция курсора запоминается. Для каждого изменения, не подлежащего отмене, запоминается позиция курсора, кроме случаев, когда эта позиция находится рядом с позицией предыдущего изменения. Для перемещения к позициям внесения изменений, в том числе тех, которые не могут быть отменены, используется две команды:
При использовании числа-приставки вы можете отправиться так далеко назад или вперёд в списке изменений, как пожелаете. Чтобы переместиться к самому первому изменению, позиция которого всё ещё сохраняется в памяти, можно использовать заведомо очень большое число, например "999g;". Количество записей в списке изменений жестко ограничено и по величине точно такое же, как и в |списке_прыжков|.
Если в одной строке имеется два изменения, которые можно отменить, и колонки, в которых произошли эти изменения, отстоят друг от друга на величину, меньшую чем значение опции 'textwidth', то запоминается только последнее изменение. Это позволяет избежать внесения лишних записей в список изменений, когда имеется последовательность небольших изменений в строке, например, при вводе "xxxxx". Если значение опции 'textwidth' равно 0, то используется значение опции 'wrapmargin'. Если же и значение опции 'wrapmargin' равно 0, то используется фиксированное значение 79. Подробность: при вычислениях используется длина в байтах, а не в символах, чтобы избежать потери производительности (имеет значение только при использовании мультибайтных кодировок).
Обратите внимание, что при вставке или удалении текста позиция курсора может отличаться от позиции внесения изменения. Особенно это касается удаления строк.
При использовании команды-модификатора |:keepjumps|, позиция внесения изменения не запоминается.
9. Различные перемещения
% |
Найти один из указанных ниже элементов в позиции курсора или после неё и перейти к его соответствию. Это |включительное| перемещение. Элементы могут быть следующими:
Для других элементов можно использовать модуль matchit, см. |matchit-установка|. Если значение опции 'cpoptions' содержит "M" |cpo-M|, то символы обратной косой черты перед круглыми и квадратными скобками игнорируются. Без флага "M" количество символов обратной косой начинает иметь значение: чётное число не соответствует нечётному числу. Таким образом, в "( \) )" и "\( ( \)" соответствовать будут первая и последняя скобки. Если символ '%' не указан в списке значений опции cpoptions' |cpo-%|, то скобки внутри двойных кавычек также игнорируются, за исключением тех случаев, когда число скобок в строке нечётное и данная строка, а также предыдущая строка, не заканчиваются на обратную косую черту. '(', '{', '[', ']', '}' и ')' (скобки внутри одинарных кавычек) также игнорируются. Замечание: это хорошо для C, но не для Perl, где строки могут быть заключены в одинарные кавычки. Числовая приставка в этой команде не применяется (команда {число}% выполняет прыжок к строке, расположенной в указанном {числе} процентов от начала текста |N%|). Использование '%' для перемещения по соответствующим #if/#else/#endif выполняет построчное перемещение. |
||||
[( | Перейти к предыдущей незакрытой '('. [число] указывает на количество перемещений. Это |исключительное| перемещение. Vi не имеет такой возможности. |
||||
[{ | Перейти к предыдущей незакрытой '{'. [число] указывает на количество перемещений. Это |исключительное| перемещение. Vi не имеет такой возможности. |
||||
]) | Перейти к следующей незакрытой ')'. [число] указывает на количество перемещений. Это |исключительное| перемещение. Vi не имеет такой возможности. |
||||
]} | Перейти к следующей незакрытой '}'. [число] указывает на количество перемещений. Это |исключительное| перемещение. Vi не имеет такой возможности. |
Указанные выше четыре команды позволяют перемещаться в начало или конец текущего блока в коде программы. Они похожи на выполнение команды "%" для '(', ')', '{' и '}' в конце блока, но их можно выполнять в любом месте блока, что может быть очень полезно при редактировании исходного текста программ на языке C. Например, если курсор находится где-нибудь на "case x:", то команда "[{" перемещает курсор назад к слову "switch".
]m | Перейти к следующему началу метода в Java-подобном коде (можно использовать [число] для указания номера метода). Если курсор находится не перед началом метода, то перейти к началу или концу класса. Это |исключительное| перемещение. Vi не имеет такой возможности. |
]M | Перейти к следующему концу метода в Java-подобном коде (можно использовать [число] для указания номера метода). Если курсор находится не перед концом метода, то перейти к началу или концу класса. Это |исключительное| перемещение. Vi не имеет такой возможности. |
[m | Перейти к предыдущему началу метода в Java-подобном коде (можно использовать [число] для указания номера метода). Если курсор не находится после начала метода, то перейти к началу или концу класса. Это |исключительное| перемещение. Vi не имеет такой возможности. |
[M | Перейти к предыдущему концу метода в Java-подобном коде (можно использовать [число] для указания номера метода). Если курсор не находится после конца метода, то перейти к началу или концу класса. Это |исключительное| перемещение. Vi не имеет такой возможности. |
При использовании указанных выше команд предполагаются, что в файле содержатся описания класса с методами. Определения класса заключаются в скобки '{' и '}'. Каждый метод в классе также заключается в скобки '{' и '}'. Так устроен синтаксис языка Java. Файл с кодом на этом языке выглядит примерно так:
// comment
class foo {
int method_one() {
body_one();
}
int method_two() {
body_two();
}
}
Если курсор находится на слове "body_two()", то по команде "[m" будет совершено перемещение к '{' в начале "method_two()" (конечно, если описание метода в нашем примере было бы длиннее, то это было бы намного более полезное перемещение!). Команда "2[m" перемещает курсор в начало "method_one()". Команда "3[m" перемещает курсор в начало класса.
[# | перейти к предыдущему (можно также использовать [число]) незакрытому "#if" или "#else". Это |исключительное| перемещение. Vi не имеет такой возможности. |
]# | перейти к следующему (можно также использовать [число]) незакрытому "#else" или "#endif". Это |исключительное| перемещение. Vi не имеет такой возможности. |
Эти команды хорошо работают с текстом программ на языке C, в которых применяются конструкции #if/#else/#endif. Они перемещают курсор в начало или конец #if/#else/#endif, включающих текущую строку. Для перехода к следующей соответствующей строке можно использовать "%".