Главная > Програмное обеспечение > Редакторы/Офисы >
VI Russian FAQ

1. Режим работы редактора vi
2. Основы vi
3. Перемещение по документу
4. Вставка и замена текста
5. Поиск (и замена) текста
6. Процедуры вырезания и вставки
7. Макросы
8. Другие важные команды

###Режимы работы редактора vi###

Что такое редактор с несколькими режимами работы?

Если вы работаете с многорежимньгм редактором, символы, вводимые с клавиатуры, воспринимаются по-разному в зависимости от того, в каком режиме он находится. У vi три основных режима: командный, режим ввода текста и внешний. В командном режиме вы подаете редактору команды, например: "вырезать эту строку из текстам, "сохранить работу" или "перейти на строку 37 и заменить каждое встреченное сочетание ххх на Osborne вплоть до строки 459s". В режиме ввода текста вы просто набираете текст, и он вставляется в файл, (В действительности вообще-то в буфер, но не будем буквоедами.) Наконец, во внешнем режиме вы прямо подаете команды редактору ех или командной оболочке. В командном режиме нельзя вводить текст в файл, а в режиме ввода текста нельзя переместиться на следующую страницу или к следующему слову. Наконец, во внешнем режиме вы работаете на самом деле не c vi, а с ех. Все это несколько отличается от других редакторов или текстовых процессоров, и к этому нужно привыкнуть. Но, в конце концов, ко многому в жизни приходится привыкать.

Как переключаться между режимами vi?

После запуска vi всегда оказывается в командном режиме. В каком режиме он окажется в дальнейшем, зависит от вводимых команд. Чтобы переключиться в режим ввода текста, наберите команду, подразумевающую ввод (см. раздел "Вставка и замена текстам). Точно так же, чтобы оказаться во внешнем режиме, введите команду, начинающуюся с ":", поскольку любая команда ех начинается с двоеточия (см. раздел "Поиск (и замена) текстам). Вернуться в командный режим проще всего, нажав клавишу ESC.

Что делать, если я неожиданно оказался в редакторе ех, а не vi?

Просто наберите vi, чтобы вернуться к нормальному состоянию. Скорее всего, вы случайно нажали Q (SHIFT+клавиша Q), а это команда запуска ех.

###Основы vi###

Что представляет собой vi и какие его версии нам доступны?

Имя vi - это сокращение от "visual interface" ("визуальный интерфейс"). Редактор vi является расширенной версией ех, который, в свою очередь, - расширением редактора ed. Сейчас ed практически не используется, так что о нем можно и не вспоминать, а с ех работают лишь те, кто никак не может распроститься с терминалами, не поддерживающими vi. В большинство реализации ОС UNIX включается три версии vi. Стандартная, которой как раз и посвящена эта глава, запускается командой vi. Вторая версия обеспечивает только режим чтения и не позволяет случайно или нарочно изменять файлы, что бывает полезно при их просмотре. Вы можете запустить эту версию, введя в командной строке view. Наконец, существует тупая версия для "чайников", которая запускается командой vedit. О ней можно спокойно забыть. Некоторые возможности, включенные в vedit, неплохи, но в этой главе мы покажем, как сделать то же самое в стандартном vi.

Можно ли, работая с vi, редактировать сразу несколько файлов?

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

Что нужно сделать, чтобы завершить редактирование файла, записать сделанные изменения и загрузить следующий файл из списка?

Используйте команду :n в командном режиме. Этот простой прием сохраняет уйму времени и облегчает редактирование сразу нескольких файлов. Но помните, что, если вы хотите вырезать что-нибудь из одного файла и перенести в другой, потребуется использовать поименованные буферы. Сведения о поименованных буферах вы найдете в разделах "Поиск (и замена) текста" и "Процедуры вырезания и вставки". СОВЕТ Некоторые версии vi не поддерживают автоматическое сохранение и переход к следующему файлу, как предлагалось выше. В этом случае вам нужно выполнить перевод в два шага: сначала сохранить первый файл, а потом перейти к следующему, введя в командном режиме сначала :w, а потом :n,

Есть ли способ вернуться назад и отредактировать предыдущий файл из списка?

Да. Введите в командном режиме :е#. Знак # - это сокращение для "предыдущий файл, который я открывал".

Можно ли повторно загрузить в редактор текущий файл и начать его редактировать с самого начала?

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

Как произносится "!"?

Следует говорить "бэнг".

Можно ли как-нибудь увидеть, какие файлы еще осталось отредактировать?

Да. Попробуйте :args. Конечно, здорово загрузить сразу кучу файлов, набрав одну строчку, но если в результате вы сбились со счета, эта внешняя команда покажет вам, что еще осталось сделать.

Если окажется, что я совершил ужасную ошибку, можно ли начать работу заново с тем же набором файлов?

Да, Просто прокрутите список файлов назад. Чтобы сделать это, используйте команду :rewind, которая сохранит все изменения, внесенные в текущий файл, и начнет с начала списка. Команда :rewind! позволит сделать то же, не сохраняя изменения в текущем файле.

###Перемещение по документу###

Какие клавиши используются в vi для перемещения курсора?

Основные клавиши для перемещения курсора в командном режиме - это -"j", "k", "1" и "h". Они передвигают курсор соответственно вниз на одну строчку, вверх на одну строчку, вправо на один символ и влево па один символ. Введите сначала какое-нибудь число, и перейдете как раз на такое количество строк или символов. То есть, чтобы передвинуться в текущем файле вниз на 25 строк, наберите 25j. Однако, если от текущей позиции курсора до конца файла меньше, чем 25 строк, vi лишь погудит вам. То же самое произойдет, если вы даете команду на перемещение вверх, а до начала файла строк меньше, чем указано в команде. Вы не сдвинетесь с места, пока не будет подана команда, которую можно выполнись.

Как можно постранично просматривать документ?

Используйте CTRL-F, чтобы переместиться на экран вперед, и CTRL-B, чтобы переместиться на экран назад (вверх). Если у вас стандартный дисплей, на экране которого умещаются 24 строки, делать больше ничего не нужно. Но если число строк какое-нибудь еще, вы можете изменить поведение vi во время текущего сеанса работы, вводя перед любой из этих команд число, указывающее, на сколько строк следует перемещаться. Так, если вы введете 15, а потом CTRL-B, изображение сдвинется вверх на 15 строк.

Можно ли переместить курсор на пол-экрана?

Да, используйте CTRL-D для перемещения вниз и CTRL-U для перемещения вверх. Точно так же, как и в случае с CTRL-F/CTRL-B, перед ними может идти число, показывающее, на сколько строк нужно перемещать курсор за один раз.

Существует ли способ быстрого перемещения в начало или конец файла?

Чтобы перейти в начало файла, наберите 1G. Это частный случай общей команды G (Go -- "идти"), которая обеспечивает переход в начало любой строки с данным номером, если число, задающее номер строки, вводится перед командой. А чтобы перейти к концу файла, просто нажмите Q.

Как переместиться в начало или конец текущей строки?

Чтобы попасть в начало текущей строки, нажмите 0 или |. Ноль - это сокращение. Чтобы оказаться в любой другой позиции строки, отличной от первой, используйте n, где n - позиция, в которую нужно переместиться. В конец текущей строки можно перейти, нажав $. Постарайтесь все это запомнить. Это пригодится, когда мы будем создавать более интересные внешние команды.

Существует ли простой способ восстановить вид экрана, если он оказался серьезно искажен?

Да. Нажмите CTRL-L, для того чтобы вызвать обновление экрана. Обычно таким образом можно решить все проблемы. Однако если это не помогает или экран портится подозрительно часто, обратитесь с вашей проблемой к системному администратору. Возможно, это связано со слегка неверной эмуляцией терминала.

Есть ли другие команды перемещения курсора в vi?

Существует еще много разных команд, например, М, чтобы перейти в строку, находящуюся в середине экрана, Н, чтобы попасть в верхнюю строку на экране, и L - для перехода в нижнюю. Даже и не пытайтесь запомнить их все, Освойте пару команд, которые вы сможете применять, чтобы попасть куда нужно, и все будет хорошо. Только не забывайте, что действие всех этих команд зависит от регистра, на котором вводятся буквы. Введите строчную букву вместо прописной, и результат может быть непредсказуем.

Не лучше ли будет, если задействовать в vi те клавиши перемещения курсора, которые имеются на моей клавиатуре?

Нет! Выучите основные команды перемещения и используйте их. Если вы привыкнете к использованию клавиш управления курсором, рано или поздно нарветесь на неприятности: или вам придется работать на другой клавиатуре, или вы зарегистрируетесь с удаленного терминала, на котором используется другая клавиатура. Команды перемещения не зависят от типа клавиатуры, на которой вы работаете, чего нельзя сказать о клавишах управления курсором, коды которых могут восприниматься правильно, а могут и нет.

Могу ли я определить, в каком месте текущего файла нахожусь?

Да, нажмите CTRL-G. Это даст вам еще кое-какую дополнительную информацию типа того, был ли файл изменен с момента его последнего сохранения. Другой способ получить ту же информацию - ввести команду внешнего режима :f.

Как поменять местами два символа?

Поместите курсор на второй символ и наберите в командном режиме хр. Это сотрет второй символ, а потом поместит его перед первым, который передвинется под курсор.

Как поменять регистр символа?

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

###Вставка и замена текста###

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

Какие команды vi используются для вставки текста?

Вот краткий список основных команд:
i - вставить текст, начиная с позиции перед курсором, пока не будет нажата клавиша ESC;
I - вставить текст, начиная с начала текущей строки, пока не будет нажата клавиша ESC;
а - вставить текст за текущей позицией курсора, пока не будет нажата клавиша ESC;
А - вставить текст в конец текущей строки, пока не будет нажата клавиша ESC;
r - заменить символ в текущей позиции курсора;
R - заменить текст, начиная с текущей позиции курсора, пока не будет нажата клавиша ESC;
о - вставить новую строку за текущей строкой. ENTER вставит еще одну строку, ESC вызовет возврат в командный режим;
О - вставить новую строку перед текущей строкой. ENTER вставит еще одну строку, ESC вызовет возврат в командный режим.

Практически все эти команды вставки текста работают одним и тем же образом. Они изменяют командный режим, в котором вы находитесь, на режим ввода текста и позволяют начать вводить текст. Вся разница между ними состоит и том, куда будет вставлен вводимый текст. Есть в списке и стоящая несколько особняком команда r ("rr" в нижнем регистре), которая заменит один символ и немедленно возвратит редактор в командный режим.

Что можно сделать, если мне не нравится только что введенное слово?

Нажмите CTRL-W, чтобы перепечатать его. Это один из немногих случаев, когда вы можете изменить позицию курсора, не покидая режим ввода текста.

Что делать, если необходимо заново начать вставку текста?

Нажмите CTRL-U. Другой способ состоит в том, чтобы вернуться в командный режим, нажав ESC, а потом нажать u (undo) для отмены вставки. Команда отмены одноуровневая, она отменяет лишь результаты последней вставки, и если нужно что-нибудь отменить - сделайте это немедленно, иначе потом придется здорово помучиться.

Как отменить все изменения, сделанные мною в текущей строке?

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

Можно ли заменить текущий символ другим, а затем уже без перезаписи продолжать вставку текста?

Да, используйте команду s. Мы знаем, что можно заменить один символ командой г, и мы можем начать вставку текста по командам i или а, но, используя s, мы обходим ограничения команды г и можем не заботиться о том, что заменим что-нибудь такое, что заменять не нужно. Если вы хотите, чтобы было заменено десять символов, а потом началась вставка, просто наберите 10s и вводите текст.

Можно ли заменить текущую строку целиком?

Используйте S. Это сотрет текущую строку, переместит курсор к первой позиции и включит режим ввода текста.

Что именно можно делать с помощью команды "с"?

Эта команда может изменить слово, строку или предложение. В дсйсгйи-гельности, она может еще многое другое. Скомбинируйте простую команду с с усложненными командами перемещения курсора, и вы достигнете истинных высот мастерства. Но сначала - простые варианты, которые мы перечислим в табл. 4.1.

Таблица 4.1. Команда замены
Команда Результат
cw Заменяет текст от текущей позиции курсора до конца текущего слова
cnw Заменяет текст от текущей позиции курсора до конца л-го слова
cb Заменяет текст от начала текущего слова до символа, стоящего перед курсором
сnb Заменяет текст от начала п-го слова перед курсором до символа, стоящего перед курсором
с) Заменяет текст от текущей позиции курсора до конца предложения
с( Заменяет текст от начала текущего предложения до символа, стоящего перед курсором
ее Заменяет целую строку
с} Заменяет текст от текущей позиции курсора до конца абзаца
с{ Заменяет текст от начала текущего абзаца до символа, стоящего перед курсором
сfс Заменяет текст от текущей позиции курсора до первого появлений в тексте символа с
cnfc Заменяет текст от текущей позиции курсора до n-го появления в тексте символа с
cFc Заменяет текст от предшествующего положения в тексте символа с до текущей позиции курсора
cnFc Заменяет текст от n-го предшествующего положения в тексте символа с до текущей позиции курсора

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

Есть ли способ повторить последнее изменение в тексте?

Да. Используйте команду-точку (.). Этот простой прием экономит уйму времени. Требуется добавить пару пробелов в начало нескольких последующих строк? Что ж, можно разработать подходящую последовательность команд и написать макрос для ее выполнения (см. раздел "Макросы" далее в этой главе), а можно набрать в текущей строке I Escape ("|", ПРОБЕЛ, ПРОБЕЛ, ESC), нажать j, чтобы переместиться в следующую строку, и нажать клавишу. (точка). Повторите эту операцию столько раз, сколько есть строк, в которые нужно вставить отступы.

###Поиск (и замена) текста###

Какой самый простой способ поиска текста?

Ну вот, теперь мы переходим во внешний режим. И будем использовать набор команд редактора ex. Так, для того чтобы искать что-нибудь, начиная от текущей позиции курсора, мы будем использовать /searchpattern А для того чтобы искать в обратном направлении - ?searchpattern Образец для поиска searchpattern может быть простым кусочком текста, например, можно искать в файле слово "Priscilla", а может быть и более сложной строкой с использованием символов шаблона. Но пока не будем обсуждать этот последний случай,

Можно ли выполнять сразу поиск и замену текста?

Конечно, Ищите один образец и заменяйте его другим, используя команду подстановки внешнего режима. Ее синтаксис: х, ys/searchpattern/replace/options где х,у - это начало и конец зоны поиска и замены, searchpattern - искомый текст, replace - текст для замены, a options могут включать в себя g, означающее "сделать это повсюду и не приставать ко мне с дурацкими вопросами", или с - "запрашивать у меня подтверждение на каждую замену". Так, чтобы найти группу нелицеприятных упоминаний о вашем шефе и заменить их на "Priscilla", вполне сойдет команда 1,$s/catbrain/Priscilla/g В качестве замены для 1,S в этой команде можно использовать %, если экономия двух нажатий на клавиши стоит времени, потраченного на зазубривание этого приема.

Должен ли я знать, в какой строке документа нахожусь, чтобы запустить процесс подстановки в следующих десяти строках?

Нет. Используйте "." (точку) для обозначения текущей строки, а затем прикажите vi выполнить подстановку в следующие десяти строках: .,+l0s/fishbreath/Alfie/g Чтобы быть уверенным, что вы не меняете что-либо из того, что не имели в виду, используйте ключ с после последней косой черты. Это выведет на экран заменяемую строку, обозначенную символами "^". Нажмите Y для того, чтобы замена осуществилась, и что-нибудь еще, чтобы оставить все как есть.

Как осуществить операцию сразу над всем файлом?

Используйте "глобальную"- команду :g. Она даст вам возможность произвсти поиск по всему файлу и выполнить, например, команду yank (скопировать), чтобы добавить строки, соответствующие определенному образцу, в конец буфера. Например, :g/Priscilla/y A возьмет все строки, содержащие "Priscilia", и поместит их в конец буфера A, Эта команда позволяет вам осуществить весьма хитроумные комбинации, скажем, найти все строки, начинающиеся с цифры, и сдвинуть их на пять пробелов: :g/^[0-9]/s/^/ /g После использования этой команды текст на Fig. 4.1 будет отформатирован, как показано на Fig. 4.2.

Widget Sales Report
1. Sumatra
2. Shanghai
3. Senegal
4. Cincinnati
Cliamatic impact on widget sales
Widgets in the EcoSystem
Fig. 4,1, Текст до глобальной команды переформатирования
Widget Sales Report 
1. Sumatra
2. Shanghai
3. Senegal
3. Cincinnati
Climatic impact, on widget sales 
Widgets in the EcoSijstem

s:g/"I:0-9J/s/~/     /g
Fig. 4.2. После выполнения глобальной команды пронумерованные строки сдвинуты
Давайте поближе познакомимся с этой командой:
:           Выполнить эту команду в режиме ex.
g           Глобально.
/^[0-9]/    Искать строки, которые начинаются (знак ^) с цифры. 
s           Выполнить команду подстановки.
/^/     /g  Вставить пять пробелов (вы можете поместить столько пробелов,
            сколько захочется, между двумя последними косыми чертами) в 
            начало строки и сделать это повсюду, не запрашивая подтверждения.
Как вы могли заметить, эта команда дает нам великолепную возможность манипулировать текстом в vi, используя команды внешнего режима,

###Процедуры вырезания и вставки###

Какая команда используется для вырезания из документа строки и помещения ее в буфер вставки?

Просто - dd. Она вырезает одну строку текста. Ах, вы хотите еще 10 последующих строк? Это ненамного сложнее, введите 10dd, и они - в буфере вставки.

Можно ли просто скопировать строку в буфер вставки?

Да, нажмите уу. Команда yank, вызываемая таким образом, работает точно так же, как и dd, за исключением того, что строка (строки), которая копируется в буфер вставки, не стирается из документа.

Как вырезать из документа символ и поместить его в буфер вставки?

Используйте команду х. Она сотрет символ, на котором находится курсор, а строка сдвинется влево. Когда будет достигнут конец строки, начнут стираться символы перед курсором (забой). Чтобы осуществить операцию с десятью символами, используйте 10x. Совет - Буфер вставки имеет глубину в один уровень. Кая только вы выполняете операцию вырезания или копирования в буфер вставки, вы теряете то, что там было записано ранее. Так wo трижды подумайте, перед там как что-нибудь стереть или скопировать. Вы уже закончили работать с прежним содержанием буфера?

Я слышал, что вместо простого копирования части текста лучше использовать команду dd. Так ли это и почему?

Если вы копируете текст, в стек он не попадает, и можно использовать лишь то, что было скопировано последним. А если вы его стираете, он записывается в девятиуровневый стек (построенный по принципу "последний пришел - первый ушел"). Так что для того, чтобы добавить строку в стек, не стирая ее из исходного текста, введите dd, после чего сразу же - Р. Файл не изменился, а к буферу оказалась добавлена текущая строка. Теперь передвиньте курсор вперед и удалите что-нибудь еще. Хотите получить назад первую строку? Второе стирание протолкнуло ее на одну позицию в стек, и чтобы добраться до нее, выполните команду "2р, после чего она окажется вставленной после текущей строки. Очень удобно. Единственная проблема во всем этом - запомнить, что в каком буфере находится. Лучше использовать поименованные буферы, поскольку они не изменяются, пока их специально не перепишут, но если вы возьмете себе за правило использовать комбинацию ddP вместо уу, вы застрахуетесь от таких неприятностей, в сравнении с которыми лишнее нажатие клавиши - просто ерунда,

Можно ли с помощью поименованных буферов упростить редактирование?

Вне всяких сомнений. Использовать вышеописанные процедуры удаления и копирования неплохо, но как быть, если кусочек текста нужно взять отсюда, кусочек - оттуда? Уж, наверное, одноуровневый буфер здесь не подойдет. Не отчаивайтесь, vi предоставляет пользователю 26 "поименованных буферов". Такого числа пока хватало всем. Буферы именуются буквами от а до z, и вы можете вырезать или копировать в них текст точно так же, как это делается с обычным буфером для вырезания/копирования/вставки. Разве что перед командой "вырезать" или "копировать" (dd или уу) нужно поставить "а для вызова буфера а, "b - для буфера b и т. д.

Как лучше всего использовать для вставки содержимое поименованных буферов?

Поместите перед командой вставки "а, где а - поименованный буфер. Если текст, который нужно вставить, находится в буфере b, используйте "b, и т, Д.

Существует ли прием, позволяющий разместить содержимое буфера вставки сразу за текущей строкой?

Да, используйте команду р. Если вы вырезали или скопировали только часть строки, текст из буфера будет помещен в текущей строке после позиции курсора. Используйте Р, чтобы поместить текст перед текущей строкой или позицией курсора.

Как вырезать слово в буфер?

Используйте dw. В действительности это лишь частный пример более общего правила. Применяя dперемещение или yперемещение, можно вырезать или копировать текст в буфер. Команды перемещения курсора точно такие же, как и в команде с (табл. 4.1).

Как настроить редактор?

Настройка редактора текста - задача индивидуальная. То, что годится для одного пользователя, может абсолютно не подходить для другого. Поэтому хороший редактор позволяет вам изменять его поведение и внешний вид, чтобы работа в нем была комфортной. В vi существуют три основные команды для изменения вида и управления редактором. Все они относятся к внешнему режиму работы. Первая из команд :set. Используйте ее, чтобы установить всевозможные параметры. Их список может слегка изменяться от реализации к реализации vi, но можно назвать несколько самых распространенных, которые мы собрали и таил. 4.2.

Таблица 4.2. Параметры vi
Параметр Описание
аi Автоматический отступ: вновь создаваемые строки выравниваются по отступу предыдущей
noai Автоматический отступ отключен (по умолчаний)
aw Автоматическая запись: текущее содержимое буфера записывается при выводе из редактора или при переходе к следующему файлу по команде :n
noaw Автоматическая запись отключена (по умолчанию)
flash При ошибке вместо звукового сигнала вспыхивает экран (по умолчанию)
noflash Звуковой сигнал при ошибке
ic Не учитывать регистр при поиске и сравнении с символами шаблона
noic Учитывать регистр (по умолчанию)
lisp Установить режим автоматической вставки отступов, принятых При редактировании LISP-программ
nolisp Установить режим выравнивания начала строки по началу предыдущей (по умолчанию)
magic Использовать полный набор символов шаблона при сравнении с образцом (по умолчанию)
nomagic Ограничивает набор символов шаблона символами ^ и $
mesg Позволяет сообщениям, отправленным вам другими пользователями, появляться на экране вашего терминала
nomesg Отменяет разрешение появления текста на вашем терминале
nu Выводит номера строк вдоль левого края экрана
nonu Номера строк не выводятся (по умолчанию)
ro Только чтение; предохраняет файл от изменения до тех пор, пока режим не будет специально отменен командой ;w!
noro Обычный режим чтения/записи (по умолчанию)
remap Позволяет макроопределениям напрямую ссылаться на уже поданные команды (по умолчанию)
noremap Заставляет использовать полную форму записи в макроопределениях
showmatch Подсвечивает парную { или [, когда вводится закрывающая ] или }
noshowmatch Отменить showmatch (по умолчанию)
showmode Показывает индикатор режима на нижней строке в режиме ввода текста
noshowmode Текущий режим не индицируется (по умолчанию)
ts=n Установить размер табуляции, равный п пробелам. По умолчанию 8
warn Перед выходом в командную оболочку выводится предупреждение, если текст был изменен со времени выполнения последней команды записи (по умолчанию)
nowarn Выход в командную оболочку осуществляется без запроса подтверждения
ws Когда в ходе поиска достигается конец файла, он продолжается с его начала (по умолчанию)
nows He переходить к началу, когда в ходе поиска достигнут конец файла
wm-n Автоперенос, Если п задано не равным нулю, редактор автоматически вставляет новую строку, когда текущее слово заходит за заданную границу. К примеру, wm-8 задает правую границу для дисплея с длиной строки 80 символов на уровне 72-й позиции

А теперь, когда вы знаете, какие у vi параметры, выслушайте несколько бесплатных советов:

  • - Установите параметр showmode в положение "включено". Какая досада обнаружить, что в текст что-то вставляется из-за того, что вы нажали не ту клавишу. Простенькая настройка застрахует вас от этой неприятности, ненавязчиво напоминая, что включен режим ввода текста. Так что наберите :set sbowmode, чтобы включить этот параметр.
  • - Используйте режим автоотступа, когда пишете командные файлы или программы, чтобы сделать файлы удобными для чтения. Это позволит сделать удобочитаемыми конструкции типа if, case.
  • - Используйте showmatch, чтобы обнаружить парные скобки, когда набираете программы. Будет намного легче понять, какую пару скобок ны за-крынаете, так как курсор на секунду перепрыгнет на соответствующую открывающую скобку, а потом скакнет назад. В тех случаях, когда вы пишетене программу, а печатаете письмо или просто набираете текст, такой сервис может показаться несколько навязчивым. Отключите этот режим командой o-set noshowmode
  • - Поместите все "нормальные" установки параметров в. ехгс в вашем домашнем каталоге. Этот файл будет автоматически загружаться каждый раз, когда вы вызываете vi, при отсутствии файла с таким же названием в вашем текущем каталоге.
  • - Если для разных задач, которые вы решаете с помощью vi, используются различные установки параметров, создайте свой особый -ехгс-файл в каждом каталоге для каждой задачи. Если вы применяете vi для того, чтобы писать заметки о вашей работе над чем-нибудь, храните все эти заметки в одном каталоге. Довольно легко создать специальный файл .ехгс для каталога, который лучше всего подходит для их написания. Наверное, вам захочется установить для этого каталога wrapmargin=72, а в каталоге, пред-назначспмим для написания командных файлов, отключить в .ехгс автоматический перенос и включить автоотступ.
  • - Используйте комментарии в файле .ехгс, чтобы его было легче понять, Каждая строка этого файла, начинающаяся с кавычек ("), пропускается во время загрузки vi. Может быть, это чуть-чуть удлинит процесс, но зато на-миого проще будет вспоминать, почему вы установили тот или иной параметр, если в файле есть соответствующий комментарий. А как мы увидим в разделе, посвященном макросам, при использовании ссылок на команды это становится по-настоящему важным.
Формат файла .ехrс такой же, как если бы вы вводили команды в vi, находясь в командном режиме, так что выглядеть он будет примерно как на Fig. 4.3.
:set ai 
:set ts=5 
:set wm=5 
:set showmode 
:set snowmath 
:set nonii
:map ; :
:mар! #A uans
:abbr ux UNIX
Fig, 4.3.

###Макросы###

Что такое макросы?

Макросы нужны для того, чтобы автоматизировать ввод часто используемых последовательностей команд и сократить число нажатий на клавиши для постоянно повторяющихся действий. К тому же значительно проще запомнить, что нужно нажать CTRL-F1, чтобы произвести проверку орфографии и поместить список неправильно набранных слов is конец текущего файла, чем каждый раз вспоминать и набирать команды. В vi есть три типа макросов: команда :mар, которая исполняет последовательность нажатий на клавиши в командном режиме; команда :mар!, делающая то же самое, когда вы запускаете режим ввода текста; и :аbbr которая дает возможность ввести сокращения для часто используемых слов и выражений и автоматически восстанавливать их полную форму в режиме ввода. Можно непосредственно ввести эти команды в vi, когда включен командный режим, или включить их в .ехгс. Лично мы считаем, что полезно иметь разные наборы макросов для разных проектов и включать эти наборы в соответствующие файлы .ехгс, находящиеся в головном каталоге каждого проекта.

Каким образом можно автоматизировать набор последовательностей часто используемых команд?

Используйте команду :mар. Ее синтаксис: :mар key replacement Клавиша key может быть практически любой клавишей нa клавиатуре, но если это функциональная или управляющая клавиша, нужно сперва "отменить" ее значение, введя CTRL-V. Так, например, для того чтобы назначить комбинации CTRL-F1 запуск программы UNIX для контроля правописания и поместить результаты в конец текущего буфера (файла), нужно использовать команду :mар #^ G:w!^M:r !spell %M Нажатие клавиши ENTER вызовет окончание процесса назначения, поэтому вам следует использовать последовательность нажатий на клавиши: "CTRL-V, CTRL-F1, ПРОБЕЛ, Q:w!, CTRL-V, ENTER, :г, ПРОБЕЛ, !spell, ПРОБЕЛ, %, CTRL-V, ENTER". Результаты нажатия клавиш ENTER "модифицируются" идущими перед ними CTRL-V, В итоге в команде появляется ^М или CTRL-M, что фактически и является сканкодом этой клавиши. Ну а что, собственно, выполняет эта команда? Сначала осуществляется переход к концу буфера: "G". Затем текущее содержимое буфера записывается в дисковый файл без запроса подтверждения: ":w!Enter". Далее в буфер считывается результат запуска программы проверки правописания текущего файла ":г! spell%Enter". Общее число команд :mар и :map!, которые вы можете определить одновременно, в большинстве версий vi не превышает 32, каждая из них не может быть длиннее 512 символов. Этого более чем достаточно для большинства задач, особенно если вы будете хранить команды в отдельных файлах .ехгс для каждой задачи, как подсказывает здравый смысл.

Существует ли способ автоматизировать задачи, наиболее часто выполняемые в режиме ввода текста?

Да. используйте команду :map!. Например, если вы относитесь к людям, которые любят часто сохранять текущие результаты работы (похвальная привычка, хотя vi обычно способен восстановить текст даже после сбоя системы или аварии с электропитанием), вы найдете ,)здесь простой макрос, сохраняющий текущую работу и позволяющий продолжить ее без потери места в файле: :map! #= ^ [:w!^Ma Эта команда, которая назначается плавите F3, начинается с escape, чтобы перейти в режим команд, затем последовательность ":w!Enter"- записывает текущий файл на диск, и, наконец, "a"- возвращает вас назад в режим ввода текста именно туда, где вы его покинули. Отметим, что клавиши "ESC"- и -"ENTER" должны быть отменены CTRL-V, иначе они будут неправильно интерпретированы.

Можно ли использовать команду :mар! для создания новой команды, которая в режиме ввода текста выполняла бы ту же функцию, что и CTRL-G в командном режиме, - показьвала, где я нахожусь в текущей строке?

Было бы удобно узнать, в какой точке файла вы находитесь, не переходя в командный режим и возвращаясь назад. В действительности, выходить и возвращаться все равно придется, но можно это все сделать автоматически: :map! ^G ^[^V^Ga Здесь есть небольшая хитрость. Поскольку у CTRL-Q имеется специальное значение, это сочетание нельзя вводить просто так, а если ввести одиночное CTRL-V,это сбросит то, что вы пытаетесь сделать. Хитрость заключается в том, что первое CTRL-Q вводится с CTRL-V, CTRL-G, затем CTRL-V, ESCAPE, CTRL-V, CTRL-V, CTRL-G и, наконец, "a", чтобы вернуться в режим ввода текста.

Как упростить набор наиболее часто встречающихся фраз?

Используйте :аbbr. Это настолько просто, что вы должны делать это, не задумываясь, как только поймете, что несколько раз вводите одну и ту же фразу. А еще удобно сформировать стандартные фразы, чтобы вся рабочая группа использовала одни и те же выражения, когда это необходимо. Например, когда мы писали эту главу, сочетание ".pgvi.pgx" должно было быть использовано несчетное число раз. Его приходилось бы применять каждый раз, когда нужно было что-нибудь оформить в виде строки кода программы, а не обычного гекста. Наш издатель требовал, чтобы ".pg" - стояло перед началом листинга, a ".pgx" - в конце. Право, вводить все это было слишком утомительно. И тогда мы добавили следующее сокращение к моему .ехгс-файлу: :аbbr vvi .pgvi.pgx Когда вы набираете текст, сокращения автоматически разворачиваются до полного значения, что разительно отличает vi от некоторых процессоров текста, которые ждут, что вы явно укажете им развернуть сокращения.

###Другие важные команды###

Как записать в файл сделанные изменения и выйти из редактора vi?

Чтобы сохранить результаты работы и выйти из редактора, можно использовать ZZ в командном режиме или :wq во внешнем режиме. Нам кажется, что :wq - более естественная команда, да и набрать ее легче, но каждому - свое, И вообще, вы вольны назначить часто используемые команды каким-нибудь клавишам. С WordPerfect мы работаем так долго, что в конце концов назначили эту операцию клавише F7: map^[[S:wq!^M. Некоторые наши знакомые назначают ее клавише ALT-F4.

Можно ли вставить в текущий файл содержимое другого файла?

Да. Используйте команду :r (read - читать). Этот прием очень удобен, если вы, например, хотите включить в документ стандартный заголовок, который слишком велик, чтобы назначить его какой-нибудь клавише, или использовать сокращение.

Можно ли переписать часть текущего файла в новый файл?

Конечно. Вам нужно лишь указать команде write, какую часть и куда. Чтобы переписать файл целиком, можно применить короткую форму команды записи :w. А чтобы сохранить текущую строку и десять строк, следующих за ней в файле с именем "junk", используйте write: :.,+10w junк В результате текущая строка и десять следующих за ней будут записаны в файл с именем "junk".

Помогите! Что мне делать, если я знаю, что сотворил что-то ужасное в своем файле?

Используйте команду :q! для выхода без сохранения. Это всегда помогает.

Что такое "команда аккуратного выхода" из редактора?

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

Как мне определить, сколько слов и строк имеется в файле?

Вы можете пропустить файл через утилиту UNIX для подсчета слов - wc, чтобы определить, сколько слов или строк в файле. Утилита может легко справиться и со списком файлов. Чтобы получить суммарное число слов, строк и байтов для семи cat-файлов в каталоге /save, используем команду $ we -lwc *.cat

Результат:
14	34	57J	alfiR.cat
140	730	6346	guz.cat
280	1580	12692	haroid.cat
56	311	2600	mesp.cat
70	395	3173	possni.cat
265	1496	12119	pris.cat
560	3160	25384	Stanley.cat
1386	7816	62887	total
Этот листинг показывает, что у нас в семи файлах в сумме 1386 строк, 78Э6 слов и 62887 байт текста. Так что котов в нашей жизни хватает (cat - кот).

Что случится, если система откажет что того, как я успею записать в файл сделанные изменения?

Быстро! Используйте команду восстановления. Если процесс выхода из vi был прерван из-за сбоя системы, вы практически всегда сможете восстановить то, что наработали, с помощью специальной команды vi -к имя_файлa.



Украинская Баннерная Сеть

Главная  Алфавитный индекс  Справка  Добавить FAQ  E-mail
Новости  Поиск по сайту

Copyright © 2001 - 2002 Olexandr Slobodyan.
Сайт создан в системе uCoz