Так уж исторически сложилось, что операционные системы Unix считаются очень сложными и недружественными по отношению к пользователям. И одним из олицетворений этого часто называют редактор vi. По мере того, как набирает обороты Linux, позиционируемый как система более дружественная, среди его пользователей все большую популярность приобретают более привычные редакторы, особенно тот, который встроен в Midnight Commander (поскольку всегда под рукой), и старый добрый vi начинает забываться. Тем не менее, этот редактор обладает непревзойденной на сегодняшний день мощью, функциональностью, универсальностью и удобством работы, а кроме того, разработан в полном соответствии с идеологией Unix. Чтобы не быть голословным, приведу несколько примеров (синтаксис команд редактора, которые в них встретятся, будет подробнее рассмотрен ниже):
1. Задача: в середину некоторой статьи нужно вставить вывод команды "ipfw show" (или любой другой). Попробуйте сделать это, используя Ваш любимый редактор, а затем посмотрите, как это делается в vi.
Конечно же, будучи квалифицированным пользователем, Вы не стали вбивать результат вручную, а перенаправили вывод в файл, который объединили с файлом статьи:
# ipfw show > buffer # cat article buffer > temp # mv temp article
После чего, воспользовавшись функциями редактирования блоков (Ваш же редактор позволяет это?), перенесли блок в нужное место. Конечно, с помощью Midnight Commander можно сделать то же самое проще:
# ipfw show > buffer # mcedit article
Идем в точку в которую нужно вставить блок, затем жмем F9 и выбираем в меню "Файл" пункт "Вставить файл:", указываем путь к файлу buffer.
Ну а с помощью vi это выполняется одной командой:
!lipfw show
2. Предположим, что у Вас есть пронумерованный список из 12 пунктов. Вам нужно вставить два пункта, начиная с третьей позиции, и соответственно поправить номера всех нижележащих пунктов. Наверняка решать эту задачу Вам придется руками. Vi позволяет сократить число операций до минимума. Для первого пункта списка, номер которого нужно поменять, ставим курсор на его номер и даем команду "2#+", после чего на номере каждого последующего пункта просто давим символ ".".
3. Двадцать четыре строки в тексте нужно сдвинуть вправо символом табуляции. Конечно, не проблема минутку пощелкать "Tab - Стрелка вниз - Home", но vi предлагает более элегантный способ: "23>j" над первой строкой. И все.
Надеюсь, мне удалось убедить Вас в том, что vi - один из лучших текстовых редакторов для систем Unix. Ниже мы более подробно рассмотрим его особенности, синтаксис некоторых команд, коротко коснемся режимов ex и view. Чтобы учесть интересы читателей с разным уровнем подготовки, данная статья будет разбита на следующие подразделы:
Мне не хочется захламлять статью снимками экранов, поэтому, если Вы не очень хорошо знакомы с vi, настоятельно рекомендую Вам читать ее перед монитором и сразу пробовать те примеры, которые будут описаны ниже, чтобы "почувствовать" этот редактор.
Итак, vi - текстовый редактор, входящий в поставку практически всех операционных систем семейства Unix. Запуск его осуществляется командой:
# vi [filename]
Помимо основного (visual) режима, он может быть запущен в командном режиме, называемом ex (от англ. execute) ориентированном на работу со строками, и в режиме view (только для чтения). Запуск этих режимов осуществляется с ключами -e и -R, или командами ex и view соответственно:
# {vi -e | ex} [filename] # {vi -R | view} [filename]
Если файл с таким именем существует в текущей директории, то он будет открыт для редактирования. Ну а если его нет, то будет создан новый файл. Если команда vi дана без параметров, будет запущено редактирование нового файла, создаваемого во временном каталоге, заданном переменной окружения TMPDIR (обычно это папка /tmp) с именем типа vi.L14259 (часть после точки создается случайным образом, чтобы обеспечить уникальность создаваемого файла). В дальнейшем Вы сможете сохранить набранный файл под любым именем.
Если Вы последовали моей рекомендации и сразу проверяете все на практике, то первое, чему Вы должны научиться, это выходить из редактора. Дело в том, что в vi Вам не помогут ни <escape>, ни <Alt+X>, ни даже <Ctrl+C>. Нет в нем и так любимой народом верхней строчки, именуемой "Главное меню". Так же он не будет отображать то, что Вы попытаетесь набрать (хотя, если в панике начать беспорядочно стучать по клавиатуре, то может случиться "чудо" и Ваш набор станет появляться на экране, однако выйти из редактора это Вам все равно не поможет). Так что абсолютно черный экран с одинокими тильдами по левому краю, никак не реагирующий на нажатия клавиш и не позволяющий вернуться в оболочку иначе, как "килянием" процесса из соседнего терминала (если Вы, конечно, умеете пользоваться командой kill - иначе только Reset), может надолго отбить охоту запустить этот редактор еще раз. Поэтому сначала ознакомьтесь со следующей таблицей, которая поможет Вам поверить в то, что vi - это действительно редактор:
Команда | Описание |
---|---|
:q! | Выход без сохранения |
:w | Сохранение изменений |
:w <filename> | Сохранение как <filename> |
:wq | Выход с сохранением |
:q | Выход, если файл не изменялся |
i | Переход в режим вставки символов в позиции курсора. |
a | Переход в режим вставки символов в позиции после курсора. |
o | Вставка строки после текущей |
O | Вставка строки над текущей |
x | Удаление символа в позиции курсора |
dd | Удаление текущей строки |
u | Отмена последнего действия |
<escape> | Возврат в режим команд |
Команды, начинающиеся с символа ":", будут отображаться в нижней строке. Остальные выполняются "молча". Редактор vi имеет два режима работы - режим команд и режим редактирования.
Запускается он в командном режиме, так что все нажатия на клавиши трактуются как команды. Нажатие клавиш "i", "a", "o", "O" и ряд других переводят vi в режим вставки, когда набираемые символы трактуются как текст и отображаются на экране.
Возврат к режиму команд выполняется клавишей <escape> или в некоторых случаях автоматически, например, при попытке передвинуть курсор левее первого символа в строке (в редакторе vim, являющемся модернизированным вариантом vi и часто заменяющем его в Linux, в этом случае редактор остается в режиме вставки). Автоматический переход в командный режим обычно сопровождается звуковым сигналом, как и ошибочная команда.
Чтобы почувствовать все это, выполним небольшое практическое упражнение. Находясь в своем домашнем каталоге, запустите редактор командой:
# vi test.txt
Далее нажмите "i", чтобы перейти в режим вставки. Теперь все нажатия на клавиши будут трактоваться как ввод текста, и символы будут отображаться на экране с позиции курсора. Наберите "Hello, world!". Постарайтесь не ошибаться, поскольку исправление ошибок, как и все остальное, имеет здесь свои особенности, о которых мы поговорим ниже. Нажмите <escape> для возврата в командный режим. Наберите ":wq" и нажмите <enter>. Убедитесь, что файл test.txt действительно создался. После этого небольшого задания Вам будет проще представлять то, о чем пойдет речь далее.
Аналогично команде "i", в режим вставки можно перейти, нажав клавишу "a". Единственное отличие - текст будет вставляться не перед символом, на котором находится курсор, а после него. Кроме того, режим вставки может быть вызван командами "o" и "O". Первая из них добавляет пустую строку после, а вторая - перед текущей строкой, и дальнейший ввод символов трактуется как ввод текста.
Чтобы удалить символ, нужно перейти в режим команд и над удаляемым символом
нажать клавишу "x". В режиме вставки удалить только что введенный ошибочно
символ можно клавишей
Удалить целиком строку, на которой находится курсор, можно командой "dd"
(просто нажмите два раза клавишу
Чтобы определить, где находится конец строки, нажмите клавишу "$" (вы,
должно быть, уже заметили, что клавиши <Home>, <End> и т.п. тут не работают).
При навигации по экрану ( можно пользоваться стрелками, хотя есть и более
"правильный" способ) курсор перемещается не по экранным линиям, а по строкам
текста.
Если Вы что-то сделали не так, то отменить последнюю операцию можно
командой "u". Эта команда отменяет только последнее действие, то есть ее
повторное применение отменит только что сделанную отмену. Конечно, отсутствие
истории операций - один из серьезных недостатков vi, однако если работать
вдумчиво и внимательно, то он почти незаметен. Собственно, идеология
Unix-систем такова, что они не особо балуют пользователя подсказками и
возможностью отката выполненных операций, так что сразу настраивайтесь
на ответственную работу.
Учтите, что по команде "u" отменяется вся команда целиком. Например, если
Вы дали команду "i", набили 3-й том "Войны и мира" и вернулись в режим
команд, то "u" отменит весь этот ввод. Если ошибок получилось слишком много,
можно выйти из редактора без сохранения сделанных изменений (команда ":q!").
В принципе, этих сведений достаточно, чтобы отредактировать файл. Однако
вряд ли Вы поверили, что vi - удобный редактор. Понимаю, как Вам хочется
крикнуть "Аццтой!" и нажать <F4> в своем любимом mc, но все же найдите в
себе силы дочитать статью до конца и попрактиковаться с vi хотя бы пару
недель. Думаю, Ваше мнение изменится.
В дальнейшей части статьи некоторые команды и их применение будут рассмотрены
более подробно. За описанием всех остальных команд отсылаю читателя к с
траницам справочного руководства "man vi", в полном соответствии с идеологией
Unix.
Эта часть статьи посвящена командам навигации, которые позволят Вам быстро
и эффективно перемещаться по редактируемому тексту. Как и все в vi, эти
команды так же имеют свою специфику, и их удобство и продуманность начинают
осознаваться только через несколько месяцев работы. Хотя и новичок найдет
среди них полезные и интересные.
В общем случае по тексту можно перемещаться, используя клавиши со стрелками.
Но vi разработан таким образом, чтобы в процессе работы руки не покидали
основной рабочей зоны клавиатуры. Те, кто владеет методом "слепой" печати,
по достоинству оценят эту особенность. Кроме того, это позволяет не
заботиться о совместимости клавиатур и терминалов - vi будет полностью
функционален даже на самых тупых терминалах.
Команды навигации и поиска представлены ниже. Запись "№" означает число,
которое набирается перед вводом команды (при этом на экране оно не
отображается) и задает число повторений команды или в некоторых случаях
номер строки, к которой команда должна быть применена. Если число не задано,
команда выполняется один раз.
Команды перемещения курсора:
Так же существует масса команд для перемещения по словам, группам символов,
предложениям, параграфам. При этом под "словом" будет пониматься
последовательность символов, разделенных пробельными символами. Термином
"группа символов" будем именовать последовательность символов, не разделенных
специальными символами (такими как дефис, точка, запятая и т.д.). В терминах
vi эти две единицы именуются "большим словом" (bigword) и "словом" (word)
соответственно. Предложение - последовательность слов, ограниченная точкой
или пустой строкой. Параграф - часть текста, обрамленная пустыми строками.
Чтобы Вы знали, что искать, просто перечислю эти команды: B, W, E, b, w, e,
(, ), {, }, <Ctrl-F>,
<Ctrl-B>, <Ctrl-D>, <Ctrl-U>, <Ctrl-E>, <Ctrl-Y>.
Познакомиться с ними можно на страницах "man vi" или методом "научного тыка".
Например, команда "5<Ctrl-Y>" прокрутит экран на 5 строк вниз, не перемещая
курсор (очень полезна, если Вам нужно увидеть несколько строк выше и затем
продолжить редактирование текущей строки).
Еще несколько полезных команд навигации:
С помощью следующих двух команд Вы сможете расставлять "маркеры" в тексте,
и затем быстро переходить на эти метки:
Например, запомнив начало второго параграфа как "m2", Вы в дальнейшем
сможете возвращаться к нему командой "`2".
С поиском вроде все понятно, ничего пояснять не буду:
Предыдущие четыре команды должны обязательно завершаться нажатием клавиши
<Enter>.
Помимо рассмотренных выше команд "i" и "a", полезны будут и следующие:
Рассматривая две предыдущие команды, необходимо указать на одну особенность.
Использование оных со счетчиком № не добавляет № пустых строк, как следовало
бы ожидать. Добавляется одна, редактор переходит в режим ввода, а затем,
после возврата в командный режим, введенный блок текста будет повторен № раз.
Кстати, и команды вставки ведут себя аналогичным образом - сначала Вы
получаете возможность вставить или добавить текст, начиная с соответствующей
позиции курсора, после чего, в момент возврата в режим команд, введенный
Вами текст будет продублирован № раз. Выполните команду "5i", введите текст
"echo ", вернитесь в режим команд (<escape>) и посмотрите, что из этого
получится. Данный комментарий относится и к ряду команд, перечисленных ниже.
Поясним эту команду. Пусть у нас есть строка с текстом "This is a big string".
Мы хотим слово "big" заменить более справедливым "small". Поставим курсор
на букву "b" (естественно, используя команду "fb" - мы же уже не маленькие,
чтобы стрелочками по тексту скакать). Заменить нам нужно три символа, поэтому:
"3s". Теперь просто вводим наше "small" - первые три символа введутся в
режиме замены, последующие добавятся, не затирая то, что нам нужно. Теперь
<escape>, и любуемся на дело наших рук, не забывая при этом громко
восхищаться редактором.
Все вышеприведенные команды переводят vi в режим вставки текста, то есть весь
последующий ввод будет отображаться на экране начиная с указанной позиции.
Для возврата в командный режим используется комбинация <Ctrl-C> или клавиша
<escape>.
В предыдущих двух командах (впрочем, как и в остальных) направление задается
командами управления курсором "h", "j", "k", "l" или стрелками. Так, если
выбрано "вправо" или "влево", то команда сдвига действует только на текущую
строку, № игнорируется. Если "вверх" или "вниз", то сдвигается данная строка
и № предыдущих или последующих соответственно.
Vi предоставляет пользователю весьма мощные функции по работе с блоками.
Используя команды расширенного (ex) режима, можно работать с несколькими
блоками. Где изучить эти возможности, Вы, думаю, уже знаете. Конечно же,
в "man vi".
Находясь в режиме редактирования, редактор все вводимые символы будет
отображать на экране как часть текста. Однако существует несколько
последовательностей, которые трактуются как специальные команды и для
которых выполняется автоматическая замена введенных символов
последовательности результатом выполнения команды. Наиболее полезные из
них следующие:
Осталось рассмотреть еще несколько команд, которые трудно выделить в ту
или иную категорию, но которые весьма полезны при работе.
Здесь test - имя редактируемого файла. Нужно заметить, что если Вы вызываете
vi из Midnight Commander, то в списке приостановленных заданий вместо
"vi test" будет отображаться "midc" ("mc" для Linux).
После этих действий Вы вернетесь назад в vi и сможете завершить редактирование.
Если отложенное задание только одно, можно вернуться к нему командой fg без
параметров.
Редактор vi имеет, помимо рассмотренного, еще один интерфейс, или режим, - ex.
Запустить редактор в этом режиме можно одной из следующих команд:
Кроме того, Вы можете перейти в него из режима visual по команде "Q". Данный
интерфейс предоставляет ряд расширенных возможностей для обработки текста,
таких как работа с несколькими буферами, открытие других файлов в текущем
сеансе, изменение настроек редактора и т.д. В данном разделе будут рассмотрены
лишь наиболее полезные из них.
В отличие от интерфейса vi, ex ориентирован на командную работу со строками.
Редактирование идет как бы вслепую. Редактируемый текст на экране по умолчанию
не отображается, Вам придется специально вызывать на экран требуемые строки.
Почти все ex-команды можно исполнить из vi-интерфейса, предварив команду
двоеточием. Наиболее характерный пример - команда выход из редактора: ":q".
Ниже приведено лишь несколько полезных команд:
Например, если Вы вызываете редактор командой "vi file1 file2", то в процессе
редактирования Вы сможете переходить между файлами указанными выше командами.
При этом содержимое буферов обмена будет сохраняться, и Вы сможете вставлять
в файл фрагменты, скопированные из другого файла. Заметьте, что редактор не
позволит Вам перейти к другому файлу, пока изменения в текущем не будут
сохранены или отменены (отменить все изменения можно командой ":e!", которая
перечитает редактируемый файл с диска).
Еще одно пояснение - очень часто бывает, что отредактировав тот или иной
файл (например, squid.conf), при попытке сохранить сделанные изменения
Вы получаете сообщение, что файл недоступен для записи. Причина понятна -
или Вы забыли войти как root, или файл имеет права "r--r--r--". Выходить
без сохранения, менять права и редактировать снова - жалко: А вот сохранить
файл под другим именем, а затем, обретя требуемые права, заменить им
оригинал - как раз то решение, которое нас устраивает. Конечно можно с
другого терминала поменять права на сохраняемый файл и снова провести
операцию записи. Но при удаленной работе открыть новую ssh-сессию не всегда
проще, чем поступить описанным выше образом. Да и удаленный доступ к
нескольким терминалам иногда запрещают из соображений безопасности. Кроме
того, если Вы внесли изменения в системный файл (скажем, /etc/crontab), б
удучи зарегистрированным как простой пользователь, то вряд ли безопасно
менять к нему права доступа, пусть и кратковременно. Кроме того, статья
рассматривает редактор vi, а потому примеры призваны прежде всего показать
его пригодность для решения тех или иных задач, пусть и не всегда оптимальным
образом :).
Было бы странно, если бы оказалось, что столь мощный редактор не позволяет
настраивать себя под требования и предпочтения конкретного пользователя.
Однако не следует думать, что настройкой можно превратить vi в редактор ee
или что-то подобное. Следующие опции позволяют лишь добавить "удобства", не
меняя общих принципов работы. Все они устанавливаются с помощью ex-команды
":set". "no" перед именем опции отключает ее.
За остальными настройками, как всегда, - "man vi", соответствующий раздел.
Увековечить сделанные настройки можно в exrc-файлах. Данные файлы применяются
в следующей последовательности:
Действовать будут те настройки, которые применены последними. В эти файлы
следует занести те ex-команды, которые должны быть исполнены при открытии
редактора. Например, если Вы хотите, чтобы редактор всегда работал с
включенным отображением режима и расширенными сообщениями, то создайте в
своем домашнем каталоге файл .exrc следующего содержания:
Теперь каждый раз при вызове редактора эти команды будут отрабатываться
автоматически.
Итак, Вы в общих чертах познакомились с редактором vi. Приведу еще несколько
преимуществ редактора vi, помимо его функциональности:
Попытайтесь с ним подружиться!
P.S. Если Вы все же отважились сделать vi Вашим основным редактором, для
этого установите значение переменной $EDITOR=vi (например, для оболочки sh
нужно поправить файл .profile в Вашем домашнем каталоге, для csh - это файл
.cshrc). Также в настройках Midnight Commander отмените использование
встроенного редактора (пункт меню "Настройки" - "Конфигурация:"), и по
<F4> будет вызываться тот редактор, который задан в переменной $EDITOR.
Команды перемещения и поиска.
Команды поиска:
Команды редактирования и форматирования.
Работа с блоками и буфером
Команды режима редактирования
Прочие команды режима visual
$ exit
You have stopped jobs.
$ jobs
[1] 34336 Suspended vi test
$ fg 34336
Команды режима ex
# vi -e
# ex
Опции и параметры редактора
set showmode
set verbose
Заключение
© Amsand, 2004 (вер. от 05.11.2004)
mailto: amsand@yandex.ru