Next Previous Contents

9. Руководство по Vi

В этом пособии,описываются некоторые "продвинутые" команды и концепции vi, так, чтобы вы могли оценить всю мощь vi и продумать какие команды вам необходимо изучить в первую очередь. Почти все руководства по vi перечисляют доступные команды, но не показывают их взаимосвязи;это и есть основное предназначение данного руководства.

9.1 Команды перемещения курсора

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

Пожалуйста выберите какой нибудь большой текст,чтобы вы смогли проэкспериментировать с каждой из описанных команд. Также помните,что эти команды будут работать только в командном режиме,не в режиме вставки;если вы начали вводить эти команды прямо в текст - нажмите ESC чтобы вернуться в командный режим.

9.2 Коэффициент повторения

Многие из приведенных выше команд перемещения курсора могут быть предварены коэффициентом повторения;в таком случае команда просто повторяется несколько раз.

Для некоторых комманд коэффициент повторения имеет особое значение. Для некоторых комманд (например, ^) коэффициент повторения игнорируется; для других (например., / и ? ) он применяться не может.

9.3 Удаление текста

Мы уже видели,что dd удаляет текущую строку. Эту команду можно использовать совместно с коэффициентом повторения: 3dd удаляет три строки, текущую и две следующих.

Команда d может быть использована совместно с практически любой командой перемещения по тексту, что позволяет удалять произвольные фрагменты текста. При использование совместно с d команды перемещения называются спецификаторами цели. (во время экспериментов со следующими примерами, не забывайте нажимать u чтобы восстанавливать то-что вы удалили).

Для удаления одного символа используйте x. x можно использовать совместно с коэффициентом повторения. x на самом деле - макрос для d1; удаление одного символа.

9.4 Изменение текста

Команда c в основном идентична d, исключая то,что она переключает vi в режим вставки,позволяя изменить изначальный текст на что то другое.

Например : разместите курсор на начале какого-либо слова (нажмите w чтобы перейти к началу следующего слова). Затем нажмите cw , чтобы изменить это слово.На экране последний символ заменяемого слова будет изменен на $, индицирующий границы производимых изменений; попробуйте ввести новое слово и нажмите ESC когда закончите.Новый фрагмент текста может быть длинее/короче чем тот который был удален.

Поместите курсор на начале строки содержащей как минимум три слова, и попробуйте c3w для изменения этих слов. Попробуйте $ чтобы изменить текст до конца текущей строки. Во всех случаях когда изменение касается только текущей строки конец изменяемого текста помечается символом $.

Когда изменение касается не только текущей строки,vi удаляет оригинальный текст и переходит в режим вставки. Например попробуйте c3+ для изменения текущей и трех последующих строк;vi удалит четыре оригинальных строки на экране и перейдет в режим вставки на новой пустой строке. Как и обычно нажмите ESC чтобы вернуться в командный режим.

Некоторые примеры команд изменения:

9.5 Копирование текста

Команда y копирует фрагмент текста в буфер;из буфера скопированный текст может быть вставлен в любую часть файла используя команду p или P.

Самая простая форма копирования - скопировать текущую строку;введя yy, попробуйте p, чтобы вставить копию скопированной строки после курсора. Вы можете вставить эту строку в файл столько раз, сколько это необходимо, перемещаясь по файлу и нажимая p.

Чтобы скопировать множество строк, попробуйте, например, 5yyy (копирует текущую строку и следующие четыре строки). p вставляет скопированные линии после курсора; команда 5yyp "работает" но вероятно не делает того, что вам необходимо. Команда P делает тоже что и p, но помещает копию скопированного текста перед курсором; попробуйте эту последовательность - 5yyP.

Другие команды для вставки:

9.6 Фильтрование текста

Команда фильтрования vi, запрашивает у пользователя имя команды UNIX (которая должна быть фильтром), затем пропускает выбранные строки сквозь фильтр,заменяя эти строки на строки обработанные фильтром. Возможность vi по фильтрованию произвольных фрагментов текста, через любой UNIX фильтр, добавляет гибкость и значительно расширяет ваши возможности по редактированию текста, без "дополнительной платы" в виде размера или производительности самого vi.

Несколько примеров помогут это проиллюстрировать. Создайте строку в вашем файле, содержащую слово who и ничего более. Поместите курсор на эту строку и нажмите !!. Эта команда похожа на dd,cc или yy но вместо удаления,изменения или копирования текущей строки,она фильтрует её. Когда вы нажимаете ! второй раз,курсор переходит на командную строку и в ней высвечивается подсказка !,приглашающая вас ввести название фильтра. В качестве имя фильтра введите sh и нажмите Enter. sh (Bourne shell) это фильтр! Он считывает команды со стандартного ввода, исполняет их и выдает результат исполнения на стандартный вывод. Команда who будет выполнена и в качестве результата выдаст список пользователей подключенных в данный момент к системе. В итоге вы получите этот список прямо в вашем файле, вместо слова who.

Попробуйте проделать то же самое с date. Создайте строку содержащую только слово date, затем поместите курсор на этой строке, введите !!sh и нажмите Enter. Строка будет заменена на вывод команды date

Поместите ваш курсор на какую-нибудь строку. Отсчитайте несколько строк, скажем 6. Введите 6!!sort и нажмите Enter. Оригинальные 6 строк будут заменены на вывод команды sort.

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

Некоторые другие команды фильтрования (здесь, < CR > означает - нажмите Enter):

9.7 Установка пометок

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

Например разместите курсор в центре какого-либо слова и нажмите ma. Это пометит символ под курсором меткой a.

Теперь переместите курсор с помеченного символа в другое место (используйте клавиши со стрелками или CTRL-u). Чтобы вернуться к помеченной строке нажмите 'a (одинарная скобка и a). Это переместит курсор на первый символ (не пробел) на помеченной строке.

Вновь уберите курсор с этой строки. Чтобы вернуться к помеченному символу нажмите `a (обратная одинарная скобка и a). Это поместит курсор поверх символа помеченного как a.

Установка меток обычно используется для его удаления,изменения,копирования или фильтрования. Например : переместите курсор на строку без метки и нажмите d'a (d,одинарная скобка,a). Эта команда удалит все начиная от текущей строки и заканчивая строкой с меткой.

Поместите курсор в центре какого-либо слова и нажмите mb чтобы установить метку b. Отодвиньте курсор на несколько строк и нажмите d`b (d,обратная одинарная скобка,b). Эта команда удалит все начиная от текущего положения курсора и заканчивая помеченным символом (включая его).

Другой пример : для сортировки вывода команды who, поставьте метку на первой строке вывода (ma), затем передвиньте курсор на последнюю строку и введите !'asort и нажмите Enter.

Если после того как вы перешли к метке вы захотите вернуться назад,нажмите '' чтобы вернуться к строке или '' чтобы вернуться к символу.

9.8 Назначение имени буферам

Когда вы удаляете,изменяете или копируете текст, оригинальный текст сохраняется (до следующей операции удаления, изменения или копирования) в безымянном буфере, из которого его можно извлечь с помощью p или P. Таким образом, в восстановить из безымянного буфера можно лишь недавно помещенный туда текст.

Если вы хотите удалить,изменить или скопировать несколько секций текста и при этом сохранить их все (вплоть до максимально возможных 26), вы можете задать имя буфера перед командой удаления или копирования.Имя буфера имеет следующий синтаксис "c (двойные кавычки и c).

Например введите "ayy чтобы скопировать текущую строку в буфер с именем a,затем перейдите на другую строку и нажмите "byy чтобы скопировать её в буфер b. Теперь перейдите в другое место в файле и нажмите "ap и "bp чтобы вставить содержимое буферов a и b.

Несколько других команд использующих буфер:

9.9 Замещение текста

Чтобы заместить один фрагмент текста другим используйте команду :s. Несколько примеров:

9.10 Команды начинающиеся с двоеточия

Когда вы вводите двоеточие в командном режиме,курсор автоматически перемещается на командную строку и ждет ввода команды.

Некоторые примеры таких команд:

9.11 Установка опций

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

Например если вы хотите чтобы для строк в файле отображались их порядковые номера, используйте команду ":set number". Чтобы отключить отображение номеров строк введите ":set nonumber". Для указания большинства опций можно использовать аббревиатуры, например ":set nu" - включит нумерацию строк, а ":set nonu" отключит её.

Если вы установите ":set nomagic", то символы регулярных выражений имеющие специальное значение (период,астерик,квадратные скобки и т.д.) будут восприниматься как обычные. Используйте ":set magic" чтобы вернуть все назад.

Некоторые опции могут иметь параметры. Например ":set tabstop=4" заставит символ табуляции отображаться как четыре пробела, вместо обычных восьми.

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

Например если в качестве shell вы используете Bourne shell,вы можете разместить в вашем .profile такую строчку.


        EXINIT='set nomagic nu tabstop=4'; export EXINIT

Если вы используете C shell, необходимо разместить следующую строку в вашем .login файле.
        setenv EXINIT 'set nomagic nu tabstop=4'

9.12 Настройка клавиатурных комбинаций

Если вам приходиться выполнять серию простых команд опять и опять, то вы можете назначить этим командам определенную клавиатурую комбинацию (из неиспользуемых) с помощью команды :map.

Например следующая команда настраивает CTRL-А для передвижения курсора на 55 строк вперед, затем назад на самую последнюю пустую строку,на изменение этой командной строки на formfeed (CTRL-L) и три пустых строки. Т.е. CTRL-A отформатирует следующую страницу, без разделения параграфов между страницами.

Примечание: В этой строке каждый символ, который нужно нажимать совместно с CTRL показан как ^С, где С это большая буква. Например, СTRL-M показано как ^M. Также во время ввода вы не увидете ^V, т.к. СTRL-v нужно для того, чтобы подавить управляющее значение следующей за ним комбинации клавиш. Т.е. при вводе ^V^M вы увидете на экране лишь ^M(соотвествует Enter). ^[ соотвествует ESC.


        :map ^A  55+?^$^V^Mcc^V^L^V^M^V^M^V^M^V^[

9.13 Редактирование нескольких файлов

Вы можете редактировать несколько файлов, задав их имена как аргументы при запуске vi.


        vi croc fatherw  wknight

Для перемещения между файлами используются две команды: Команды :n и :rew, в каком то смысле неповоротливы, но они предоставляют несколько весьма полезных возможностей: содержимое поименованных буферов ("a,"b и т.д.) запоминается глобально, и вы сможете использовать :n и :rew команды совместно с p или P, чтобы копировать текст из одного файла в другой. Более того, запрос поиска, также запоминается глобально, и вы сможете искать одну строку в нескольких файлах.

Попробуйте провести следующий эксперимент: Выйдете из vi, запустите vi с croc и wknight в качестве аргументов:


        $ vi croc wknight

В файле croc, найдите

/the < CR >

Скопируйте это в буфер a:

"ayy

Перейдите к следующему файлу (мы не сделали никаких изменений в croc,поэтому это сработает):

:n < CR >

Проведем поиск еще раз, использовав в качестве аргумента поиска преведущий образец.

n

Поместите копию буфера a после текущей строки в wknight:

"ap

Перейдите на две строки вниз, и скопируйте текущую строку в буфер b:

jj"byy

Сохраним изменения в wknight

:w < CR >

Теперь вернемся к croc

:rew < CR >

Произведем поиск еще раз и разместит копию буфера b после найденной линии:

n"bp

Сохраним изменения и выйдем из vi

ZZ

9.14 Финальные замечания

Это пособии представляет некоторые возможности vi которые вы могли пропустить или не понять читая пособие по vi установленное в вашей системе.(на различных системах встречаются разные пособия).

Вы не станете экспертом по vi после чтения этого пособия,но вы ,по крайней мере, сможете оценить его возможности. Только время и тренировка могут сделать вас экспертом. Но универсальность и эффективность vi стоят этих усилий.

Вы можете решить что вы ненавидите vi. Но не забывайте что это единственный редактор доступный практически на любой UNIX системе, поэтому необходимо знать хотя бы самый минимум его команд.


Next Previous Contents
Используются технологии uCoz