РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар
Перед тем, как вставлять или удалять текст, курсор должен быть перемещён в требуемое положение. В Vim имеется большое количество команд для позиционирования курсора. Эта глава показывает как использовать наиболее важные команды такого рода. Список этих команд можно посмотреть здесь Влево-вправо.
03.1 Перемещение по словам
03.2 Перемещение в начало и конец строки
03.3 Перемещение к символу
03.4 Поиск соответствия для скобки
03.5 Перемещение к заданной строке
03.6 Выяснение местонахождения в тексте
03.7 Прокрутка
03.8 Простые примеры поиска
03.9 Простые примеры поиска по шаблону
03.10 Использование отметок
Следующая глава: Внесение небольших изменений
Предыдущая глава: Первые шаги в Vim
Содержание: Руководство пользователя Vim
03.1 Перемещение по словам
Для перемещения курсора на одно слово вперед, используйте команду "w" (word, слово). Как и большинство других команд Vim, она может принимать числовую приставку для указания на перемещение на несколько слов. Например, "3w" перемещает курсор на три слова вперёд. Вот как это работает:
Это строка с текстом примера перемещения по словам ~
--->------>->--------------------------->
w w w 3w
Обратите внимание, что "w" перемещает курсор к началу следующего слова, даже если курсор уже находится в начале слова.
Команда "b" (back, назад) перемещает курсор назад к началу предыдущего слова:
Это строка с текстом примера перемещения по словам ~
<---<------<-<---------------<-----
b b b 2b b
Имеется также команда "e" (end, конец), которая перемещает курсор к следующему концу слова, и команда "ge", которая перемещает курсор к предыдущему концу слова:
Это строка с текстом примера перемещения по словам ~
<- <--- ------------> ->
ge ge e e
Если вы находитесь на последнем слове в строке, то команда "w" переместит курсор к началу первого слова на следующей строке. Таким образом можно перемещаться по абзацу текста значительно быстрее, чем с использованием "l". "b" ведёт себя аналогично, но в обратном направлении.
Слово заканчивается на не-словарном символе, таком, как ".", "-" или ")". Для изменения правил, по которым Vim определяет что именно является словом, смотрите пояснения к опции 'iskeyword'.
Также возможно перемещение по СЛОВАМ, разделённым пробелами. Такие СЛОВА не являются словами в прямом смысле слова, поэтому используются прописные буквы. Команды для перемещения по СЛОВАМ также даются прописными буквами, как показано ниже:
ge b w e
<-- <- -----> -->
Пример стро-ки с текстом, со специальным/разделением/слов (и ещё кое-что). ~
<-------- <-------- -----------------------> -------->
gE B W E
При помощи этих команд из строчных и прописных букв вы можете быстро перемещаться вперёд и назад по тексту абзаца.
03.2 Перемещение в начало и конец строки
Команда "$" перемещает курсор в конец строки. Если на вашей клавиатуре есть кнопка <End>, то она выполняет ту же самую операцию.
Команда "^" перемещает курсор к первому непробельному символу строки. Команда "0" перемещает курсор к самому первому символу строки. Кнопка <Home> работает как команда "0". Покажем это на примере:
^
<--------------
.....Это строка с текстом примера ~
<------------------- ---------->
0 $
(здесь ..... обозначает пробелы).
Команда "$" может принимать числовую приставку, как и большинство команд перемещения. Однако, перемещение к концу строки несколько раз было бы бессмысленной операцией. Вместо этого, числовая приставка заставляет редактор переместить курсор к концу другой строки. Например, "1$" перемещает к концу текущей (первой) строки, "2$" к концу следующей строки и т.д.
Команда "0" не принимает числовой приставки, поскольку тогда сам "0" был бы частью числовой приставки. Использование числа с "^" не производит никакого эффекта.
03.3 Перемещение к символу
Одна из самых полезных команд перемещения это команда односимвольного поиска. Команда "fx" (find, искать) ищет символ x в строке вперёд, начиная с текущей позиции курсора.
Например, поместите курсор в начало следующей строки. Предположим, что вы хотите переместиться к символу Р слова Репина. Для этого просто выполните команду "fР", и курсор будет находиться над символом Р:
Картина Репина: "Кощей Бессмертный слушает кукушку." ~
-------->------------>
fР fй
Команда "fй" перемещает курсор в конец слова Кощей.
Эта команда также принимает числовую приставку. К началу слова слушает можно переместиться по команде "3fс":
Картина Репина: "Кощей Бессмертный слушает кукушку." ~
--------------------------->
3fс
Команда "F" ищет слева от текущего положения курсора:
Картина Репина: "Кощей Бессмертный слушает кукушку." ~
<---------------------------
FР
Команда "tx" (to, к) работает также, как и команда "fx", но перемещает курсор в позицию ПЕРЕД символом поиска. Обратная версия этой команды -- "Tx".
Картина Репина: "Кощей Бессмертный слушает кукушку." ~
<------------------- --------->
TР tт
Эти четыре команды можно повторять при помощи команды ";". "," осуществляет повторение в обратном направлении. Курсор при этом не покидает текущей строки, даже если предложение не закончено.
Иногда, начав операцию поиска, вы обнаруживаете, что команда отдана с ошибкой. Например, вы отдаёте команду "f", но на самом деле хотите провести поиск в обратном направлении. Для прекращения поиска, нажмите <Esc>. Таким образом, "f<Esc>" является прерванной командой поиска и ничего не делает. Замечание: <Esc> прерывает выполнение многих операций, а не только поиска.
03.4 Поиск соответствия для скобки
При написании программ часто приходится создавать конструкции со вложенными скобками. Команда "%" оказывается в этих случаях весьма кстати: она перемещает курсор к соответствующей скобке. Если курсор находится на "(", то эта команда перемещает его на соответствующую ")". Если курсор находится на ")", то команда "%" перемещает курсор на соответствующую ")".
%
<----->
if (a == (b * c) / d) ~
<---------------->
%
То же самое работает и для пар [] и {}. (Список соответствий можно определить при помощи опции 'matchpairs').
Если курсор не находится на подходящем символе, то "%" сначала будет искать вперёд по тексту в строке, пока не найдёт таковой. Например, если курсор находится в начале строки, то "%" найдёт первую "(" и переместится к её паре:
if (a == (b * c) / d) ~
---+---------------->
%
03.5 Перемещение к заданной строке
Если вы программируете на C или C++, то вам должны быть знакомы такие сообщения об ошибках:
prog.c:33: j undeclared (first use in this function) ~
Это говорит вам о том, что необходимо что-то исправить на строке 33. Так как же вам найти эту строку 33? Можно набрать "9999k", чтобы перейти к началу файла и затем "32j", чтобы опуститься вниз на 32 строки. Это работает, но это не самый лучший способ. Гораздо лучше пользоваться командой "G" (go, иди). С числовой приставкой эта команда переносит вас к заданной строке. Например, "33G" перемещает курсор на строку 33. (Ниже рассматривается еще более удобный способ разбора списка ошибок, выданных компилятором. См. информацию о команде :make в Редактирование программ).
Без числовой приставки, "G" позиционирует курсор в самом конце файла. Для быстрого перехода к началу файла используйте "gg". "1G" делает то же самое, но требует чуть больше усилий при наборе.
| первая строка файла ^
| текст текст текст текст |
| текст текст текст текст | gg
7G | текст текст текст текст |
| текст текст текст текст
| текст текст текст текст
V текст текст текст текст |
текст текст текст текст | G
текст текст текст текст |
последняя строка файла V
Другой способ заключается в использовании команды "%" с числовой приставкой. Например, "50%" перемещает в середину файла, "90%" перемещает курсор ближе к концу.
Предыдущие примеры предполагают, что вы хотите переместиться к строке в файле независимо от того, видна она в данный момент на экране или нет. Но что если вы хотите переместиться к одной из строк, видимых на экране? На иллюстрации показаны три команды, которые можно для этого использовать:
+---------------------------+
H --> | текст пример текст |
| пример текст |
| текст пример текст |
| пример текст |
M --> | текст пример текст |
| пример текст |
| текст пример текст |
| пример текст |
L --> | текст пример текст |
+---------------------------+
(H - Home, домой; M - Middle, середина; L - Last, последний).
03.6 Выяснение местонахождения в тексте
Посмотреть точную позицию курсора в файле можно тремя способами:
1. При помощи команды CTRL-G. При этом вы получите сообщение, похожее на это (при выключенной опции 'ruler'):
"usr_03.txt" стр 238 из 693 --34%-- кол 45-52 ~
В сообщении показано имя файла, который в данный момент редактируется, номер строки, в которой находится курсор, общее количество строк, процентное отношение объема текста до курсора ко всему файлу, и колонка, в которой расположен курсор.
Иногда номер колонки показан в виде двух чисел. Например, "кол 2-9". Это означает, что курсор находится на втором символе в строке, но поскольку один из символов является символом табуляции, занимающим восемь экранных символов, то номер экранной колонки равен 9.
2. Включите опцию 'number'. Эта опция включает показ номеров строки перед каждой строкой:
:set number
Для выключения номеров строк пользуйтесь командой:
:set nonumber
Поскольку 'number' является булевой опцией, то добавление "no" к её имени выключает её. Булева опция может иметь только два значения, on (вкл.) или off (выкл.).
В Vim есть много опций. Помимо булевых опций, есть также опции, принимающие числовые и строковые значения. Вы еще увидите примеры употребления опций.
3. Включите опцию 'ruler'. Это позволит отображать позицию курсора в нижнем правом углу окна Vim:
:set ruler
Использование опции 'ruler' имеет то преимущество, что такая "линейка" не занимает много места, тем самым оставляя больше экранного места для самого текста.
03.7 Прокрутка
Команда CTRL-U (Up, вверх) прокручивает текст в окне на половину высоты вниз. Представьте, что вы смотрите на текст сквозь окно и перемещаете это окно вверх на половину высоты этого окна. При этом текст в окне смещается вниз. Запутались, что значит верх и что значит низ? Ничего страшного, большинство пользователей испытывают ту же самую проблему.
Команда CTRL-D (Down, вниз) перемещает окно просмотра на половину высоты вниз, таким образом сам текст перемещается вверх.
+----------------+
| какой-то текст |
| какой-то текст |
| какой-то текст |
+----------------+ | какой-то текст |
| какой-то текст | CTRL-U --> | |
| | | 123456 |
| 123456 | +----------------+
| 7890 |
| | +----------------+
| пример | CTRL-D --> | 7890 |
+----------------+ | |
| пример |
| пример |
| пример |
| пример |
+----------------+
Для прокрутки на одну строку используйте CTRL-E (прокрутка вверх) и CTRL-Y (прокрутка вниз). Запомнить очень легко: CTRL-E показывает Ещё одну строку. (Если у вас совместимая с MS-Windows таблица привязки клавиш, то CTRL-Y будет повторять отменённую команду вместо прокрутки.)
Для прокрутки вперёд на целый экран (за вычетом двух строк) используйте CTRL-F (Forward, вперёд). Для прокрутки назад используйте команду CTRL-B (Backward, назад).
Часто бывает так, что после перемещения вниз на несколько строк курсор оказывается внизу экрана. Если вы желаете посмотреть соседние строчки, то можно использовать команду "zz".
+-------------------+ +-------------------+
| какой-то текст | | какой-то текст |
| какой-то текст | | какой-то текст |
| какой-то текст | | какой-то текст |
| какой-то текст | zz --> | строка с курсором |
| какой-то текст | | какой-то текст |
| какой-то текст | | какой-то текст |
| строка с курсором | | какой-то текст |
+-------------------+ +-------------------+
Команда "zt" помещает строку с курсором наверху окна (top, верх), а "zb" внизу (bottom, низ). Существует также еще несколько команд для прокрутки, см. Прокрутка. Если вы желаете всегда оставлять несколько строк рядом с курсором, то воспользуйтесь опцией 'scrolloff'.
03.8 Простые примеры поиска
Чтобы найти строку, используйте команду "/строка". Например, для поиска слова include, используйте команду:
/include
Обратите внимание, что при вводе "/" курсор перемещается в последнюю строку экрана Vim, подобно команде, начинающейся с двоеточия. В нижней строке вы можете набрать строку для поиска, используя кнопку <BS>, если понадобится внести исправления. Кнопки перемещения курсора <Left> и <Right> также работают, как им и полагается.
Нажатие <Enter> выполнит команду.
Замечание: Символы .*[]^%/\?~$ имеют специальное значение. Если вы хотите использовать их в строке поиска, то перед каждым их них следует помещать символ \. См. ниже.
Чтобы найти следующее вхождение той же строки, используйте команду "n" (next, следующий). Воспользуйтесь этим, чтобы найти первый #include после курсора:
/#include
Затем нажмите "n" несколько раз. Вы будете перемещаться от #include к #include в тексте. Также, можно использовать числовую приставку, если вы знаете, какое именно соответствие вам нужно. "3n" отыщет третье соответствие. Числовые приставки с "/" не работают.
Команда "?" работает аналогично "/", но осуществляет поиск в обратном направлении:
?слово
Команда "N" повторяет последний поиск в обратном направлении. То есть, "N" после команды "/" ищет назад, а после команды "?" ищет вперёд.
РЕГИСТРОНЕЗАВИСИМЫЙ ПОИСК
В обычных условиях вы должны набрать именно то, что хотели бы найти, с учётом регистра символов. Если вам не так важно прописная буква в слове или строчная, то включите опцию 'ignorecase':
:set ignorecase
Если вы теперь повторите поиск для "слово", то команда поиска также найдёт и "Слово" и "СЛОВО". Чтобы снова обращать внимание на регистр символов в поиске, наберите
:set noignorecase
ИСТОРИЯ
Предположим, вы выполнили три поиска:
/один
/два
/три
Теперь, давайте попробуем начать поиск с простого набора "/" без нажатия <Enter>. Если нажать кнопку курсора <Up>, то Vim поместит в командную строку "/три". Нажав <Enter> в этом месте вы заставите Vim искать слово три. Если же вместо <Enter> вы еще раз нажмёте <Up>, то Vim поместит в командную строку "/два". Еще одно нажатие <Up> приведёт к появлению в строке "/один".
Точно так же для перемещения по истории команд поиска в обратном направлении можно пользоваться кнопкой курсора <Down>.
Если вы знаете с чего начинается шаблон поиска, использованный раннее, и хотите вновь использовать его, то наберите начало шаблона перед нажатием <Up>. В предыдущем примере набор "/о<Up>" приведёт к появлению "/один" на командной строке.
Команды, начинающиеся с ":" также имеют свою историю. Это позволяет вам быстро перейти к использованной раннее команде и выполнить её. Эти две истории не связаны друг с другом.
ПОИСК СЛОВА В ТЕКСТЕ
Предположим, вы видите слово "TheLongFunctionName" в тексте и хотите найти следующее появление этого слова в тексте. Для этого можно набрать "/TheLongFunctionName", но это потребует слишком много времени. К тому же в длинных словах легко допустить ошибку.
Есть более простой способ: Поместите курсор на слово и используйте команду "*". Vim подберёт слово под курсором и будет использовать его в качестве строки для поиска.
Команда "#" делает то же самое в противоположном направлении. Вы также можете добавить числовую приставку: "3*" найдет третье упоминание слова под курсором в тексте.
ПОИСК ЦЕЛЫХ СЛОВ
Если вы наберёте "/три", то это также будет находить "триста". Чтобы найти все слова, которые заканчиваются на "три", используйте
/три\>
"\>" является специальной пометкой, соответствующей только концу слова. Аналогично, "\<" соответствует только началу слова. Поэтому, чтобы найти
только "три", набирайте
/\<три\>
Этот поиск не будет включать слова "триста" или "сотри". Обратите внимание, что команды "*" и "#" используют эти пометки "начала слова" и "конца слова" для поиска только целых слов (для поиска частичных совпадений можно использовать команды "g*" и "g#").
ПОДСВЕТКА СОВПАДЕНИЙ
Представьте, что вы редактируете программу и хотите посмотреть, где используется переменная "nr". Для этого можно подвести курсор к "nr" и использовать команду "*" в сочетании с "n", чтобы просмотреть все появления этого слова в тексте.
Есть еще один способ. Наберите команду
:set hlsearch
Если вы еще раз проведёте поиск "nr", то Vim выполнит подсветку всех совпадений. Это очень удобно для того, чтобы посмотреть, где используется переменная, без необходимости ввода команд поиска.
Для отключения подсветки наберите
:set nohlsearch
Вам потребуется вновь включить эту опцию, если вы захотите использовать её с последующей командой поиска. Если вам нужно только убрать текущую подсветку, то воспользуйтесь командой
:nohlsearch
Эта команда не изменяет значения опции, а просто временно отключает подсветку. Как только вы снова будете что-нибудь искать, подсветка вновь появится на экране. Это же самое касается и команд "n" и "N".
НАСТРОЙКА ПОИСКА
Существует несколько опций, изменяющих особенности работы поиска. Вот самые основные:
:set incsearch
Заставляет Vim показывать соответствие строке во время набора строки поиска. Это можно использовать для проверки нахождения правильного соответствия. <Enter> позволит перейти к фактическому месту, где находится искомая строка, либо вы можете продолжить набор для изменения строки поиска.
:set nowrapscan
Останавливает поиск в конце, или, если вы ищете назад, в начале файла. Опция 'wrapscan' включена по умолчанию, иными словами, при достижении того или иного конца файла поиск продолжается с другого конца.
ОТСТУПЛЕНИЕ
Если вам понравились опции, о которых рассказывалось выше, и вы хотите, чтобы они были включены каждый раз, когда вы используете Vim, то можно поместить их в файл инициализации Vim.
Для этого отредактируйте файл, как это показано в разделе несовместимость. Или используйте следующую команду для поиска файла инициализации:
:scriptnames
Отредактируйте файл, например так:
:edit ~/.vimrc
Затем, добавьте к файлу строку с командой включения опции, как если бы вы набирали её в Vim. Например:
Go:set hlsearch<Esc>
"G" переходит к концу файла, "o" открывает новую строку, в которой вы записываете свою команду ":set". Завершить режим Вставки можно нажатием <Esc>. После этого сохраните изменения в файле:
ZZ
Теперь, если вы снова запустите Vim, то опция 'hlsearch' будет установлена.
03.9 Простые примеры поиска по шаблону
Редактор Vim использует для указания предмета поиска регулярные выражения. Регулярные выражения являются чрезвычайно мощным и компактным средством для указания шаблонов поиска. К сожалению, эту силу они обретают ценой сложности для понимания.
В этом разделе мы упомянем только некоторые самые важные выражения. Более подробно о шаблонах и командах поиска рассказывается в главе 27. Полное объяснение можно прочитать здесь: шаблон.
НАЧАЛО И КОНЕЦ СТРОКИ
Символ ^ соответствует началу строки. На любой американской клавиатуре этот символ расположен над цифрой 6. Шаблон "include" соответствует слову include в любом месте строки, в то время как шаблон "^include" будет соответствовать слову include только в том случае, если оно находится в начале строки.
Символ $ соответствует концу строки. Таким образом, "этот$" будет соответствовать слову этот только в том случае, если оно находится в конце строки.
Давайте отметим места, где есть слово "не" в строке внизу с помощью "x":
не говорите, что не нужно делать, и я не ~
xx xx xx
"/не$" позволит найти следующее соответствие:
не говорите, что не нужно делать, и я не ~
xx
а "/^не" следующее:
не говорите, что не нужно делать, и я не ~
xx
Если вы будете искать по шаблону "/^не$", то будут найдены только строки, которые состоят из слова "не". Имейте в виду, что пробелы учитываются, так что если после слова "не" есть пробел, то шаблон его не обнаружит.
СООТВЕТСТВИЕ ЛЮБОМУ ОДИНОЧНОМУ СИМВОЛУ
Точка . соответствует любому одиночному символу. Например, шаблон "а.о" будет соответствовать строке, начинающейся с а, с любым последующим символом и о в качестве третьего символа. Например:
Ищу работу, не связанную с таковой ~
xxx xxx
СООТВЕТСТВИЯ ДЛЯ СПЕЦИАЛЬНЫХ СИМВОЛОВ
Но что если вы хотите найти соответствие самой точке? В этом случае необходимо ликвидировать её особый смысл, поместив в шаблоне обратную косую черту перед ней.
Если вы будете искать "е..", то в примере ниже найдете следующие соответствия:
Чук от Гека недалеко падает. ~
xxx xxx xxx xxx
а поиск для "е.\." покажет только последнее соответствие.
03.10 Использование отметок
Когда вы совершаете переход при помощи команды "G", то Vim запоминает позицию, с которой этот переход совершён. Эта позиция называется отметкой.
Замечание: в русском переводе принята следующая терминология -- mark переводится как "отметка", а tag как "метка". Эти понятия не следует путать.
Для возврата к месту, откуда совершён переход воспользуйтесь командой
``
` это символ открывающей одинарной кавычки.
При использовании этой команды повторно, вы вновь вернётесь к месту перехода. Это происходит потому, что ` сама по себе является командой перехода, при этом запоминается позиция, откуда совершён переход.
Как правило, всякий раз, когда вы выполняете команду, вызывающую перемещение за пределы строки, это называется прыжком. Это включает команды "/" и "n" (независимо от того, насколько далеко находится соответствие). Это не относится, однако, к командам поиска "fx" и "tx", а также командам перемещения по словам "w" и "e".
Кроме того, "j" и "k" также не считаются прыжком, даже в тех случаях, когда вы перемещаетесь довольно далеко от исходной строки при помощи числовой приставки.
Команда `` позволяет перемещаться взад и вперёд между двумя отмеченными точками. Команда CTRL-O перемещает к старым позициям (older, более старый). CTRL-I позволяет перемещаться к более новым позициям (I находится на клавиатуре рядом с O). Представьте следующую последовательность команд:
33G
/^Команда
CTRL-O
Сначала происходит прыжок к строке 33, затем поиск строки, начинающейся со слова "Команда". CTRL-O совершает прыжок назад к строке 33. Следующее CTRL-O возвращает курсор на исходную позицию. Если после этого воспользоваться CTRL-I, то будет совершён прыжок назад на строку 33. Последующее CTRL-I позволит вернуться на позицию со словом "Команда".
| пример текста ^ |
33G | пример текста | CTRL-O | CTRL-I
| пример текста | |
V стр 33 текст ^ V
| пример текста | |
/^Ком | пример текста | CTRL-O | CTRL-I
V Команда редак | V
пример текста
Замечание: CTRL-I это тоже самое, что и <Tab>.
Команда ":jumps" показывает список всех позиций, к которым вы прыгали. Последний прыжок отмечен в списке ">".
ИМЕННЫЕ ОТМЕТКИ
Vim позволяет помещать в тексте ваши собственные отметки. Команда "ma" отмечает место под курсором как отметку a. Вы можете поместить в тексте до 26 отметок (с именами от a до z). Сами отметки невидимы, это всего-навсего позиции, который помнит Vim.
Для перехода к отметке используйте команду `{отметка}, где {отметка} обозначает букву имени отметки. Чтобы перейти, например, к отметке a, введите
`a
Команда '{отметка} (апостроф) перемещает вас к началу строки, содержащей отметку. Это отличается от команды `{отметка}, которая перемещает в необходимую колонку, где находится отметка.
Отметки могут быть чрезвычайно полезными, когда нужно работать над двумя связанными частями файла. Предположим, что у вас есть текст, расположенный вначале файла, к которому вам нужно часто обращаться по мере редактирования.
Переместите курсор к тексту в начале файла и поместите там отметку s (start):
ms
Затем перейдите к тексту, над которым вы работаете и поместить там метку e (end):
me
Теперь вы можете перемещаться по тексту как угодно, но когда вам потребуется обратиться к началу файла, то для прыжка достаточно воспользоваться командой
's
После этого, для возврата к предыдущей позиции можно пользоваться '', или 'e для перехода к тексту, над которым вы работали в конце.
В использование s и e для имён отметок нет ничего особенного, просто такие имена проще запомнить.
Для получения списка отметок воспользуйтесь командой
:marks
Вы заметите, что в списке присутствует несколько специальных отметок. Помимо всего прочего, это:
' Позиция курсора перед прыжком
" Позиция курсора в последней редакции файла
[ Начало последнего изменения
] Конец последнего изменения
Следующая глава: Внесение небольших изменений
Авторские права: см. Авторские права