Vi

Коротко о редакторе vi

vi — это стандартный текстовый редактор UNIX, который есть в любой UNIX–подобной операционной системе. Первая версия редактора появилась в 1976 году. Редактор построен на базе редактора командной строки ex.

Cуществует множество «клонов» vi: elvis, vim и др. Все они включают идентичный, основной набор команд. В ОС Linux наиболее распространённым является vim. В дистрибутиве Slackware Linux редактором vi по умолчанию является elvis.

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

  • командный режим
  • режим редактирования
  • ex-режим или режим последней строки.

По умолчанию, работа начинается в командном режиме. В этом режиме можно перемещаться по файлу и выполнять некоторые «редактирующие» операции над текстом. Любое нажатие на клавиши в командном режиме воспринимается как команда. Возврат в командный режим из режима редактирования осуществляется нажатием клавиши <ESC>.

Для входа в режим редактирования, который используется для ввода текста, нужно выполнить одну из команд.

Для входа в режим последней строки необходимо нажать клавишу : . Редактор vi имеет встроенный не экранный редактор, именуемый ex, который используется для некоторых операций редактирования, ориентированных на строки; управления файлами (сохранить, выйти, перечитать) и т.п.

Команды редактора

Ввод команд осуществляется либо в командном режиме, либо в режиме последней строки.

:help              # вывод справочной информации в рабочем окружении редактора
:q                 # выход из help

Открытие и создание файлов

Открывать или создавать файлы можно следующим образом:

vi [параметры] файл

например:

$ vi filename        # открыть файл filename
$ vi +3 filename     # открыть файл filename с 3-ей строки
$ vi -r filename     # открыть файл filename только для чтения
$ vi newfile         # создать новый файл 

Можно открывать сразу несколько файлов. Переход между открытыми файлами осуществляется при помощи команды :n и :N.

$ vi file1 file2     # открыть file1, затем file2
:n                   # перейти из файла file1 в file2
:N                   # вернуться из файла file2 в file1

Можно открывать или создавать файлы находясь в рабочем пространстве редактора. Для этого нужно воспользоваться режимом последней строки.

:e filename-2         # открыть файл filename-2. Если файла с таким именем
                      # не существует, он будет создан и открыт в редакторе

Следует учесть, что в этом случае редактор попросит сохранить текущий рабочий файл, если в него были внесены какие–либо изменения.

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

:r myfile             # загрузить файл myfile в буфер
:r! lsmod             # загрузить вывод программы, например, lsmod в буфер
:e! filename          # открыть файл filename, отклонив изменения в текущем файле

Можно держать открытыми одновременно несколько буферов, используя команду sp или split. Редактор откроет файл в новом окне, «потеснив» уже открытые. Команда sp (без имени файла) откроет дополнительное окно для активного буфера. Переход между окнами осуществляется при помощи комбинации клавиш <CTRL+w>, нажатых 2 раза подряд.

:sp filename-2        # разделить рабочее окно и открыть файл
:split filename-2     #	разделить рабочее окно и открыть файл
:sp                   # открыть окно для активного буфера
<CTRL+w> (2 раза)     #	переход, переключение от одного окна к другому

В режиме последней строки работает «автоподстановка» по табуляции.

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

:е!                   # перезагрузить, перечитать файл
:e ++enc=cp1251	      # перечитать файл и сменить кодировку символов (работает в vim)

Работа в командном режиме

Выполняются операции перемещения по файлу, удаления, поиска.

При осуществлении перемещения по тексту при помощи команд w, e, b, следует отметить, что, например, «слово» /dev/sda3 редактор определит как 4 различных слова. Чтобы это слово считалось как одно «большое слово», необходимо вводить команды заглавными буквами: W, E, B.

Для поиска начала и конца предложения, абзаца и перемещения по ним следует воспользоваться ( ) и { } .

Команды, используемые для перемещения по тексту:

<ESC>  	               # перейти в командный режим
h 	               # перейти влево на один символ
j 	               # перейти вниз на один символ
k 	               # перейти вверх на один символ
l 	               # перейти вправо на один символ
0 (ноль) или | 	       # перейти в начало строки
$ 	               # перейти в конец строки
w 	               # перейти в начало следующего «слова», вперёд
W 	               # перейти в начало следующего «большого слова», вперёд
e 	               # перейти в конец «слова», вперёд
E 	               # перейти в конец «большого слова», вперёд
b 	               # перейти в начало «слова» или предыдущего «слова», назад
B 	               # перейти в начало «большого слова» или предыдущего «большого слова», назад
( 	               # перейти в начало текущего или предыдущего предложения, назад
) 	               # перейти в начало следующего предложения, вперёд
{ 	               # перейти в начало текущего или предыдущего абзаца, назад
} 	               # перейти в начало следующего  абзаца, вперёд
G 	               # перейти в конец файла
<CTRL+B> 	       # перейти на страницу вверх
<CTRL+F> 	       # перейти на страницу вниз

Можно перемещаться по строкам, указав их номера в режиме командной строки:

:1 	               # перейти в начало файла
:47 	               # перейти, например, к 47-й строке

В современных версиях редактора работают клавиши управления курсором и клавиши <PageUp>, <PageDown>.

Поиск по тексту:

/<текст> 	       # искать <текст> в прямом направлении после курсора
?<текст> 	       # искать <текст> в обратном направлении до курсора
n 	               # повторить поиск в прямом направлении
N 	               # повторить поиск в обратном направлении
/ 	               # повтор последнего поиска в прямом направлении
? 	               # повтор последнего поиска в обратном направлении

Операции «простого» редактирования:

x 	               # удалить символ под курсором
X 	               # удалить предыдущий символ перед курсором
J 	               # объединить текущую строку со следующей
r<символ> 	       # заменить символ под курсором на <символ> 
dd 	               # удалить текущую строку
d<место> 	       # удалить текст от курсора до его перемещения
u 	               # отменить последнюю операцию
U                      # отменить последнюю операцию в текущей строке
. 	               # повторить операцию

Работа в режиме редактирования

Переход в режим для ввода текста осуществляется при помощи следующих команд:

i  	               # перейти в режим редактирования перед курсором
a  	               # перейти в режим редактирования за курсором
I 	               # перейти в режим редактирования в начале текущей строки
A 	               # перейти в режим редактирования в конце текущей строки
o 	               # перейти в режим редактирования в новой строке после текущей строки
O 	               # перейти в режим редактирования в новой строке перед текущей строкой
сс 	               # заменить текущую строку
c<место> 	       # заменить текст от курсора до <места> его назначения
R 	               # перейти в режим замены символов

В современных версиях vi, таких как vim и elvis, возможно «подсвечивать» текст, для того чтобы в последующем копировать, вырезать и вставлять фрагменты текста. Это, так называемый, визуальный режим. Переход в него осуществляется при помощи клавиши v, V или комбинации клавиш <CTRL+V> Далее, двигая курсор командами перемещения, можно выделить область текста.

v	               # перейти в визуальный режим для выделения текста посимвольно
v<место>	       # перейти в визуальный режим и выделить текст от курсора до <места>
V                      # перейти в визуальный режим для выделения текста построчно
<CTRL+V>               # перейти в визуальный режим для выделения прямоугольного участка текста
d		       # вырезать выделенный фрагмент текста
y		       # скопировать выделенный фрагмент текста
p		       # вставить фрагмент текста после курсора
P		       # вставить фрагмент текста перед курсором

Поиск и замена текста осуществляется при помощи команды :s/<regexp>/<replacement>/, где <regexp> — что нужно заменить и <replacement> — на что нужно заменить.

:s/<что>/<чем>/			заменить 1-ое совпадение в текущей строке
:s/<что>/<чем>/g		заменить все совпадения в текущей строке
:%s/<что>/<чем>/g		заменить все совпадения в файле
:%s/<что>/<чем>/gc		заменить все совпадения в файле с подтверждением

Примеры комбинирования команд

Команды в редакторе vi можно комбинировать, указывая, сколько раз команда должна выполняться или несколько команд.

Например,

3G 	               # перейти на строку с номером 3
3l		       # перейти на 3 символа вправо
4)		       # перейти на 4 предложения вперёд
2b		       # перейти на 2 слова назад
12}		       # перейти на 12 абзацев вперёд

10x 	               # удалить 10 символов с текущей позиции курсора
5dd 	               # удалить 5 строк, начиная с текущей
d3w		       # удалить следующие 3 слова после курсора
d}		       # удалить остаток абзаца после курсора
d)		       # удалить остаток предложения после курсора

с)		       # заменить остаток предложения после курсора
c$		       # заменить остаток строки после курсора

v5l		       # перейти в экранный режим и выделить 5 символов вправо с текущего положения курсора
v$		       # перейти в экранный режим и выделить всю строку с текущего положения курсора
vG		       # перейти в экранный режим и выделить весь файл с текущего положения курсора

Некоторые настройки редактора

Редактор vi поддерживает автоматический отступ при редактировании исходных текстов программ. Современные версии редактора могут самостоятельно включать автоматический абзацный отступ. Можно также включить его вручную выполнив команду :set autoindent.

:set autoindent	       # включить абзацный отступ
<CTRL+D>	       # увеличить уровень отступа
<CTRL+T>	       # уменьшить уровень отступа
:set tabstop=4	       # установить абзацный отступ в 4 символа

Полезными также могут оказаться следующие команды:

:set ic                # игнорировать регистр при поиске
:set hls	       # подсвечивать текст при поиске

:set wrap              # переносить «длинные» строки
:set nowrap            # отключить перенос «длинных» строк 

:set nu[mber]          # отобразить слева нумерацию строк
:set nonu[mber]        # скрыть нумерацию строк

:set fileformat=dos    # привести концы строк в файле к формату dos
:set fileformat=unix   # привести концы строк в файле к формату unix

:syntax on/off         # включить/выключить подсветку синтаксиса (работает в vim)

Завершение работы

Завершение работы в редакторе осуществляется при помощи следующих команд, или их комбинаций:

:q		       # выход из файла (если не внесено никаких изменений)
:q!		       # выход из файла без сохранения
:wq		       # выход из файла с сохранением
:x		       # выход из файла с сохранением
:ZZ                    # выход из файла с сохранением
:w		       # сохранить файл без выхода
:w <имя файла>	       # сохранить буфер в файле <имя файла>
:5,125 w <имя файла>   # сохранить файл c 5 строки по 125 в файл <имя файла>