Опубликован: 22.06.2005 | Уровень: для всех | Доступ: платный | ВУЗ: Компания IBM
Лекция 9:

Текстовые редакторы

Изменение текста

В командном режиме нельзя вводить символы в текст с клавиатуры, но изменить текст при этом можно, например, удаляя символы. Чтобы удалить отдельный символ (тот, на котором стоит курсор), достаточно нажать " x " в командном режиме, а чтобы удалить сразу целую строку (естественно, текущую, то есть ту, в которой находится курсор) – " dd ". " d " – это сокращение от " d elete", удалить, а " dd " – характерный прием Vi: удвоение команды означает, что ее нужно применить к текущей строке.

Из командной строки Vi можно выполнить операцию поиска и замены: для простой строки или для регулярного выражения. Причем синтаксис команды поиска и замены полностью воспроизводит синтаксис потокового редактора sed, о котором уже шла речь в лекции 7:

Это файл для примеров.
Пример 1.
Моя первая строка в vi...
~
~
~
:s/.$/.../
Пример 9.5. Замена по шаблону в Vi

Мефодий хотел заменить в своем файле точки в концах строки многоточиями. Для этого в командном режиме он нажал " :" (вызов командной строки Vi), где набрал команду " s " (сокращение от "substitute", заменить), за которой следует уже знакомое по "sed" выражение " /что_заменить/на_что_заменить/ ". Только результат получился совсем не тот, какого ожидал Мефодий: заменился на многоточие восклицательный знак последней строки. Не учел он следующего: по умолчанию шаблоны для поиска и замены – это регулярные выражения, то есть " ." означает вовсе не точку, а "любой символ". Имея в виду точку, следовало написать " \.". " $ ", как и ожидал Мефодий, это конец строки. В момент выполнения команды поиска курсор находился в последней строке, в первом совпадении после курсора и была произведена замена.

Форматирование текста – это расстановка символов конца строки, пробелов и табуляций таким образом, чтобы текст хорошо смотрелся на экране терминала. Форматирование вручную крайне неэффективно. В Vim автоматическое форматирование текста (если редактируется программа на каком-либо языке программирования, то с учетом правил этого языка) может происходить прямо в режиме вставки, в режиме вставки же можно изменять отступ текущей строки (по командам " ^D " и " ^T "). Для выравнивания текста по центру, правому или левому краю команды " :center ", " :left " и " :right " соответственно. Эти команды, как и большинство команд командной строки, можно применять к диапазону строк способом, описанным ниже.

Режим ввода не богат специальными командами изменения текста, что и понятно: он предназначен для ввода. Однако в Vim (но не в Vi!) есть некоторые удобства, упрощающие и сам процесс набора. Если слово, которое нужно ввести, уже встречалось в тексте, можно набрать только первые буквы и нажать " ^P " (" p revious") – Vim попробует сам завершить его. Если Vim не угадал и предложил не то слово, можно продолжить перебирать варианты. Команда " ^N " (" n ext") подставляет слова, которые встречаются ниже по тексту. Подробнее об этой функции можно узнать из руководства по команде " :help ins-completion ".

Иногда пользователь, изменив текст, тут же хочет вернуть все обратно. Для этого в Vi предусмотрена команда отмены последнего изменения: " u " в командном режиме (от " u ndo", отменить). Каким бы сложным, масштабным (и разрушительным) ни было изменение, совершенное последней командой, " u " вернет текст в исходное состояние. Впрочем, саму отмену тоже можно отменить. В классическом Vi доступна отмена только последней выполненной команды, а в Vim отменить можно сколько угодно последних команд, а также повторить их командой " ^R ".

Работа с фрагментами текста

Любая команда перемещения определяет две точки в тексте: ту, в которой был курсор до перемещения, и ту, в которую он переместился в результате данной команды. Расположенный между этими двумя точками отрезок текста однозначно задается командой перемещения. Например, команда " ) " захватывает текст от текущего положения курсора до начала следующего предложения. Vi позволяет применить к этому фрагменту любую команду редактирования – так устроены гнездовые команды. Гнездовая команда состоит из действия и следующего за ним перемещения. Перемещение задает фрагмент текста, а действие определяет, что с этим фрагментом сделать. Например, команда " d) " удалит весь текст от текущей позиции курсора до начала следующего предложения. Наиболее полезные действия – " d " (" d elete"), " c " (" c hange"), " > " и " < " (сдвинуть), " y " (запомнить) и " gq " (отформатировать).

Гнездовая команда. Команда редактора Vi, позволяющая применить указанное действие к указанному отрезку текста. Отрезок задается стандартной командой перемещения по тексту.

Очень часто возникает необходимость заменить фрагмент в тексте: слово, предложение, строку и т. д. Это можно сделать в два действия: сначала удалить часть текста, затем перейти в режим вставки и вставить замену. Vi предоставляет возможность упростить эту операцию, сведя два действия к одному: заменить. Гнездовая команда " c " предназначена именно для этого. Например, команда " cw " (буквально: " c hange w ord") заменит текст от курсора до начала следующего слова (так можно заменить одно слово), " c) " заменит текст от курсора до начала следующего предложения.

Мефодий не забыл, что команды перемещения можно использовать с множителями, и попробовал заменить сразу три слова в своем файле на другие: для этого он в командном режиме подогнал курсор в начало слова "первая" и набрал " c3w " ("заменить фрагмент отсюда до начала третьего слова", буквально: "change 3 words"). Результат этой команды выглядел так:

Это файл для примеров.
Пример 1.
Моя #vi...
~
~
~
-- ВСТАВКА --                 3,5  Весь
Пример 9.6. Команда замены в Vi

В примере знак " # " обозначает позицию курсора: как видно, Vi удалил три слова, попавшие в зону действия команды и сразу перешел в режим вставки. Мефодию осталось только набрать что-то взамен.

Перестановка частей – типичная задача, возникающая в процессе редактирования. Для перестановки требуется удалить фрагмент в одном месте текста и вставить его же в другом. Для решения первой части задачи в Vi нет специальных средств, потому что любая команда удаления (" d ", " c ", " x " и др.) сохраняет удаленный текст в специальном регистре. Для вставки последнего удаленного фрагмента служит команда " p " в командном режиме (от " p ut", положить). При помощи этой команды Мефодий может вставить только что удаленные им командой " c3w " три слова:

Это файл для примеров.
Пример 1.
Моя новая строка для vi...
первая строка в
~
~
                              4,1  Весь
Пример 9.7. Вставка удаленного фрагмента

Для того чтобы скопировать фрагмент текста, служит команда " y " (от " y ank" – забрать, сдернуть): она не удаляет текст, а просто сохраняет его в том же регистре, что и команды удаления. Команду " y " можно использовать в гнездовых командах, например, " y5w " сохранит в регистре фрагмент текста от курсора до начала пятого слова. Вставить скопированный фрагмент можно все той же командой " p ". Однако таким способом можно вставлять только текст, удаленный или скопированный последним, для хранения нескольких разных фрагментов текста следует использовать именованные регистры (см. подробнее в руководстве по Vim).

Для того чтобы применить команду к нескольким строкам текста, не обязательно подгонять к ним курсор. В командной строке Vi любой команде может предшествовать указание диапазона в тексте, к которому следует эту команду применить. Команды с указанием диапазона выглядят так: " :начало,конец}команда ", где начало и конец – это адреса начальной и конечной строк диапазона (т. е. фрагмента текста), а команда – это команда режима командной строки, такая как " :w " или " :r ". Многие команды командного режима (в частности, " d " и " y ") доступны также и в командной строке. В качестве адреса можно использовать номера строк в файле (команда " :1,5y " будет означать "скопировать в регистр строки с первой по пятую"), есть специальные обозначения для текущей строки (" ."), последней строки (" $ ") и всего файла (" % "). Указать границу диапазона можно и при помощи шаблона: граничной будет считаться та строка, в которой обнаружится шаблон.

Последним свойством Мефодий воспользовался, чтобы удалить плоды своих экспериментов: он выполнил команду " :/Пример 1/,$d " (от строки " Пример 1 " до конца файла – удалить):

Это файл для примеров.
~
~
~
3 fewer lines
Пример 9.8. Удаление диапазона по шаблону. Выполнена команда ":/Пример 1/,$dEnter".

Настройка Vi и Vim

Вид и поведение Vi и Vim можно существенно изменить при помощи настроек, приспособив редактор именно к своим вкусам и привычкам. Прямо во время работы редактора можно менять настройки из командной строки Vi при помощи команды " :set имя_настройки ". Кроме того, можно сделать настройку постоянной, вписав все нужные значения в конфигурационный файл .vimrc (или .exrc – для Vi) в домашнем каталоге пользователя. При каждом запуске Vim/Vi читает этот файл и исполняет все содержащиеся в нем команды. Объем лекции не позволяет подробно остановиться на настройке Vi, читатель может заняться изучением этого вопроса сам: все необходимые сведения есть в руководствах. Чтобы оценить возможности настройки, можно выполнить в Vim (но не в Vi!) команду " :options ", по которой будет выведен список всех доступных опций с кратким описанием их смысла.

Аягоз Имансакипова
Аягоз Имансакипова
Тимур Булатов
Тимур Булатов

С момента выхода курса прошло достаточно много времени, и хотелось бы понимать, насколько курс является актуальным на сегодняшний день.