четверг, 31 января 2013 г.

Знакомство с vi

Текстовым редактором (text editor) называют программу, которая предназначена для редактирования (составления и изменения) файлов, содержащих только текст, например: письмо, программа на языке C, системный конфигурационный файл.

При том, что имеется много различных редакторов для системы Linux, единственный, чье присутствие будет гарантировано в любой системе UNIX или Linux — это vi (visual editor). Редактор vi не является самым простым в использовании, и его интерфейс не очень понятен сам по себе. Однако ввиду своей распространенности, а отчасти и потому, что владение им в некоторых ситуациях необходимо, ему посвящается внимание в этой заметке. 

В любой момент при работе в редакторе vi мы находимся в одном из трех режимов редактора:
  • командный режим (command mode);
  • режим ввода (insert mode);
  • режим последней строки (last line mode).

При запуске редактора vi мы оказываемся в командном режиме. 

В этом режиме можно давать команды для редактирования файлов или перейти в другой режим. 
Например, вводя x в командном режиме мы удаляем символ, на который указывает курсор. Клавиши-стрелки перемещают курсор по редактируемому файлу. 
Как правило, команды, используемые в командном режиме, состоят из одного или двух символов.

Основной ввод и редактирование текста осуществляется в режиме ввода. 

При использовании редактора vi основное время, скорее всего, будет проводиться именно в этом режиме. 
Переход в режим ввода из командного режима осуществляется командой i (от слова insert). Находясь в режиме ввода, можно вводить текст в то место, куда указывает курсор. 
Выход из режима ввода в командный режим осуществляется клавишей Esc.

Режим последней строки — это специальный режим, в котором редактору даются сложные команды. 

При вводе этих команд они отображаются в последней строке экрана (отсюда пошло название режима). 
Например, если ввести в командном режиме команду : то осуществится переход в режим последней строки, и можно будет вводить такие команды, как wq (записать файл и покинуть редактор vi) или q! (выйти из редактора vi без сохранения изменений)
В режиме последней строки обычно вводятся команды, название которых состоит из нескольких символов. В этом режиме в последнюю строку вводится команда, после чего нажимается клавиша Enter, и команда исполняется.

Запустить vi можно введя в терминале:
$ vi file_name
где filename — имя файла, который надо редактировать/создать.

Пример: создадим файл с помощью vi, с именем test_1, и запишем в него Это мое первое предложение записанное с помощью vi.

$ vi test_1
На экране будет примерно следующая картинка:

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

Редактор vi сейчас находится в командном режиме. Нажмем клавишу i или insert, и редактор перейдет в режим ввода текста. 
Теперь вводим следующий текст:
Это мое первое предложение записанное с помощью vi. <дальше что хотите>

Для переноса строки, можно воспользоваться клавишей Enter
Исправлять опечатки можно с помощью клавиши Backspace и Del
Для выхода из режима ввода и возвращения в командный режим нажмем клавишу Esc.

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

Помимо команды i/insert, есть еще несколько способов вставить текст. 
Так, команда a начинает вставлять текст после текущего положения курсора, а не прямо в текущую. 
Например, приведем с помощью клавиш-стрелок курсор к пробелу, разделяющему слова новая и строчка:

Нажмем теперь клавишу a (редактор перейдет в режим ввода) и введем слово красивая, после чего нажмем клавишу Esc и вернемся в командный режим. 
На экране будет следующее:

Для того, чтобы начать вводить текст со следующей строки, используем команду o
Нажмем эту клавишу и введем еще текст:
Я перешел на эту строку с помощью команды "o".

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

а текст: 
с помощью команды «o» 
удалился.

Можно удалять целые строки командой dd (то есть нажав клавишу d два раза подряд). 
Если курсор стоит на третьей строке, и мы введем команду dd, на экране останется следующее:

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

Отдельные части текста можно заменять на другие; для этого используется команда R.
Подведем курсор к первому символу в слове новая, нажмем клавишу R и введем слово синяя.

Действие команды R напоминает действие команд i и a, однако при команде R новый текст не вставляется, а стирает старый. 
То есть если вы вводите слово длиннее или короче прежнего, то некоторые лишние символы остаются, и наоборот.

Команда r заменяет один символ, а именно тот, на который указывает курсор. 
Например, подведем курсор к началу слова синяя, введем команду r и за ней букву з
На экране возникнет следующее:

С помощью команды ~ можно поменять регистр буквы, на которую указывает курсор (с верхнего на нижний и наоборот). 
Например, если подвести курсор к букве э в слове это и нажимать клавишу ~ много раз, то в конце концов возникнет:

В дополнение к клавишам-стрелкам можно для движения курсора использовать клавиши h, j, k и l. Они будут сдвигать курсор соответственно влево, вниз, вверх и вправо. Этими командами можно воспользоваться, если (по какой-нибудь причине) клавиши-стрелки действуют неправильно. 
Команда w перемещает курсор на начало следующего слова; 
команда b перемещает курсор на начало предыдущего слова.

Команда 0 (клавиша ноль) перемещает курсор на начало текущей строки;
команда $ перемещает курсор в конец текущей строки.

При редактировании больших файлов возможно пригодится «перелистывать» целые экраны вперед (вниз) и назад (вверх)
для этого используются команды соответственно Ctrl-F и Ctrl-B, для простоты запоминания Front — вперед (вниз), Back — назад (вверх).

Для того, чтобы переместить курсор в конец файла, используется команда G. Можно также поместить курсор на строку с данным номером; 
например, команда 10G поместит курсор на строку с номером 10. 
Для того, чтобы переместить курсор в начало файла, можно использовать команду 1G или gg.

Команды движения курсора можно совмещать с другими командами, например, с командами удаления текста. 
Например, команда d$ удалит все, что находится между текущим положением курсора и концом строки; 
команда dG удалит все, что находится между текущим положением курсора и концом файла и т.д.

Для выхода из редактора vi без сохранения изменений, сделанных в файле, используется команда :q!
Когда вводится команда :, курсор переходит на последнюю строку экрана, и таким образом редактор оказывается в режиме последней строки.
В этом режиме возможно вводить некоторые расширенные команды. 
Одна из них — команда q!, которой завершается работа с редактором vi без сохранения сделанных изменений.

Команда :wq сначала сохраняет файл со сделанными изменениями, а затем выходит из редактора vi.

Команда ZZ (выданная в командном режиме, т.е. без введения команды :) эквивалентна команде :wq. Если файл со времени последней модификации не изменялся, то время создания файла также не будет изменено.

Напомню, что в режиме последней строки введение команды завершается клавишей Enter.

Чтобы сохранить файл, но не выходить из редактора vi, используется команда :w.

Для того, чтобы приступить к редактированию другого файла, используется команда :e.
Например, чтобы прекратить редактирование файла test_1 и вместо этого начать редактирование файла test_2, надо ввести команду:
:e test_2

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

Это сообщение означает, что после последней модификации не было сохранения файла, и редактор vi отказывается приступить к редактированию другого файла. 
Сейчас можно либо сохранить сделанные изменения командой :w и затем вводить команду :e, либо использовать команду:
:e! test_2

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

Включить в текущий файл содержимое другого файла можно командой :r.
Например, команда:
:r test_1
вставляет содержимое файла test_1 в пустой файл test_2.

Из редактора vi можно выполнять команды оболочки. 
Команда :r! работает аналогично команде :r, но вместо содержимого другого файла она вставляет в редактируемый файл выдачу некоторой команды.

Например, введя команду:
:r! ls -l /tmp
мы получим примерно следующее содержимое

Можно также «временно выйти» из редактора, запустить команду и затем вернуться обратно.
Например, если будет введена команда:
ls /tmp 
то команда ls /tmp будет исполнена, ее результат будет выдан на экран, но выдача вставлена в файл не будет

Если используется команда :shellто редактор vi запускает сеанс (instance) командной оболочки, прерывая редактирование на время исполнения команд. 
Для выхода из оболочки и возвращения к редактированию надо ввести команду exit.

Как и в случае с любой программой в системе Linux в первую очередь следует обратиться к экранной документации к программе vi. 
Следует знать также, что редактор vi является пользовательским интерфейсом редактора ex, который выполняет многие из команд режима последней строки редактора vi. 
Поэтому, в дополнение к сказанному выше, можно также читать экранную документацию к редактору ex
Обычно (кроме режимов восстановления после системных сбоев) нам доступна более современная и улучшенная версия vi — vim, который имеет аналогичный vi интерфейс, поддерживает все команды vi и кроме того — массу дополнительных возможностей.
Подробное руководство по vim можно получить, запустив этот редактор и отдав команду :help

Комментариев нет: