Библиотека сайта rus-linux.net
Фундаментальные основы Linux. Часть V. Текстовый редактор vi
Оригинал: Linux FundamentalsАвтор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 20 декабря 2014 г.
Глава 20. Начальные сведения о текстовом редакторе vi
Текстовый редактор vi установлен практически в каждой системе Unix. При установке дистрибутивов Linux очень часто устанавливается текстовый редактор vim (улучшенная версия vi - vi improved), который является аналогичным. Каждый системный администратор должен обладать знаниями относительно работы с текстовым редактором vi(m), так как данный редактор является простым инструментом, позволяющим решить возникающие проблемы.
Текстовый редактор vi не является интуитивным, но после того, как вы научитесь с ним работать, он станет еще одним очень мощным инструментом из вашего арсенала. В состав большинства дистрибутивов также включено приложение vimutator, которое представляет собой 45-минутный урок по использованию редактора vi(m).
Режимы ввода команд и ввода текста
Текстовый редактор vi начинает работу в режиме ввода команд. При работе в этом режиме вам предоставляется возможность выполнения поддерживаемых редактором команд. Некоторые из команд позволят вам перейти в режим ввода текста. При работе в этом режиме вы можете редактировать текстовые документы. Клавиша Escape вернет вас в режим ввода команд.
Таблица 20.1. Переход в режим ввода команд
| Клавиша | Действие |
|---|---|
| Esc | Перевод редактора vi(m) в режим ввода команд. |
Начало редактирования текста (a A i l o O)
Различие между командами A i l o и O заключается в начальной позиции ввода текста. Команда a позволяет продолжить ввода текста после текущего символа, а команда A - после окончания текущей строки. Команда i позволяет начать ввод текста перед текущим символом, а команда I - в начале текущей строки. Команда o позволяет создать новую строку после текущей строки, а команда O - перед текущей строкой.
Таблица 20.2. Переход в режим ввода текста
| Команда | Действие |
|---|---|
| a | Начало ввода текста после текущего символа |
| A | Начало ввода текста в конце текущей строки |
| i | Начало ввода текста перед текущим символом |
| I | Начало ввода текста в начале текущей строки |
| o | Начало ввода текста в новой строке, созданной после текущей строки |
| O | Начало ввода текста в новой строке, созданной перед текущей строкой |
Замена и удаление символа (r x X)
При работе в режиме ввода команд (в том случае, если вы нажмете клавишу Escape несколько раз, не произойдет ничего страшного) вы можете использовать клавишу x для удаления текущего символа. Символ X в верхнем регистре (или сочетание клавиш Shift+x) позволяет удалить символ слева от курсора. Также при работе в режиме ввода команд вы можете использовать клавишу r для замены одного единственного символа. В случае использования клавиши r вы будете перемещены в режим ввода текста для осуществления одного нажатия на клавишу, после чего вы будете немедленно перемещены в режим ввода команд.
Таблица 20.3. Замена и удаление символа
| Команда | Действие |
|---|---|
| x | Удаление символа, выделенного с помощью курсора |
| X | Удаление символа перед курсором |
| r | Замена символа, выделенного с помощью курсора |
| p | Вставка символа после курсора (в данном случае будет осуществляться вставка последнего удаленного символа) |
| xp | Замена местами двух символов |
Отмена и повторение действий (u .)
При работе в режиме ввода команд вы можете отменять ошибочные действия с помощью команды u. Также вы можете повторять эти ошибочные действия с помощью команды . (другими словами, с помощью команды . будет осуществляться повторное выполнение вашей последней команды).
Таблица 20.4. Отмена и повторение действий
| Команда | Действие |
|---|---|
| u | Отменить последнее действие |
| . | Повторить последнее действие |
Перенос, копирование и вставка строки (dd yy pP)
При работе в режиме ввода команд с помощью команды dd может осуществляться перенос текущей строки. Команда yy позволяет копировать текущую строку. В результате вы сможете осуществить вставку последней скопированной или перенесенной строки после (p) или до (P) текущей строки.
Таблица 20.5. Перенос, копирование и вставка строки
| Команда | Действие |
|---|---|
| dd | Перенос текущей строки |
| yy | Копирование текущей строки (yank yank) |
| p | Вставка строки после текущей строки |
| P | Вставка строки до текущей строки |
Перенос, копирование и вставка строк (3dd 2yy)
При работе в режиме ввода команд перед вводом команд dd или yy вы можете ввести число, соответствующее необходимому количеству повторений команды. Таким образом, с помощью команды 5dd могут быть перемещены 5 строк, а с помощью команды 4yy могут быть скопированы 4 строки. При этом исполнение последней команды будет сопровождаться уведомлением от vi в нижнем левом углу с текстом "4 line yanked".
Таблица 20.6. Перемещение, копирование и вставка строк
| Команда | Действие |
|---|---|
| 3dd | Перемещение трех строк |
| 4yy | Копирование четырех строк |
Переход в начало и конец строки (0 или ^ и $)
При работе в режиме ввода команд команда 0 или ^ переместит ваш курсор в начало текущей строки, а команда $ - в конец текущей строки. Вы можете добавлять символы 0 и $ к команде d, в результате чего команда d0 позволит удалить все символы, находящиеся между текущим символом и символом в начале строки. Таким же образом команда d$ позволит удалить все символы в диапазоне от текущего символа до символа в конце строки. Аналогично, команды y0 и y$ позволят осуществлять копирование символов до начала и конца текущей строки соответственно.
Таблица 20.7. Переход в начало и конец строки
| Команда | Действие |
|---|---|
| 0 | Переход к началу текущей строки |
| ^ | Переход к началу текущей строки |
| $ | Переход к концу текущей строки |
| d0 | Удаление символов до начала текущей строки |
| d$ | Удаление символов до конца текущей строки |
Объединение двух (J) и более строк
При вводе команды J в режиме ввода команд будет осуществлено объединение следующей и текущей строк. Кроме того, с помощью команды yyp вы можете дублировать строку, а с помощью команды ddp - поменять местами две строки.
Таблица 20.8. Объединение двух строк
| Команда | Действие |
|---|---|
| J | Объединение двух строк |
| yyp | Дублирование строки |
| ddp | Замена местами двух строк |
Слова (w b)
При работе в режиме ввода команд команда w позволяет перейти к следующему слову, а команда b - к предыдущему слову. Команды w и b также могут комбинироваться с командами d и y с целью копирования и переноса слов (dw db yw yb).
Таблица 20.9. Слова
| Команда | Действие |
|---|---|
| w | Переход к следующему слову |
| b | Переход к предыдущему слову |
| 3w | Переход вперед на три слова |
| dw | Удаление одного слова |
| yw | Копирование (yank) одного слова |
| 5yb | Копирование пяти слов до курсора |
| 7dw | Удаление семи слов |
Сохранение (или отказ от сохранения) данных и завершение работы (:w :q :q!)
Ввод символа : позволяет вам передавать инструкции редактору vi (говоря техническим языком, ввод символа двоеточия приводит к открытию редактора ex). Команда :w позволяет записать данные (сохранить) в файл, команда :q - завершить работу с редактором без изменения файла и сохранения данных, а команда :q! - завершить работу с редактором с отклонением всех изменений. При использовании команды :wq данные будут сохранены в файл, после чего работа редактора завершится точно также, как и при использовании команды ZZ в режиме ввода команд.
Таблица 20.10. Сохранение данных и завершение работы с vi
| Команда | Действие |
|---|---|
| :w | Сохранение (запись) данных в файл |
| :w имя файла | Сохранение данных в файл с заданным именем |
| :q | Завершение работы с редактором |
| :wq | Сохранение данных и завершение работы с редактором |
| ZZ | Сохранение данных и завершение работы с редактором |
| :q! | Завершение работы с редактором (с отклонением внесенных вами изменений) |
| :w! | Сохранение данных (и запись данных в защищенный от записи файл) |
Последняя команда применяется в особых случаях. В случае использовании команды :w! редактор vi попытается осуществить изменение прав доступа к файлу (chmod) с целью получения возможности записи данных в файл (данный трюк сработает в том случае, если вы являетесь владельцем файла) и вернет прежние права доступа к файлу в случае успешной записи данных. Эта команда должна всегда успешно выполняться, если вы используете учетную запись пользователя root (и имеете возможность осуществления записи данных в любой файл файловой системы).
Поиск (/ ?)
В режиме ввода команд команда / позволяет вам осуществлять поиск строк в тексте, редактируемом с помощью vi (в качестве поискового запроса может использоваться регулярное выражение). Команда /foo позволяет осуществить поиск строки foo по направлению к концу файла, а команда ?bar - поиск строки bar по направлению к началу файла.
Таблица 20.11. Поиск
| Команда | Действие |
|---|---|
| /строка | Поиск строки по направлению к концу файла |
| ?строка | Поиск строки по направлению к началу файла |
| n | Переход к следующей найденной строке |
| /^строка | Поиск строки по направлению к концу файла с начала текущей строки файла |
| /строка$ | Поиск строки по направлению к концу файла с конца текущей строки файла |
| /br[aeio]l | Поиск слов bral, brel, bril, и brol |
| /\<he\> | Поиск слова he (но не слов here или the) |
Замена всех найденных строк (:1,$ s/foo/bar/g)
Для замены всех найденных строк foo на строки bar в первую очередь следует перейти в режим ex с помощью команды : . После этого следует сообщить редактору vi о том, какие строки следует использовать, например, в случае использования запроса 1,$ будет осуществляться замена всех найденных строк, начиная с первой и заканчивая последней строкой файла. Вы можете использовать запрос 1,5 для обработки только первых пяти строк файла. Запрос s/foo/bar/g позволяет заменить все строки foo на строки bar.
Таблица 20.12. Замена
| Команда | Действие |
|---|---|
| :4,8 s/foo/bar/g | Заменить строки foo на строки bar начиная с 4 и заканчивая 8 строкой файла |
| :1,$ s/foo/bar/g | Заменить строки foo на строки bar во всех строках файла |
Чтение файлов (:r :r !cmd)
При работе в режиме ввода команд команда :r foo позволяет осуществлять чтение файла с именем foo, а команда :r !foo - исполнять системную команду foo. Результат исполнения системной команды будет размещен в позиции курсора. Таким образом, команда :r !ls позволяет сохранить список файлов из текущей директории в вашем текстовом файле.
Таблица 20.13. Чтение файлов и вывода команд
| Команда | Действие |
|---|---|
| :r имя файла | Чтение файла с заданным именем и размещение его содержимого в редактируемом текстовом файле |
| :r !команда | Исполнение заданной команды и размещение ее вывода в редактируемом текстовом файле |
Текстовые буферы
В редакторе vi используется 36 буферов для хранения текста. Вы можете задействовать их, воспользовавшись символом ".
Таблица 20.14. Текстовые буферы
| Команда | Действие |
|---|---|
| "add | Удалить текущую строку и переместить текст в буфер a |
| "g7yy | Скопировать семь строк в буфер g |
| "ap | Вставить данные из буфера a |
Работа с множеством файлов
Вы можете осуществлять редактирование множества файлов с помощью текстового редактора vi. Ниже приведены примеры некоторых команд.
Таблица 20.15. Работа с множеством файлов
| Команда | Действие |
|---|---|
| vi файл1 файл2 файл3 | Начать редактирование трех фалов с заданными именами |
| :args | Вывести список файлов и указать активный файл |
| :n | Начать редактирование следующего файла |
| :e | Перейти к последнему отредактированному файлу |
| :rew | Сместить указатель открытых файлов на первый файл |
Аббревиатуры строк
С помощью команды :ab вы можете создавать аббревиатуры строк в рамках редактора vi. Впоследствии следует использовать команду :una для прекращения использования созданной аббревиатуры.
Таблица 20.16. Аббревиатуры строк
| Команда | Действие |
|---|---|
| :ab строка длинная строка | Создать аббревиатуру строка для строки 'длинная строка' |
| :una строка | Прекратить использование аббревиатуры строка |
Соответствия клавиш
Аналогично аббревиатурам, благодаря наличию поддержки команды :map при работе в режиме ввода команд и команды :map! при работе в режиме ввода текста, вы имеете возможность использовать соответствия клавиш.
set number) и деактивации (выполняющейся с помощью команды set nonumber) режима показа нумерации строк файла. Строка <bar> разделяет две команды, причем команда set number! предназначена для переключения режима показа нумерации строк файла, а команда set number? - для вывода сообщения о текущем состоянии.
:map <F6> :set number!<bar>set number?<CR>
Установка значений параметров
:set number (также попробуйте использовать команду :se nu) :set nonumber :syntax on :syntax off :set all (вывод списка, содержащего имена всех параметров конфигурации) :set tabstop=8 :set tx (окончания строк в стиле CR/LF) :set notx
~/.vimrc в случае использования редактора vim или ~/.exrc в случае использования стандартного редактора vi.
paul@barry:~$ cat ~/.vimrc set number set tabstop=8 set textwidth=78 map <F6> :set number!<bar>set number?<CR> paul@barry:~$
Практическое задание: vi(m)
-
1. Запустите приложение vimtutor и выполните некоторые или все предложенные задания. При работе с дистрибутивом xubuntu вам, возможно, придется выполнить команду
aptitude install vim. -
2. Какая комбинация из 3 клавиш, использованная в режиме ввода команд, позволит создать дубликат текущей строки файла?
-
3. Какая комбинация из 3 клавиш, использованная в режиме ввода команд, позволит поменять две строки файла местами (в результате чего строка номер пять станет строкой номер шесть, а строка номер шесть - строкой номер пять)?
-
4. Какая комбинация из 2 клавиш, использованная в режиме ввода команд, позволит поменять местами текущий и следующий символы?
-
5. Редактор vi может работать с макросами. Запись макроса должна начинаться с символа q, после которого должно записываться имя макроса. Таким образом, команда qa приведет к созданию макроса с именем a. Повторное нажатие клавиши q приведет к завершению записи макроса. После этого вы можете вызвать созданный макрос, воспользовавшись символом @ со следующим за ним именем макроса. Попытайтесь использовать следующий пример: i 1 'Клавиша Escape' qa yyp 'Ctrl a' q5@a. (Сочетание клавиш Ctrl a позволяет увеличить значение на 1).
-
6. Скопируйте файл /etc/passwd в вашу домашнюю директорию (~/passwd). Откройте скопированный файл с помощью редактора vi и нажмите Ctrl v. После выделения блока текста с помощью клавиш со стрелками вы сможете скопировать его с помощью команды y или удалить его с помощью команды d. Попытайтесь вставить скопированный блок текста.
-
7. Какое действие выполняется с помощью команды
dwwP, если курсор находится в начале слова из предложения?
Корректная процедура выполнения практического задания: vi(m)
-
1. Запустите приложение vimtutor и выполните некоторые или все предложенные задания. При работе с дистрибутивом xubuntu вам, возможно, придется выполнить команду
aptitude install vim. -
vimtutor
-
2. Какая комбинация из 3 клавиш, использованная в режиме ввода команд, позволит создать дубликат текущей строки файла?
-
yyp
-
3. Какая комбинация из 3 клавиш, использованная в режиме ввода команд, позволит поменять две строки файла местами (в результате чего строка номер пять станет строкой номер шесть, а строка номер шесть - строкой номер пять)?
-
ddp
-
4. Какая комбинация из 2 клавиш, использованная в режиме ввода команд, позволит поменять местами текущий и следующий символы?
-
xp
-
5. Редактор vi может работать с макросами. Запись макроса должна начинаться с символа q, после которого должно записываться имя макроса. Таким образом, команда qa приведет к созданию макроса с именем a. Повторное нажатие клавиши q приведет к завершению записи макроса. После этого вы можете вызвать созданный макрос, воспользовавшись символом @ со следующим за ним именем макроса. Попытайтесь использовать следующий пример: i 1 'Клавиша Escape' qa yyp 'Ctrl a' q5@a. (Сочетание клавиш Ctrl a позволяет увеличить значение на 1).
-
6. Скопируйте файл /etc/passwd в вашу домашнюю директорию (~/passwd). Откройте скопированный файл с помощью редактора vi и нажмите Ctrl v. После выделения блока текста с помощью клавиш со стрелками вы сможете скопировать его с помощью команды y или удалить его с помощью команды d. Попытайтесь вставить скопированный блок текста.
-
cp /etc/passwd ~ vi passwd (нажмите Ctrl-V)
-
7. Какое действие выполняется с помощью команды
dwwP, если курсор находится в начале слова из предложения? -
Команда
dwwPпозволяет менять местами текущее и следующее слова в предложении.
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| Глава 19. Регулярные выражения | Глава 21. Введение в разработку сценариев |
