Текстовый редактор vi
Vi может находиться в одном из двух режимов - командном режиме или режиме ввода. При запуске редактор начинает работу в командном режиме. В этом случае все, что вы набираете на клавиатуре, интерпретируется как команда. Команды в vi короткие - почти все состоят из одной или двух букв. Некоторые команды редактора vi отображаются в служебной строке. Служебной строкой в vi считается последняя строка экрана. Большинство команд редактора никак не отображаются, хотя выполняются. Это не очень удобно, если у пользователя дрожат руки, или он не помнит, какую клавишу только что нажал. Так можно легко стереть или модифицировать текст неожиданным образом. Старайтесь не допускать случайных нажатий на клавиши в командном режиме!
Vi отображает вводимую команду в служебной строке, если это команда поиска, или если команда вводится в режиме совместимости с редактором ed. При отображении чего-либо в служебной строке экрана строка файла, которая раньше показывалась в этой строке, никак не меняется.
Для перехода в режим ввода дайте команду a, i или o. После этого можно будет начинать ввод текста. Текст начнет соответственно вводиться в позиции курсора, в позиции, следующей за позицией курсора, или в начале новой строки, которая появится под текущей строкой. В режиме ввода все клавиши, которые набираются на клавиатуре, за исключением клавиши <Esc>, интерпретируются как набираемый текст. <Esc> - это переход из режима ввода в режим команд.
В режиме ввода не всегда можно пользоваться клавишами передвижения по тексту (стрелками, PgUp, PgDn, Home, End и т.д.). Если терминал настроен не совсем корректно, то нажатие, например, клавиши "стрелка вверх", vi может воспринять как нажатие <Esc>, за которым следует [B. Поэтому может случиться так, что нажав стрелку "вверх" в режиме ввода, вы незаметно для себя перейдете в режим команд. Если вы продолжите ввод текста, он будет воспринят как команда. Таким образом, иногда можно передвигаться по тексту в режиме ввода, но лучше сначала выйти в командный режим, затем перейти по тексту в нужное место и снова перейти в режим ввода.
Переход по тексту в командном режиме выполняется клавишами передвижения по тексту (стрелками, PgUp, PgDn, Home, End), а также нажатием <Ctrl-F> (forward, вперед на страницу), <Ctrl-B> (backward, назад на страницу). Бывает, что клавиши-"стрелки" не работают. Тогда можно использовать вместо них клавиши h, j, k, l следующим образом:
Рис. 2.4.
Эти клавиши были выбраны только потому, что они расположены рядом; буквы h, j, k и l не соотносятся с английскими словами, которые можно было бы ассоциировать с передвижениями вверх-вниз, вправо-влево.
В таблице 2.2 перечислены основные команды редактора vi. Полный список можно посмотреть в руководстве по vi (man vi) или в книгах Арнольда Роббинса (Arnold Robbins) "Vi Pocket Reference"1) и "Learning the vi Editor".
начало ввода | |||
a | перейти в режим ввода, начать ввод в позиции, следующей за позицией курсора | ||
i | перейти в режим ввода, начать ввод в позиции курсора | ||
o | перейти в режим ввода, добавить пустую строку под текущей строкой и начать ввод в новой строке | ||
операции с буфером | |||
dd | вырезать текущую строку в буфер | ||
x | вырезать текущий символ в буфер | ||
u | отменить последнее действие | ||
yy | копировать текущую строку в буфер | ||
p | вставить строку из буфера под текущей | ||
замена символа | |||
rn | заменить символ в позиции курсора на n | ||
перемещение по тексту | |||
0 | перейти в начало строки | ||
$ | перейти в конец строки | ||
j | перейти на сроку вниз | ||
k | перейти на сроку вверх | ||
h | перейти на символ влево | ||
l | перейти на символ вправо | ||
% | если курсор стоит в позиции символа "скобка" (круглая, квадратная или фигурная), перейти в позицию соответствующей второй скобки | ||
Ctrl-G | показать текущую позицию (номер строки) в файле | ||
поиск и замена | |||
/ | поиск вперед | ||
? | поиск назад | ||
:s/что/на что/[g] | поиск и замена | ||
запись и завершение редактирования | |||
ZZ :q |
выход из редактора, запись файла выйти из редактора | ||
:q! | выйти без записи | ||
:w | записать изменения | ||
:wq | записать и выйти | ||
:w! | записать, даже если нет права записи в файл (срабатывает, только если выполнена от имени root) | ||
:w | имя файла записать в файл с другим именем; в дальнейшем будет считаться, что редактируется именно этот файл с другим именем | ||
<Esc> | переход в командный режим |
Все команды, начинающиеся с двоеточия, - это команды режима совместимости с редактором ed. Ввод двоеточия интерпретируется vi как переход к этому режиму. Как только вы введете двоеточие, оно отобразится в начале служебной строки, и оставшуюся часть команды вы будете набирать, видя ее в этой строке. В качестве служебной строки используется последняя строка экрана.
Перед любой командой vi, где это имеет смысл, за исключением команд, начинающихся с двоеточия, можно набрать число, которое будет указывать, сколько раз требуется повторить идущую за ним команду. Например,
15dd
означает, что нужно вырезать в буфер пятнадцать строк, начиная с текущей.
Важная часть команд - команды поиска и замены. Обычный поиск выполняется командой /образец, т.е. знак "слэш", за которым следует образец для поиска. При поиске назад по файлу вместо слэша используется вопросительный знак. Для продолжения поиска ставится слэш или вопросительный знак без образца. Если в образце встретится слэш или вопросительный знак, vi сочтет их ограничителем образца и проигнорирует остаток образца. Поиск и замена выполняется командой :s/образец/на_что_менять/. В ней указывается образец для поиска и строка, которой следует его заменить. После завершающего слэша может стоять модификатор g. Если его не поставить, заменен будет только первый образец в строке. Если в строке есть еще подстроки, отвечающие образцу, они останутся нетронутыми. Если поставить модификатор g, будут заменены все подстроки, отвечающие образцу.
Все команды режима совместимости с редактором ed могут быть предварены выражением n,m, где n,m - номера строк, ограничивающих диапазон выполнения команды. Если такого выражения нет, команда выполняется для текущей строки. Например:
:23,33s/black/white/g
означает, что нужно заменить все вхождения black на white во всех строках c 23 по 33 включительно. В выражении, описывающем диапазон, допустимы числа и символы "." и "$", а также арифметические выражения. Символ "." обозначает текущую строку, символ "$" - последнюю строку файла. Например,
:.,.+7s/black/white/g
означает замену black на white в восьми строках, начиная с текущей.
Допустим, мы находимся в первой строке. Тогда выражение
.,.+7
фактически означает
1,1+7
т.е.
1,8
Команда
:.,$s/yellow/blue/g
означает замену yellow на blue во всех строках, начиная с текущей и до конца файла.
В режиме совместимости можно не только выполнять команды поиска и замены. Здесь есть еще команда удаления - d. Команда
:1,.d
удалит все строки с первой по текущую.
Диапазон может состоять из одной строки, например команда
:4d
означает требование удалить четвертую строку.
Ввод числа за двоеточием без всяких команд означает переход к строке с указанным номером, например
:56
вызовет переход к 56-й строке.