Каждый пользователь GNU/Linux в свое время сталкивается с необходимостью отредактировать какой-нибудь файл конфигурации. Для этих задач гораздо удобнее использовать быстрый текстовый редактор, нежели чем, допустим, тяжелый и неповоротливый oowriter. В этой статье я постараюсь рассмотреть основные приемы работы с консольным текстовым редактором vi. Для начала надо выяснить, как правильно произносить это короткое, но значимое в мире свободных операционных систем название. vi надо произносить как "vee eye", так гласит официальная документация. Разобравшись с именем нашего текстового редактора, давайте перейдем непосредственно к изучению его возможностей.
vi обладает мощным набором функций для работы с текстом, но для пользователя по-началу трудность заключается в том, что все команды надо вводить с клавиатуры. Не стоит паниковать по этому поводу, ведь для того, чтобы выполнять основные операции в vi, нужно знать не более двадцати команд. Полный же их список составляет около 150 наименований. Запомнить их все вы сможете, только если будете регулярно работать с vi.
Начнем. Запускаем консоль и говорим:
vi myfile
У vi также есть возможность загружать документ с курсором, установленным на определенной вами строке. Например:
vi +7 myfile
Если бы в myfile был текст, то после загрузки файла курсор был бы помещен в начало седьмой строки.
Итак, появился черный экран с синими значками по левому краю.
В vi редактирование текста и его сохранение проходят в разных режимах. Переключение между режимами осуществляется клавишами Insert, i, a для работы с текстом и Esc для выхода в командный режим, откуда можно сохранять и закрывать файл. В зависимости от того как вам удобнее, нажимаем либо на Insert, либо на i, либо на a, и переходим в режим ввода информации. Курсор в оригинальном vi управляется только с помощью клавиш h, j, k, l.
h на позицию влево
j на позицию вниз
k на позицию вверх
l на позицию вправо
Впрочем, в случае GNU/Linux, кнопки "вверх", "вниз", "вправо", "влево" будут работать не хуже.
Введя пару строк из серии "Hello, World!", поэкспериментируйте с курсором. Вдоволь наигравшись, перейдите в командный режим, нажав на Esc. Самое время сохранить наш myfile. Все команды для vi должны следовать после двоеточия. В появившейся внизу экрана командной строке введите :w, что означает "сохранить". Готово, файл записан на диск и мы можем спокойно выйти из vi. Для этого говорим :q. Если, внеся изменения в документ, вы передумали их сохранять, скажите :qa!. Это заставит vi завершить работу без сохранения изменений, внесенных в файл. В том случае, если вам надо отменить все правки, внесенные в документ с последнего сохранения, то скажите :e!. Ну а если просто отменить последнюю команду, то :u.
Представьте себе ситуацию: у вас не работает какое-то устройство, проконсультировавшись на одном из форумов у знающих предмет товарищей, вы решаете изменить, допустим, /etc/X11/XF86Config предложенным вам куском текста, но вводить все ручками как-то не хочется, а метод Ctrl-C/Ctrl-V (копировать/вставить) в vi не работает. Что делать? В рассматриваемом нами текстовом редакторе существует свой способ копирования и вставки информации. Заранее отмечу, что нижеописанные действия должны производиться в командном режиме. В vi существуют именованный и неименованный буфер. Ниже представлены команды, которые позволяют копировать текст в неименованный буфер.
yy копировать строку в неименованный буфер
Y копировать строку в неименованный буфер
Особенностью vi является то, что в большинстве случаев заглавная буква в команде может заменить пару строчных.
nyy копировать следующие n строк в неименованный буфер
nY копировать следующие n строк в неименованный буфер
yw копировать слово в неименованный буфер
ynw копировать n слов в неименованный буфер
nyw копировать n слов в неименованный буфер
Посмотрев на строки с командами ynw и nyw, вы можете заметить то, что vi также позволяет не придерживаться строгого порядка букв в некоторых командах.
Минус неименованного буфера в том, что его содержимое может быть повреждено другими командами. Одним словом, если вам нужно сохранить кусок текста на длительный промежуток времени - используйте именованный буфер. vi имеет 26 именованных буферов для хранения информации. Чтобы сохранить строку в именованный буфер, нужно подвести курсор к началу строки и сказать что-то наподобие "ayy, эта команда позволит сохранить строку, в начале которой находится курсор в именованном буфере a. Ниже представлены команды, которые позволяют копировать текст в именованный буфер.
"ayy копировать строку в именованный буфер a
"aY копировать строку в именованный буфер a
"byw копировать слово в именованный буфер b
"Byw добавить слово к содержимому именованного буфера b
"by5w копировать следующие пять слов в именованный буфер b
Как вы уже наверняка заметили, vi позволяет копировать в буфер не только строки и слова, но и фиксированные вами количества слов после курсора.
Мы научились копировать информацию в буфер, но как ее оттуда извлечь? Сначала давайте рассмотрим процесс вставки содержимого неименованного буфера. В командном режиме нажмите p, это позволит вставить содержимое неименованного буфера справа от курсора, если же вы нажмете P, содержимое буфера окажется слева от курсора. Ниже представлены варианты команд для вставки содержимого как именованного, так и неименованного буферов.
nP вставить n копий содержимого неименованного буфера слева от курсора
np вставить n копий содержимого именованного буфера справа от курсора
"ap вставить содержимое именованного буфера a справа от курсора
"cP вставить содержимое именованного буфера c слева от курсора
"b4P вставить четыре копии содержимого именованного буфера b слева от курсора
Теперь несколько слов о том, как "вырезать" текст. Это действие можно разделить на три шага: перемещение текста в именованный или неименованный буфер, перевод курсора в нужную позицию и непосредственная вставка содержимого именованного или неименованного буфера. В принципе, это то же самое, что и копирование, только сначала мы перемещаем текст в буфер. Ниже представлены примеры соответствующих команд.
"add удалить строку и поместить ее в именованный буфер a
"b5dd удалить пять строк и поместить в именованный буфер b
dw удалить слово и поместить его в неименованный буфер
Вставка вырезанного текста происходит также как и вставка скопированного.
Немаловажно отметить и то, что при работе в командном режиме, есть возможность удалять текст не только побуквенно. Ниже указаны некоторые из возможных команд по удалению текста.
x удалить знак под курсором
dd удалить строку
D удалить часть строки, начиная с позиции курсора
ndd удалить n строк
dG удалить все с данной позиции курсора до конца файла
dlG удалить все с данной позиции до начала файла
Поиск и замена текста являются самими сложными для понимания вопросами, так как требуют от пользователя некоторого опыта работы с регулярными выражениями. Возможно, это послужит темой для отдельной статьи. Вот лишь несколько примеров:
fm найти следующий знак m (поиск перемещается вправо)
Fq найти следующий знак q (поиск перемещается влево)
/string поиск слова string1 вправо и вниз по тексту
?string поиск слова string2 влево и вверх по тексту
:%s/^..//g удаляет по два символа в начале каждой строки документа.
Copyright (c) 2006 Vladimir B. Tsarkov
vi обладает мощным набором функций для работы с текстом, но для пользователя по-началу трудность заключается в том, что все команды надо вводить с клавиатуры. Не стоит паниковать по этому поводу, ведь для того, чтобы выполнять основные операции в vi, нужно знать не более двадцати команд. Полный же их список составляет около 150 наименований. Запомнить их все вы сможете, только если будете регулярно работать с vi.
Начнем. Запускаем консоль и говорим:
vi myfile
У vi также есть возможность загружать документ с курсором, установленным на определенной вами строке. Например:
vi +7 myfile
Если бы в myfile был текст, то после загрузки файла курсор был бы помещен в начало седьмой строки.
Итак, появился черный экран с синими значками по левому краю.
В vi редактирование текста и его сохранение проходят в разных режимах. Переключение между режимами осуществляется клавишами Insert, i, a для работы с текстом и Esc для выхода в командный режим, откуда можно сохранять и закрывать файл. В зависимости от того как вам удобнее, нажимаем либо на Insert, либо на i, либо на a, и переходим в режим ввода информации. Курсор в оригинальном vi управляется только с помощью клавиш h, j, k, l.
h на позицию влево
j на позицию вниз
k на позицию вверх
l на позицию вправо
Впрочем, в случае GNU/Linux, кнопки "вверх", "вниз", "вправо", "влево" будут работать не хуже.
Введя пару строк из серии "Hello, World!", поэкспериментируйте с курсором. Вдоволь наигравшись, перейдите в командный режим, нажав на Esc. Самое время сохранить наш myfile. Все команды для vi должны следовать после двоеточия. В появившейся внизу экрана командной строке введите :w, что означает "сохранить". Готово, файл записан на диск и мы можем спокойно выйти из vi. Для этого говорим :q. Если, внеся изменения в документ, вы передумали их сохранять, скажите :qa!. Это заставит vi завершить работу без сохранения изменений, внесенных в файл. В том случае, если вам надо отменить все правки, внесенные в документ с последнего сохранения, то скажите :e!. Ну а если просто отменить последнюю команду, то :u.
Представьте себе ситуацию: у вас не работает какое-то устройство, проконсультировавшись на одном из форумов у знающих предмет товарищей, вы решаете изменить, допустим, /etc/X11/XF86Config предложенным вам куском текста, но вводить все ручками как-то не хочется, а метод Ctrl-C/Ctrl-V (копировать/вставить) в vi не работает. Что делать? В рассматриваемом нами текстовом редакторе существует свой способ копирования и вставки информации. Заранее отмечу, что нижеописанные действия должны производиться в командном режиме. В vi существуют именованный и неименованный буфер. Ниже представлены команды, которые позволяют копировать текст в неименованный буфер.
yy копировать строку в неименованный буфер
Y копировать строку в неименованный буфер
Особенностью vi является то, что в большинстве случаев заглавная буква в команде может заменить пару строчных.
nyy копировать следующие n строк в неименованный буфер
nY копировать следующие n строк в неименованный буфер
yw копировать слово в неименованный буфер
ynw копировать n слов в неименованный буфер
nyw копировать n слов в неименованный буфер
Посмотрев на строки с командами ynw и nyw, вы можете заметить то, что vi также позволяет не придерживаться строгого порядка букв в некоторых командах.
Минус неименованного буфера в том, что его содержимое может быть повреждено другими командами. Одним словом, если вам нужно сохранить кусок текста на длительный промежуток времени - используйте именованный буфер. vi имеет 26 именованных буферов для хранения информации. Чтобы сохранить строку в именованный буфер, нужно подвести курсор к началу строки и сказать что-то наподобие "ayy, эта команда позволит сохранить строку, в начале которой находится курсор в именованном буфере a. Ниже представлены команды, которые позволяют копировать текст в именованный буфер.
"ayy копировать строку в именованный буфер a
"aY копировать строку в именованный буфер a
"byw копировать слово в именованный буфер b
"Byw добавить слово к содержимому именованного буфера b
"by5w копировать следующие пять слов в именованный буфер b
Как вы уже наверняка заметили, vi позволяет копировать в буфер не только строки и слова, но и фиксированные вами количества слов после курсора.
Мы научились копировать информацию в буфер, но как ее оттуда извлечь? Сначала давайте рассмотрим процесс вставки содержимого неименованного буфера. В командном режиме нажмите p, это позволит вставить содержимое неименованного буфера справа от курсора, если же вы нажмете P, содержимое буфера окажется слева от курсора. Ниже представлены варианты команд для вставки содержимого как именованного, так и неименованного буферов.
nP вставить n копий содержимого неименованного буфера слева от курсора
np вставить n копий содержимого именованного буфера справа от курсора
"ap вставить содержимое именованного буфера a справа от курсора
"cP вставить содержимое именованного буфера c слева от курсора
"b4P вставить четыре копии содержимого именованного буфера b слева от курсора
Теперь несколько слов о том, как "вырезать" текст. Это действие можно разделить на три шага: перемещение текста в именованный или неименованный буфер, перевод курсора в нужную позицию и непосредственная вставка содержимого именованного или неименованного буфера. В принципе, это то же самое, что и копирование, только сначала мы перемещаем текст в буфер. Ниже представлены примеры соответствующих команд.
"add удалить строку и поместить ее в именованный буфер a
"b5dd удалить пять строк и поместить в именованный буфер b
dw удалить слово и поместить его в неименованный буфер
Вставка вырезанного текста происходит также как и вставка скопированного.
Немаловажно отметить и то, что при работе в командном режиме, есть возможность удалять текст не только побуквенно. Ниже указаны некоторые из возможных команд по удалению текста.
x удалить знак под курсором
dd удалить строку
D удалить часть строки, начиная с позиции курсора
ndd удалить n строк
dG удалить все с данной позиции курсора до конца файла
dlG удалить все с данной позиции до начала файла
Поиск и замена текста являются самими сложными для понимания вопросами, так как требуют от пользователя некоторого опыта работы с регулярными выражениями. Возможно, это послужит темой для отдельной статьи. Вот лишь несколько примеров:
fm найти следующий знак m (поиск перемещается вправо)
Fq найти следующий знак q (поиск перемещается влево)
/string поиск слова string1 вправо и вниз по тексту
?string поиск слова string2 влево и вверх по тексту
:%s/^..//g удаляет по два символа в начале каждой строки документа.
Copyright (c) 2006 Vladimir B. Tsarkov