Глава 7. Редактирование

Глава 7. Редактирование

Русский перевод: Вадим Лопатюк

7.1. Введение в vi

Данное введение в редактор vi не нужно бывалым пользователям UNIX. Редактор vi, изначально разработан Биллом Джой (Bill Joy) из Sun Microsystems, как бесконечно расширяемый, простой в использовании легкий ASCII редактор и бич новичков. Этот раздел должен ввести новичков в редактор vi и, возможно, подкинуть несколько хороших идей бывалым пользователям.

В первой половине этого раздела будет рассмотрено редактирование, сохранение, копирование/вставка и навигация по файлу во время сессии vi. Во второй половине будет пошагово рассмотрен пример сессии vi в помощь начинающим.

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

7.1.1. Интерфейс vi

Использование редактора vi в действительности не сильно отличается от остального терминального программного обеспечения за одним исключением - он не использует вкладочный (или вынужденный, если Вам угодно) стиль интерфейса, хотя многие версии vi принудительно его используют не предоставляя какой-либо видимости или ощущения типичного обязывающего интерфейса. Вместо этого он работает в двух режимах: командном и редактирования. Сейчас это может показаться странным, но это не сильно отличается от windows-основанного редактирования, если Вы об этом подумали. Примите это как пример, если Вы используете графические функции в редактировании и выделяете какой-либо текст, выбираете вырезать, а затем вставить, все время, пока Вы пользуетесь мышью, Вы не редактируете (даже если бы и могли). В vi, имеются такие функции, как простое удаление всей строки командой dd в командном режиме, перемещение строки по вашему желанию в другое место и ее вставка p в командном режиме. Можно говорить об аналогии с «режим мыши против командного режима» (хотя она не в полной мере отражает концепцию идеи).

Для начала сессии vi есть один простой способ, который может работать со всем терминальным программным обеспечением:

$ vi filename

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

7.1.2. Переключение в режим редактирования

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

a     Добавить после курсора.
A     Добавить в конец строки.
C     Изменить содержание текущей строки.
cw    Изменить текущее слово.
i     Вставить перед курсором.
I     Вставить перед первой непустой строкой.
o     Открыть строку ниже для вставки.
O     Открыть строку выше для вставки.

7.1.3. Переключение режимов и сохранение буфера в файл

Конечно, знание команд редактирования не очень полезно, если Вы не можете переключиться обратно в командный режим и сохранить файл. Для переключения обратно просто нажмите клавишу ESC. Для введения определенных команд должно использоваться двоеточие. Набирайте команды одним блоком. Чтобы сделать это, просто введите :.

Ведите двоеточие и затем команды в левом нижнем углу экрана. Давайте посмотрим на команды сохранения:

:w    Записать буфер в файл.
:wq   Записать буфер в файл и выйти.

7.1.4. Копирование и вставка

Что хорошего в редакторе, если Вы не можете манипулировать блоками текста? Конечно vi очень хорошо поддерживает эту функцию и большинство команд vi достаточно интуитивны. Чтобы скопировать строку, но не удалять ее, просто нажмите yy или Y в командном режиме и текущая строка будет скопирована в буфер. Для вставки строки переместитесь в необходимое место текста и нажмите клавишу p для выполнения команды «вставка». Для перемещения строки удалите всю строку командой dd, после чего переместитесь в новое место и вставьте ее с помощью команды p.

7.1.4.1. Ой, я не хотел этого делать!

Функция отмены очень проста, u отменяет последнее действие, а U отменяет удаление последней строки или изменения, сделанные в ней.

7.1.5. Навигация в тексте

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

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



k     Переместить курсор на одну строку выше.
j     Переместить курсор на одну строку ниже.
l     Переместить курсор на один символ вправо.
h     Переместить курсор на один символ влево.

Если терминал имеет и поддерживает их, клавиши управления курсором могут использоваться для навигации по тексту в командном режиме.

В дополнение к навигации «в одно касание» vi поддерживает переход на строку простым набором ее номера в командной строке. Например, если Вам необходимо перейти на 223-ю строку команда для редактора будет выглядеть так:

ESC
:223

7.1.6. Поиск по файлу, альтернативное управление

Редактор vi поддерживает поиск с использованием синтаксиса регулярных выражений, тем не менее, в командном режиме это немного отличается. Просто нажмите клавишу / в командном режиме и введите то, что Вам нужно найти, как например, скажем нам необходимо найти выражение foo:

/foo

Теперь проиллюстрируем немного другой пример, скажем нам нужно найти выражение foo bar:

/foo bar

7.1.6.1. Дополнительные команды навигации

Поиск и прокрутка - не единственные способы навигации по буферу vi. Далее список коротких команд навигации, доступных в vi:

0     Переместиться в начало строки.
$     Переместиться в конец строки.
b     Переместиться назад на слово.
w     Переместиться вперед на слово.
G     Переместиться в конец буфера.
H     Переместиться в верхнюю строку на экране.
L     Переместиться к последней строке на экране.
M     Переместить курсор в середину экрана.
N     Искать следующее совпадение, но в обратном направлении.
n     Искать следующее совпадение в том же направлении.

7.1.7. Пример сессии

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

# vi foo.txt

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

This is some text

there we skipped a line
~
~
~
~

Теперь нажимаем клавишу ESC для переключения обратно в командный режим.

Теперь, когда мы находимся в командном режиме, давайте сохраним файл. Сначала нажмите клавишу :, курсор должен разместиться в нижнем левом углу, сразу после приглашения. За приглашением : введите w и нажмите клавишу ENTER или ВВОД. Файл будет сохранен. Здесь должно появится сообщение о выполнении команды, некоторые редакторы vi также скажут Вам название файла, количество строк и объем сохраненного.

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

В конце, давайте сделаем еще две вещи: сначала перейдем к первой строке, затем к первому символу. Испытайте некоторые клавиши навигации командного режима в этой строке, попеременно понажимайте следующие клавиши:

$
0
$
0

Курсор должен перескочить к концу строки, назад к началу и затем вновь в конец.

Далее, поиск выражения по нажатию клавиши / и выражению, вот так:

/we

Курсор должен перескочить к первому совпадению с «we».

Теперь сохраните файл и выйдите:

:wq

7.2. Конфигурирование vi

Не нужно говорить, что стандартный редактор, включаемый в NetBSD это vi, самый обожаемый и ненавидимый редактор в мире. Если Вы не используете vi, пропустите этот раздел, в противном случае прочитайте его перед установкой другой версии vi. NetBSD-шный vi (nvi) написан Кейт Бостик (Keith Bostic) из UCB с целью получить наиболее свободно распространяемую версию этого редактора и более расширяемую, стоящую изучения, остающуюся максимально совместимой с оригинальным vi. Nvi стал стандартной версией vi для BSD.

Среди большинства расширений, интересны:

  • Расширение регулярных выражений (стиль egrep), добавляется опцией extended.

  • Стэки тэгов.

  • Бесконечная отмена(для отмены, нажатьu; для продолжения отмен - .).

  • Нарастающий поиск подключается опцией searchincr.

  • Прокрутка строк влево-вправо подключается опцией leftright; количество символов для прокрутки определяется опцией sidescroll.

  • Редактирование истории командной строки подключается опцией cedit.

  • Автозавершение имен файлов подключается опцией filec.

  • Фоновые экраны.

  • Редактирование с разделением экрана.

7.2.1. Расширения для .exrc

Следующий пример показывает файл .exrc file с некоторыми включенными расширенными функциями.

set showmode ruler
set filec=^[
set cedit=^[

Первое подключает отображение позиции курсора (строки и столбцы) и текущего режима (Command, Insert, Append) в строке статуса. Вторая строка (где ^[ это символ ESC) подключает автозавершение имен файлов по ESC. Третья строка подключает редактирование истории командной строки (также по ESC.) Например, напишите «:» и нажатие ESC откроет окно со списком предыдущих команд, которые можно редактировать и исполнять (нажатие Enter на команде запустит ее.)

7.2.2. Документация

Архивы исходных текстов (src.tgz) содержат массу пользовательской документации по (n)vi и расширениям в каталоге /usr/src/usr.bin/vi/docs. Например:

  • Edit: A tutorial

  • Ex Reference Manual

  • Vi man page

  • An Introduction to Display Editing with Vi by William Joy and Mark Horton

  • Ex/Vi Reference Manual by Keith Bostic

  • Vi Command & Function Reference

  • Vi tutorial (beginner and advanced)

Если Вы никогда не пользовались vi, «Vi tutorial» - хорошая отправная точка. Он рассказывает об использовании vi и постепенно знакомит читателя со всеми командами vi, которые можно тестировать по мере прочтения. An Introduction to Display Editing with Vi от Вильяма Джой (William Joy) и Марка Хорнона (Mark Horton) также очень хорошая отправная точка.

Если Вы желаете больше прочесть о vi и расширении nvi, Вам необходимо прочесть Ex/Vi Reference Manual от Кейт Бостик (Keith Bostic) в котором задокументированы все опции и команды редактора.

7.3. Использование тэгов в vi

Эта тема напрямую не относится к NetBSD но может быть полезна, например, для изучения исходных текстов ядра.

Когда Вы изучаете наборы исходных текстов в дереве каталогов и подкаталогов, Вы можете упростить свою работу, используя свойство тэгов в vi. Метод заключается в следующем:

  1. cd в головной каталог исходных текстов.

    $ cd /path
  2. Введите следующие команды:

    $ find . -name "*.[ch]" > filelist
    $ cat filelist | xargs ctags
  3. Добавьте следующую строку в .exrc

    set tags=/path/tags

    (пропишите необходимый путь вместо path.)

Обновлено: 16.03.2015