Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.




Использование редактора VI

Автор : Беном Й. Йошино

Сокращения

В руководстве будут использованы следующие сокращения :

^X обозначает "control" символ. Например : ^d - удерживая клавишу "control" нажать соответствующий символ. Для этого примера используется клавиша "control" в сочетании с буквой "d".

 

Предисловие

Пользователи ОС Linux, использующие новые терминальные эмуляторы такие как xterm gnome-terminal, kvt, aterm, могут пропустить этот раздел. Переменная "$TERM" у них всегда по умолчанию имеет правильное значение.

Редактор Vi работает в полноэкранном режиме, поэтому использует информацию о типе терминала. Когда вы соединяетесь с "wiliki" ("wiliki" - имя главного инженерного сервера в Гавайском университете) он требует указания типа вашего терминала. Например :

    TERM = (vt100)

Если у вас данный тип терминала (или эмулятор поддерживающий этот тип) просто нажмите клавишу "Enter". Если у вас термнал hp, введите hp и нажмите клавишу "Enter". Если вам не известен тип терминала - спросите совет у лаборанта.

Если вы допустили ошибку указав неверный тип терминала - ничего страшного, просто завершите сеанс работы. Следующие команды помогут исправить установки системы :

    Во-первых установите переменную TERM (если вы не знаете какая оболочка используется в системе выполните команду echo $SHELL). В примерах подразумевается тип терминала vt100. Замените его при необходимости используемым вами. Для оболчки C (/bin/csh) используйте следующую команду :

    set term=vt100
Для оболочек Bourne (/bin/sh) или Korn (/bin/ksh) :
    export TERM
    TERM=vt100
Далее перезапустите ваш терминал :
    tset

Теперь, после правильной установки типа терминала, начнем изучение редактора Vi.

 

Начало работы

Редактор vi позволяет создавать новые файлы и редактировать существующие. Для запуска vi используйте команду vi сопровождаемую именем файла. Например для редактирования файла temporary наберите vi temporary и нажмите клавишу "Enter". Можно запустить vi без имени файла - в этом случае для сохранения результатов работы сообщите имя файла редактору позже.

Когда вы запускаете vi - на экране с левой стороны вы видите тильды (~). Так обозначаются пустые строки. В нижней части экрана отображается имя текущего файла и размер :

"filename" 21 lines, 385 characters
Если это новый файл сообщение будет выглядеть следующим образом :
"newfile" [New file]
При запуске vi без имени файла - нижняя часть экрана будет пустой. Если не отображается одно из этих сообщений - возможно у вас неверный тип терминала. Наберите :q и "Enter" для выхода из vi и установите поддерживаемый тип терминала. Если не знаете как - спросите совет у лаборанта.

 

Выход из VI

Теперь, когда вы знаете как запустить vi, необходимо узнать как завершить сеанс работы с редактором. Редактор vi имеет два рабочих режима и для завершения сеанса работы необходимо перейти в командный режим. Нажмите клавишу "Escape" или "Esc" (если у вас нет такой клавиши попробуйте "^[" или "control-[") для переключения в командный режим. Если вы находясь в командном режиме нажмете клавишу "Escape" - ничего страшного. Возможно прозвучит сигнал, но редактор по-прежнему будет в командном режиме.

Команда для выхода из vi - ":q". В командном режиме наберите двоеточие и "q" и нажмите клавишу "Enter". Если вы вносили изменения в файл - редактор предупредит об этом и не позволит завершить сеанс подобным образом. Выход из редактора без сохранения изменений - ":q!".

Конечно, работая в редакторе, вы хотите сохранять результаты работы. Команда для сохранения изменений - ":w". Можно сохранить изменения и завершить сеанс работы одновременно - ":wq". Для изменения имени файла выполните - ":w filename". Например для сохранения файла с новым именем filename2 выполните : ":w filename2".

Другая возможность завершения сеанса работы с редактором - выполнение команды ":ZZ". В командном режиме выполните ":ZZ" (эквивалент команды ":wq"). Если были сделаны изменения - они будут сохранены. Это самый простой вариант.

 

Режимы работы VI

Первое, что узнают пользователи о редакторе vi - два режима его работы : командный и вставки текста. Командный - режим ввода команд. Обычно эти команды короткие - состоят из одной или двух букв. Режим вставки текста - вставляется в файл то, что вы набираете на клавиатуре.

По умолчанию редактор запускается в командном режиме. Для переключения в режим вставки текста существует несколько команд. Наиболее часто используемые среди них - "a" и "i". Ниже мы остановимся подробнее на этих командах. Чтобы выйти из режима вставки текста нажмите клавишу "Escape". Если у вас нет такой клавиши попробуйте "^[" или "control-[" Вы можете нажать клавишу "Escape" дважды и редактор все равно будет командном режиме. Нажатие клавиши "Escape" в командном режиме не переведет его ни в какой другой. Может только прозвучать сигнал, сообщающий, что вы уже находитесь в командном режиме.

 

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

Команды в этом режиме имеют формат :

    [count] command [where]
Многие команды состоят всего из одного символа. Рассматриваемые в данном разделе команды - наиболее используемые в редакторе vi.

Аргумент count - число, начинающееся с символа от 1 до 9. Например : команда "x" удаляет символ в позиции курсора, при вводе команды "23x" - будут удалены 23 символа.

Некоторые команды используют аргумент where, определяющий границы текста, к которым будет применена команда, также параметр where может быть командой перемещения курсора.

 

Простые команды редактора VI

Рассмотрим некоторые команды для начала работы с vi. Позже обратим внимание на другие команды.

a
вставить текст за текущей позицией курсора. Если определен аргумент count - весь введенный текст будет повторен count раз.
h
переместить курсор на одну позицию влево.
i
вставить текст, начиная с позициии перед курсором. Если определен аргумент count - весь введенный текст будет повторен count раз.
j
переместить курсор вниз на одну строку.
k
переместить курсор вверх на одну строку.
l
переместить курсор на одну позицию вправо.
r
заменить символ в текущей позиции курсора. Аргумент count определяет количество заменяемых символов.
u
отмена последнего изменения. Повторная команда u возвратит изменение.
x
удалить символ в текущей позиции курсора. Аргумент count определяет количество удаляемых символов. Символы будут удалены за курсором.

 

Текстовые буферы в редакторе VI

Редактор vi предоставляет пользователю 36 буферов для хранения информации и также буфер общего назначения. Удаленный или скопированный текст помещается в буфер общего назначения. Многие пользователи vi редко используют другие буферы. Но можно использовать так называемые "поименованные" буферы. Для их применения используется команда ". Эта команда используется в сочетании с буквой или цифрой для определения буфера. Например : команда "mdd использует буфер m для вырезания в него текущей строки. Команды p или P используются для вставки текста. Команда "mp вставит содержимое буфера m за текущей позицией курсора. Эти буферы могут быть использованы командами, рассматриваемыми в следующих двух разделах.

 

Вырезание и копирование

Наиболее часто используемая команда для вырезания текста "d". Эта команда удаляет текст из файла. Использует аргумент count. Команда "dd" удаляет текущую строку. Рассмотрим несколько примеров :

d^
удаляет символы от текущей позиции курсора до начала строки.
d$
удаляет символы от текущей позиции курсора до конца строки.
dw
удаляет символы от текущей позиции курсора до конца слова.
3dd
удаляет три строки от текущей позиции курсора вниз.

Действие команды "y" (копирование) подобно действию команды "d", но она не удаляет текст, а только копирует его в буфер.  

Вставка

Команды для вставки "p" и "P". Различие между ними в положении вставляемого текста. Команда "p" вставляет текст из буфера после текущей позиции курсора, "P" - вставляет текст перед текущей позицией курсора. Аргумент count определяет количество повторов вставляемого текста.

 

Оформление и контроль

Редактор vi предоставляет программистам возможность аккуратного оформления кода. Существует переменная определения позиции для каждого уровня вложенности кода. Для ее определния обратите внимание на раздел "Настройка VI и EX". Например для определения отступа равным 4 символам используйте команду ":set sw=4".

Можно также использовать следующие команды (поддерживают аргумент count) :

<<
Сдвиг строки влево на одну позицию.
>>
Сдвиг строки вправо на одну позицию.

Редактор vi предоставляет возможность контроля кода по круглым или фигурным скобкам. Команда "%" контролирует парность круглых или фигурных скобок. Установите курсор на скобку и введите команду "%" для перемещения курсора на парную. При отсутствии парной скобки прозвучит сигнал, предупреждающий об ошибке.

 

Поиск текста

Редактор vi предоставляет два вида поиска : строк и символов. Команды "\" и "?" для поиска строк. При выполнении этих команд в нижней части экрана отображается строка введенная вами для поиска. Различие между командами "\" и "?" : "\" осуществляет поиск вниз по файлу, а "?" - вверх. Команды "n" и "N" повторяют поиск в том же или противоположном направлении соответственно. Некоторые символы имеют специальное значение в редакторе vi - поэтому перед ними должен быть введен символ \.

Специальные символы :

^
начало строки.
.
любой один символ.
*
любое число символов.
$
конец строки.
[
определяет набор символов для поиска. Например : /f[iae]t определит любую комбинацию из следующих : fit fat fet или /a[^bcd] определит любую комбинацию кроме : ab ac ad.
<
начало или конец слова. Например : /\ определит только слово the, но не there and other.
>
смотри описание выше.

Символьный поиск осуществляется в текущей строке командами "f" и "F". Команда "f" осуществляет поиск вперед, "F" - назад, курсор перемещается в позицию найденного символа.

Действие команд "t" и "T" аналогично действию "f" и "F". Различие между ними в положении курсора : после выполнения команды "t" курсор перемещается в позицию перед найденным символом, после выполнения команды "T" - после найденного символа.

Повтор поиска осуществляется командами ";" и ",". Команда ";" повторяет поиск в том же направлении, команда "," - в противоположном.

Установка переменной "ic" (:set ic) позволяет осуществить поиск не учитывая регистр.

 

Настройка VI и EX

Редактор vi предоставляет возможность настройки, осуществляемой установкой параметров командой :set. Далее следует список параметров, установленных на компьтере Wiliki для редакторов vi и ex (для получения списка используется команда :set all в командном режиме).

noautoindent        magic                               noshowmatch
autoprint mesg noshowmode
noautowrite nomodelines noslowopen
nobeautify nonumber tabstop=8
directory=/tmp nonovice taglength=0
nodoubleescape nooptimize tags=tags /usr/lib/tags
noedcompatible paragraphs=IPLPPPQPP LIpplpipnpbp term=xterm
noerrorbells prompt noterse
noexrc noreadonly timeout
flash redraw timeoutlen=500
hardtabs=8 remap ttytype=xterm
noignorecase report=5 warn
keyboardedit scroll=11 window=23
keyboardedit! sections=NHSHH HUuhsh+c wrapscan
nolisp shell=/bin/csh wrapmargin=0
nolist shiftwidth=8 nowriteany

Некоторые параметы могут быть просто включены или выключены, а некоторые принимают значение (включенное или выключенное состояние называют булевым значением и наличие "no" перед параметром означает, что он выключен). Значения некоторых параметров рассмотрены ниже. Например : для установки параметра autoindent выполните команду :set autoindent или :set ai. Для отмены установки этого параметра : выполните команду :set noautoindent или :set noai.

autoindent(ai)
вновь создаваемые строки выравниваются по отступу предыдущей. Для отмены отступа используйте в начале строки сочетание ^D в режиме вставки текста. Величина отступа также может быть установлена параметром shiftwidth.
exrc
файл .exrc загружается каждый раз при вызове vi. Это устанавливается переменной "EXINIT" или в файле .exrc в вашем домашнем каталоге.
mesg
команда :set nomesg отменяет разрешение появления текста на вашем терминале.
number (nu)
выводит номера строк вдоль левого края экрана.
shiftwidth (sw)
устанавливает значение отступа (используемого командами << и >>). Например : :set sw=4 устанавливает значение отступа равным 4.
showmode (sm)
показывает индикатор режима. Если вы находитесь в режиме вставки текста - в нижней строке экрана будет выведено сообщение "INPUT MODE".
warn
выводит предупреждение, если файл был изменен со времени выполнения последней команды записи.
window (wi)
устанавливает количество строк выводимых редактором vi на экран. Например : для использования 12 строк (из-за низкой скорости модема) используется команда :set wi=12.
wrapscan (ws)
когда в ходе поиска достигается конец файла, он продолжается с его начала.
wrapmargin (wm)
если значение параметра не равно нулю, редактор автоматически вставляет новую строку. Например : команда :set wm=2 устанавливает параметру wm значение 2.

 

Макросы

Существует полезная команда редактора ex для редактора vi - abbreviate. Она используется для сокращения наиболее часто применяемых фраз. Синтаксис команды : :ab string thing to substitute for. Например : если вам необходимо вводить слово "Humuhumunukunukuapua`a", но вы не хотите каждый раз набирать его полностью - используйте команду ab. Для данного случая она будет выглядеть так :
:ab 9u Humuhumunukunukuapua`a
Теперь если вы введете 9u - вы получите полное значение. При вводе 9university замены не произойдет.

Для удаления сокращения используется команда unabbreviate. Для данного случая - :una 9u. Команда :ab выдаст список всех сокращений.

Другая полезная команда редактора ex - map. Существуют две разновидности команды - для командного режима и для режима вставки текста - map и map! соответственно. Работает сходно с командой ab - последовательность символов заменяется обычно командами редактора vi.

 

Переменная EXINIT и файл .exrc

Существуют два пути управления настройками редактора vi - создание файла .exrc в вашем домашнем каталоге или настройка переменной "EXINIT". Параметры будут установлены в ваш файл сценария. Если вы используете /bin/csh (C-Shell) выполните следующие команды :

    setenv EXINIT '...'
Если вы используете /bin/sh или /bin/ksh выполните эти команды :
    export EXINIT
    EXINIT='...'
Не используйте ... как в примерах. Используйте команды. Например : для (для C shell) :
    setenv EXINIT 'set ai nu wm=3'

Для выполения нескольких команд разделите их вертикальной чертой (|). Например : для использования команды :map g G совместно с предыдущей выполните

setenv EXINIT 'set ai nu wm=3|map g G'

Используйте выражения в кавычках, после "EXINIT", для применения файла .exrc.

 

Восстановление данных

Редактор vi работает с копией файла и после завершения редактирования или по команде сохранения содержание копии перемещается в основной файл. Если возникает аварийная ситуация при редактировании, vi сохраняет результаты работы для последующего восстановления. Обратите внимание : при возникновении подобной ситуации, vi посылает e-mail сообщение с инструкциями о восстановлении данных. Параметр -r означает восстановление. Например : команда vi -r vitalinfo используется для восстановления данных после возникновения аварийной ситуации при редактировании файла vitalinfo. После использования параметра -r для восстановления файла необходимо сохранить результат в существующий файл. Параметр -r действителен только один раз после возникновения аварийной ситуации.

 

Предупреждения для использования VI на рабочих станциях

При использовании рабочих станций для работы с редактором vi необходимо помнить следующее : многократное одновременное редактироване одного и того же файла и изменение размера экрана.

Vi использует копию файла для редактирования и сохраняет изменения в существующий файл. Поэтому если редактируется один и тот же файл одновременно несколько раз - при сохранении результатов одна копия может переписать другую. Будьте уверены, что используется один сеанс для редактирования файла.

При работе с терминальной программой можно изменить размеры экрана. Если возникли проблемы с экраном, что является редкостью, выполните команду :

    eval `resize`
или :
    eval `/usr/bin/X11R6/resize`

 

Обзор команд редактора VI

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

  • Вырезание и вставка/удаление текста
  • Вставка текста
  • Перемещение по файлу
  • Перемещение по экрану
  • Замена текста
  • Поиск текста
  • Манипулирование символьно/строковым форматированием
  • Сохранение и выход
  • Разное
  • Команды редактора EX

Вырезание и вставка/удаление текста

"
Назначение буфера. Используется с буквой или цифрой.
D
Удалить от текущей позиции курсора до конца строки.
P
Вставить текст из буфера в позицию перед курсором. Если не определен буфер командой ", используется буфер общего назначения.
X
Удалить символ перед текущей позицией курсора.
Y
Копировать текущую строку в буфер. Если не определен буфер, используется буфер общего назначения.
d
Удалить. "dd" - удалить текущую строку. Аргумент count определяет количество удаляемых строк. Если не определен буфер командой ", используется буфер общего назначения.
p
Вставляет текст после текущей позиции курсора. Если не определен буфер командой ", используется буфер общего назначения.
x
Удаляет символ в позиции курсора. Аргумент count определяет количество удаляемых символов. Символы будут удалены после текущей позиции курсора.
y
Копировать. "yy" - копировать текущую строку. Аргумент count определяет количество копируемых строк. Если не определен буфер командой ", используется буфер общего назначения.

Вставка текста

A
Добавляет текст в конце строки.
I
Добавляет текст в начале строки.
O
(letter oh) Переключает в режим вставки текста и вставляет пустую строку перед текущей строкой.
a
Переключает в режим вставки текста и добавляет текст после курсора. Аргумент count определяет количество повторений введенного текста.
i
Переключает в режим вставки текста и добавляет текст перед курсором. Аргумент count определяет количество повторений введенного текста.
o
Переключает в режим вставки текста и вставляет пустую строку после текущей строки.

Перемещение по файлу

^B
Переход на один экран назад. Аргумент count определяет количество экранов.
^D
Переход на половину экрана вперед. Аргумент count определяет количество строк.
^F
Переход на один экран вперед. Аргумент count определяет количество экранов.
^H
Переход на один символ влево. Аргумент count определяет количество символов.
^J
Переход на одну строку вниз. Аргумент count определяет количество строк.
^M
Переход в начало следующей строки
^N
Переход на одну строку вниз. Аргумент count определяет количество строк.
^P
Переход на одну строку вверх. Аргумент count определяет количество строк.
^U
Переход на половину экрана назад. Аргумент count определяет количество строк.
$
Переход в конец текущей строки. Аргумент count определяет строку.
%
Переход к парной круглой или фигурной скобке.
^
Переход к первому символу.
(
Переход в начало предложения.
)
Переход в начало следующего предложения.
{
Переход к предыдущему абзацу.
}
Переход к следующему абзацу.
|
Переход в столбец, определенный аргументом count.
+
Переход к первому символу в следующей строке.
-
Переход к первому символу в предыдущей строке.
_
Переход к первому символу в текущей строке.
0
(Zero)Переход в начало текущей строки.
B
Переход назад на одно слово.
E
Переход в конец текущего слова.
G
Переход в конец файла. Аргумент count определяет номер строки для перехода.
H
Переход к первому символу вверху экрана.
L
Переход к первому символу внизу экрана.
M
Переход к первому символу в середине экрана.
W
Переход в начало следующего слова.
b
Переход назад на одно слово. Если курсор в середине слова - переход в начало текущего слова.
e
Переход вперед на одно слово. Если курсор в середине слова - переход в конец текущего слова.
h
Переход на один символ влево.
j
Переход вниз на одну строку.
k
Переход вверх на одну строку..
l
Переход на один символ вправо.
w
Переход вперед на одно слово. Если курсор в середине слова - переход к первому символу следующего слова.

Перемещение по экрану

^E
Переход на одну строку вперед. Аргумент count определяет количество строк.
^Y
Переход на одну строку назад. Аргумент count определяет количество строк.
z
Обновить экран. "z" устанавливает текущую строку вверх экрана; "z." устанавливает текущую строку в середину экрана; and "z-" устанавливает текущую строку вниз экрана. Аргумент count определяет строку для замены текущей строки. Например : "16z." устанавливает строку 16 в центр экрана.

Замена текста

C
Заменить от текущей позиции курсора до конца строки.
R
Заменить текст до нажатия клавиши "Escape".
S
Заменить всю строку.
c
Заменить. "cc" заменяет текущую строку. Аргумент count определяет количество строк.
r
Заменить символ в позиции курсора. Аргумент count определяет количество символов.
s
Заменить символ в позиции курсора и перейти в режим вставки текста. Аргумент count определяет количество символов. Символ ($) будет установлен на последнем символе для замены.

Поиск текста

,
Повторить последнюю команду "f", "F", "t" или "T" в обратном направлении.
/
Искать определенную строку вперед по файлу.
;
Повторить последнюю команду "f", "F", "t" или "T".
?
Искать определенную строку назад по файлу
F
Искать определенный символ вперед в текущей строке. При успешном выполнении - курсор перемещается в позицию найденного символа.
N
Повторить последний поиск "/" или "?" исключая обратное направление.
T
Искать определенный символ вперед в текущей строке. При успешном выполнении - курсор перемещается в позицию после найденного символа.
f
Искать определенный символ в текущей строке. При успешном выполнении - курсор перемещается в позицию найденного символа.
n
Повторить последний поиск "/" или "?".
t
Искать определенный символ в текущей строке. При успешном выполнении - курсор перемещается в позицию перед найденным символом.

Манипулирование символьно/строковым форматированием

~
Изменить регистр символа в позиции курсора.
<
Выполнить сдвиг влево на величину shiftwidth. "<<" - сдвиг текущей строки влево (использует аргумент count).
>
Выполнить сдвиг вправо на величину shiftwidth. ">>" - сдвиг текущей строки вправо (использует аргумент count).
J
Объединить текущую строку с последующей. Аргумент count определяет количество строк.

Сохранение и выход

^\
Выход из режима "VI" в режим "EX". Редактор EX - строковый редактор, на основе которого построен редактор VI. Команда редактора EX для возврата в VI :vi.
Q
Выход из режима "VI" в режим "EX". Редактор EX - строковый редактор. Команда редактора EX для возврата в VI :vi.
ZZ
Выход из редактора с сохранением изменений.

Разное

^G
Показать имя файла и статус.
^L
Очистить и перерисовать экран.
^R
Перерисовать экран и удалить ошибочные строки.
^[
Отменить частично набранную команду.
^^
Возвратиться к последнему редактированному файлу.
!
Выполнить команду оболочки.
&
Повторить предыдущую команду :s.
.
Повторить последнюю команду.
:
Начало команды редактора "EX". Команда выполняется один раз после нажатия клавиши "Enter".
@
Напечатать команду из определенного буфера.
U
Восстановить текущую строку.
m
Отметить текущую позицию определенным символом.
u
Отменить последнее изменение файла. Повторная команда восстанавливает изменения.

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

Редактор vi построен на основе редактора ex. Редактор ex редактирует построчно. Из редактора vi можно вызвать команду ex - : вводится перед командой. Мы рассмотрим наиболее используемые команды. Если необходимо изменить более одной строки командами :s или :w определяется диапазон. Например : для изменения строк с 3 по 15 используется команда :3,15s/from/this/g.

:ab string strings
Сокращение. Если в редакторе vi появляется слово string, происходит автоматическая замена. Например : команда :ab usa United States of America определяет сокращение для слова "usa". Теперь при вводе слова "usa" произойдет замена на "United States of America".
:map keys new_seq
Макрос. Замена клавиши или последовательности клавиш .
:q
Выход из редактора VI. Если были сделаны изменения - редактор сообщит об этом.
:q!
Выход из редактора VI без сохранения изменений.
:s/pattern/to_pattern/options
Замена. Замена выражения pattern на выражение to_pattern. Без использования options производит замену первого вхождения выражения pattern. Если используется опция "g" - все вхождения выражения pattern будут заменены. Например : команда :1,$s/Dwayne/Dwight/g заменит все вхождения выражения "Dwayne" на "Dwight".
:set [all]
Установка некоторых параметров настройки VI и EX. Команда :set all выводит список всех возможных параметров (обратите внимание на раздел "Настройка VI и EX").
:una string
Удаление ранее определенного сокращения командой :ab.
:unm keys
Удаление ранее определенного макроса командой ":map.
:vi filename
Начало редактирования нового файла. Если изменения не были сохранены - редактор выдаст предупреждение.
:w
Записать текущий файл.
:w filename
Записать файл с именем filename.
:w >> filename
Добавить содержимое буфера в файл filename.
:wq
Сохранить изменения и выйти.

 

Ссылки

  • Адрес оригинала заметки: www.eng.hawaii.edu/Tutor/vi.html
  • Загрузить VIM, популярную версию редактора VI из http://www.vim.org/
  • Вопросы и комментарии направляйте (Ben Y. Yoshino)

Обсудить данную тему на нашем форуме "Все о Linux"