РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

Внесение небольших изменений

Эта глава демонстрирует несколько путей внесения изменений и перемещения разных частей текста. Она обучает трём основным способам изменения текста: операторам с перемещениями, Визуальному режиму и текстовым объектам.

04.1    Операторы и перемещения
04.2    Изменение текста
04.3    Повторение изменений
04.4    Визуальный режим
04.5    Перемещение текста
04.6    Копирование текста
04.7    Использование буфера обмена
04.8    Текстовые объекты
04.9    Режим замены
04.10  Выводы

Следующая глава: Настройки
Предыдущая глава: Навигация по документу
Содержание: Руководство пользователя Vim


04.1 Операторы и перемещения

В главе 2 мы научились, что команда "x" удаляет одиночный символ, а использование числовой приставки позволяет удалить несколько символов: "4x" удаляет четыре символа.

Команда "dw" удаляет слово. Вы помните, что команда "w" это команда перемещения на слово. На самом деле, команда "d" может сочетаться с любой командой перемещения, производя удаление текста от текущей позиции до того места, к которому переместится курсор.

Так, команда "3w" перемещает курсор на три слова, а команда d3w удаляет три слова.

Разрешается провоз пяти килограммов кота (справка с таможни) ~
               ---------------------->
                          d3w
            
Разрешается провоз (справка с таможни) ~

Vim производит удаление только до позиции, в которой оказывается курсор. Так происходит потому, что Vim знает о том, что вы скорее всего не хотите удалять первый символ слова. Если вы используете "e" для перемещения к концу слова, то Vim понимает, что вы хотите включить в том числе и последний символ:

Разрешается провоз пяти килограммов кота (справка с таможни) ~
              ---------------->
                     d2e

Разрешается провоз кота (справка с таможни) ~

Включается или нет символ под курсором в контекст операции зависит от команды. Справочник по Vim называет команды перемещения "исключительными", если символ под курсором не включается в контекст операции, и "включительными", если символ включается в контекст.

Команда "$" перемещает курсор к концу строки. Команда "d$" удаляет текст, начиная с позиции курсора и до конца строки. Это перемещение является включительным, поэтому последний символ также будет удалён:

Разрешается провоз пяти килограммов кота (справка с таможни) ~
                                        ------------------->
                                 d$

Разрешается провоз пяти килограммов кота ~

Такого рода операции работают следующим образом: оператор-перемещение. Сначала вы набираете команду оператора, например "d" это оператор удаления. Затем вы вводите команду перемещения, например "4l" или "w". Таким образом вы можете работать с любым фрагментом текста.


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

Другим оператором является команда "c" (change, изменить). Она работает точно так же, как и оператор "d", но переводит редактор в режим Вставки. Например, "cw" изменяет слово. Говоря точнее, эта команда удаляет слово и переводит редактор в режим Вставки.

Разрешается провоз пяти килограммов кота ~
                   ----------------->
                c2wмешка для<Esc>

Разрешается провоз мешка для кота ~

Команда "c2wмешка для<Esc>" состоит из следующий частей:

c Оператор изменения
2w Перемещение на два слова, которые удаляются и редактор переходит в режим Вставки.
мешка для вставить этот текст
<Esc> возврат в Обычный режим

Вы, вероятно, обратили внимание, что пробел перед словом "кота" не был удалён.

Говорят, что для каждой проблемы есть решение, которое одновременно простое, элегантное и неправильное. То же можно сказать и о примере с командой "cw". Оператор c работает точно так же, как и оператор d, с одним исключением: "cw". Фактически, он работает в данном случае как "ce", изменение до конца слова. Таким образом, пробел после слова не включается. Это исключение существовало еще в Vi. Поскольку многие люди привыкли к такому поведению, оно сохраняется и в Vim.

ДРУГИЕ ИЗМЕНЕНИЯ

Подобно тому как "dd" удаляет целую строку, "cc" изменяет также всю строку целиком. Тем не менее, "cc" сохраняет существующий отступ (начальные пробелы).

Так же, как "d$" удаляет текст до конца строки, "c$" изменяет текст от курсора до конца строки -- всё равно что удалить текст при помощи "d$" и затем ввести команду "a" для перехода в режим Вставки и добавления нового текста.

СОКРАЩЁННЫЕ ВАРИАНТЫ

Некоторые команды, относящиеся к разряду оператор-перемещение, употребляются настолько часто, что им были сопоставлены однобуквенные команды:

x  используется для  dl (удаляет символ под курсором)
X  используется для  dh (удаляет символ слева от курсора)                                                
D  используется для  d$ (удаляет до конца строки)
C  используется для  c$ (изменяет до конца строки)
s  используется для  cl (изменяет один символ)
S  используется для  cc (изменяет всю строку)
ГДЕ ПОМЕЩАТЬ ЧИСЛО

Команды "3dw" и "d3w" удаляют три слова. Если вам интересны подробности, то на самом деле первая команда, "3dw", удаляет по одному слову три раза; команда "d3w" удаляет три слова один раз. Эти различия не имеют в итоге никакого отличия. Однако, вы можете поместить в команду два числа. Например, "3d2w" удаляет по два слова три раза, всего шесть слов.

ЗАМЕНА ОДНОГО СИМВОЛА

Команда "r" не является оператором. Она ожидает от вас ввода символа и заменяет на этот символ символ, находящийся под курсором. Того же эффекта можно добиться при помощи команды "cl" или "s", но "r" не требует ввода <Esc>

если где-то нет когн-то, дначит где-то кто-то есть ~
rЕ               rо    rз

Если где-то нет кого-то, значит где-то кто-то есть ~

Использование числовой приставки с командой "r" вызывает замену указанного количества символов на один и тот же данный символ. Например:

Если где-то нет кого-то, значит где-то кто-то есть ~
                7rх

Если где-то нет ххххххх, значит где-то кто-то есть ~

Для замены символа на перенос строки используйте "r<Enter>". Эта операция удаляет один символ и вставляет перенос строки. Использование числа в этом случае влияет только на количество удалённых символов: "4r<Enter>" заменяет четыре символа на один перенос строки.


04.3 Повторение изменений

Команда "." -- одна из самых простых, и, в то же время, самых мощных команд в Vim. Она повторяет последнее изменение. Например, представьте, что вы
редактируете файл HTML и хотите удалить все теги <B>. Для этого вы помещаете курсор на первом < и удаляете <B> командой "df>". Затем вы переходите к <  следующего </B> и удаляете его командой ".". Команда "." выполняет последнюю команду изменения, в нашем случае "df>". Для удаления следующего тега мы просто подводим курсор к символу < и используем команду ".".

                      Деньги <B>неудобны</B> лишь тем, что <B>их ~
f<   найти первое <   ------->
df>  удалить до >         -->
f<   найти след. <           --------->
.    повторить df>            --->
f<   найти след. <                   ---------------->
.    повторить df>                       -->

Команда "." работает для всех изменений, кроме команды отмены "u", повторного выполнения отменённой команды CTRL-R, и команд, которые начинаются с двоеточия (:).

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

/четыре<Enter>    найти первое слово "четыре"
cwпять<Esc>    заменить его на "пять"
n        найти следующее слово "четыре"
.         повторить замену слова на "пять"
n         найти следующее "четыре"
.         повторить замену
         и т.д.

04.4 Визуальный режим

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

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

Генерал -- это тот же ефрейтор ~
      -------------------->
              veeeelllllld

Генератор ~

При этом нет необходимости вести учёт -- сколько раз надо нажать "l", чтобы курсор оказался в необходимой позиции. Вы мгновенно видите текст, который будет удалён.

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

ВЫДЕЛЕНИЕ СТРОК

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

Например, для выделения трёх строк можно ввести "Vjj":

                     +------------------------+
              | текст текст текст      |
               >> | текст текст текст текс | |
выделенные строки >> | текст текст текст      | | Vjj
               >> | текст текст            | V
              | текст текст текст      |
              +------------------------+
ВЫДЕЛЕНИЕ БЛОКОВ

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

имя           Q1     Q2     Q3
петя          123    455    234
миша        0     90     39
саша          392    63     334

Чтобы удалить среднюю колонку "Q2", подведите курсор к "Q" и нажмите CTRL-V для перехода в режим Визуального блока. Затем переместите курсор на три строки вниз, например командой "3j", и вправо к следующему слову, командой "w". Поскольку выделение также захватит первый символ последней колонки, сдвиньте курсор влево на одну позицию командой "h". Теперь нажмите "d" и средняя колонка исчезнет.

ПЕРЕХОД НА ДРУГУЮ СТОРОНУ ВЫДЕЛЕНИЯ

Иногда в процессе выделения текста в Визуальном режиме, вы понимаете, что хотели бы, чтобы курсор находился с другой стороны выделенной области. Для перемещения курсора на другую сторону, пользуйтесь командой "o" (other, другой). Курсор переместиться к другой стороне выделения и вы сможете поправить границу выделения с другой стороны. Повторное нажатие "o" переносит курсор к другой стороне.

При блоковом выделении у области выделения четыре угла. Команда "o" перемещает курсор по диагонали, а "O" перемещает курсор к другому углу в той же строке.

Замечание:
"o" и "O" в Визуальном режиме работают совсем не так, как в Обычном режиме, где они открывают новую строку снизу или сверху от курсора.


04.5 Перемещение текста

При удалении текста, например с помощью команд "d" или "x", удалённый текст сохраняется в памяти. При помощи команды p (put, поместить) его можно вклеить в любом другом месте.
Попробуем, как это работает. Прежде всего, удалим целую строку, поместив на нее курсор и введя команду "dd". Теперь, переместим курсор туда, где вы хотели бы вклеить строку и введите команду "p". Удалённая строк будет вклеена под курсором.

строка          строка          строка
строка 2  dd    строка 3  p   строка 3
строка 3                  строка 2

Поскольку вы удалили целую строку, команда "p" вклеивает строку с текстом ниже курсора. Если вы удалите часть строки (например, слово), то команда "p" вклеит его сразу после курсора.

Из спасибо шапки не сошьешь ~
   -------->
      dw

Из шапки не сошьешь ~
   ----->
    whp

Из шапки спасибо не сошьешь ~
ЕЩЁ О ВКЛЕЙКЕ ТЕКСТА

Команда "P" также вклеивает текст, но перед курсором. Если вы удалите строку командой "dd", то "P" вклеит строку над курсором. После удаления слова при помощи команды "dw", "P" вклеивает его сразу перед курсором.

Вы можете повторять вклейку столько раз, сколько требуется. При этом будет использоваться один и тот же текст.

С командами "p" и "P" можно использовать числовую приставку. Текст будет повторяться столько раз, сколько указывает число. Таким образом, "dd3p"
поместит снизу от курсора три копии удалённой строки.

ПОМЕНЯТЬ МЕСТАМИ ДВА СИМВОЛА

Часто во время набора возникают опечатки, при которых два символа оказываются переставленными местами. Vim позволяет легко исправлять такие ошибки - просто подведите курсор к первому символу и выполните команду "xp". При этом происходит следующее: "x" удаляет символ и помещает его в регистр, а "p" вклеивает текст после курсора.

    навзание   назание   название ~
      x          p

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

Чтобы скопировать текст из одного места в другое можно было бы удалить его, воспользоваться командой "u" для восстановления, и затем вклеить его в другом месте при помощи команды "p". Существует более простой способ подобрать нужный фрагмент текста. Оператор "y" копирует текст в регистр. После этого можно пользоваться командой "p" в обычном порядке.

Vim называет эту операцию "yanking". Дело в том, что буква "c" уже используется для оператора изменения, поэтому для операции копирования придумали другое имя, совпадающее по смыслу и соответствующее выбранной для этой команды кнопке. (Ну, это всё только английского языка касается).

Поскольку "y" является оператором, то можно использовать такие команды, как например "yw" для копирования слова. Конечно же, можно употреблять и числовые приставки. Для того, чтобы скопировать два слова, можно использовать "y2w". Пример:

let sqr = LongVariable * ~
      -------------->
               y2w

let sqr = LongVariable * ~
                    p

let sqr = LongVariable * LongVariable ~

Обратите внимание, что "yw" включает пробел после слова. Если вас это не устраивает, то пользуйтесь "ye".

Команда "yy" копирует всю строку целиком, подобно тому как команда "dd" удаляет всю строку. Неожиданное поведение заключается в том, что "Y" работает точно так же, как и "yy", то есть копирует всю строку целиком, в то время как "D" удаляет текст от курсора до конца строки. Будьте внимательны, для копирования текста от курсора до конца строки пользуйтесь командой "y$".

    строка текста      yy    строка текста          строка текста
    строка 2               строка 2        p   строка 2
    последняя строка    последняя строка       строка текста
                               последняя строка

04.7 Использование буфера обмена

При использовании версии Vim с графическим интерфейсом (gvim), в меню "Редактировать" можно обнаружить операцию "Копировать". Для использования достаточно выбрать текст в Визуальном режиме, а затем использовать меню Редактировать/Копировать для копирования текста в системный буфер обмена. Скопированный текст можно вставлять в другие программы, в том числе в сам Vim.

Текст, скопированный в буфер обмена в любом приложении, можно вставлять при помощи меню Редактировать/Вставить как в Обычном режиме, так и в режиме Вставки. В Визуальном режиме вставленный текст будет заменять выделенный текст.

При помощи меню "Вырезать" текст будет удалён из файла после помещения в буфер обмена. Если в вашей системе есть всплывающее меню, то "Копировать", "Вырезать" и "Вставить" также доступны и на всплывающем меню. Кроме того, соответствующие кнопки можно найти на панели инструментов, если у Vim есть панель инструментов.

Если вы не используете версию с графическим интерфейсом, или не любите пользоваться меню, то для выполнения тех же операций можно пользоваться и клавиатурными командами. Для этого надо воспользоваться обычными командами "y" и "p", но с добавлением приставки "* (двойная кавычка звёздочка). Например, чтобы скопировать в системный буфер обмена текущую строку, пользуйтесь

"*yy

А для вставки текста из системного буфера пользуйтесь

"*p

Это работает только на версиях Vim, в которых есть поддержка системного буфера обмена. Подробнее об этом читайте в разделе 09.3.


04.8 Текстовые объекты

Если курсор находится в середине слова, которое вы хотите удалить, то прежде чем выполнить команду "dw" придётся переместить курсор в начало этого слова. Гораздо проще добиться того же эффекта командой "daw".

молчание - просто хорошо отредактированный ответ ~
             daw

молчание - хорошо отредактированный ответ ~

"d" в "daw" это оператор удаления. "aw" ("A Word", слово) это текстовый объект. Таким образом, "daw" означает "удалить слово". Точнее говоря, пробел после слова также будет удалён (пробел перед словом "хорошо").

Использование текстовых объектов является третьим способом внесения изменений в Vim, в дополнение к уже изученным "оператору с перемещением" и Визуальному режиму.
Текстовые объекты очень похожи на операторы с перемещением, но, вместо совершения операции над фрагментом текста между текущей и последующей позицией курсора, текстовый объект рассматривается как целое. Положение курсора внутри объекта не имеет значения.

Для изменения целого предложения пользуйтесь командой "cis". Посмотрите на следующий текст:

Это лифт, а не всякие там спектроскопы-микроскопы. Лифт есть ~
мощное средство передвижения, это первое. А также средство ~
транспорта. Лифт должен быть как самосвал: приехал, вывалил и ~

Поместим курсор в начале второй строки и введём команду "cis":

Это лифт, а не всякие там спектроскопы-микроскопы.  А также средство ~
транспорта. Лифт должен быть как самосвал: приехал, вывалил и ~

Курсор будет находиться между пробелами на месте второго предложения. Теперь вы можете вставить на это место любое другое предложение.

"cis" состоит из команды изменения "c" и текстового объекта "is" (Inner Sentence, внутреннее предложение). Также имеется объект "as" (a sentence, предложение). Различие между этими двумя заключается в том, что "as" включает пробел после предложения, а "is" не включает. Если бы вы захотели удалить вместе с предложением и пробел после него, то можно было бы использовать команду "das". Если вы хотите на месте старого предложения напечатать свой текст и сохранить пробель после предложения, то используйте команду "cis".

Текстовые объекты можно использовать и в Визуальном режиме. В этом случае текстовый объект будет включён в выделение. Визуальный режим не будет прерван, поэтому можно будет проделать это несколько раз. Например, перейдя в Визуальный режим, попробуйте выбрать предложение при помощи "as". Для включения в выделение новых предложений можно повторять "as" до тех пор, пока не будет выделена вся область, над которой вы хотите провести операцию.

Список текстовых объектов можно найти здесь: Выделение текстовых объектов.


04.9 Режим замены

Команда "R" переводит Vim в режим замены. В этом режиме символы, которые вы набираете, заменяют символы, расположенные под курсором. Так продолжается до тех пор, пока вы не нажмёте <Esc>.

Приведём пример:

Однажды в студеную пору ~
            Rзимнюю<Esc>
    
Однажды в студеную зимнюю ~

Обратите внимание, что в этом примере команда заменила четыре символа на шесть других. Команда "R" автоматически расширяет строку, если заканчиваются символы для замены. Команда "R" не переносит текст на следующую строку.

Между режимами Вставки и Замены можно переключаться кнопкой <Insert>.

Если в режиме Замены вы воспользуетесь кнопкой <BS>, то обратите внимание, что старый текст восстанавливается. Таким образом, он работает вместо команды отмены для последнего набранного символа.


04.10 Выводы

Операторы, команды перемещения и текстовые объекты предоставляют вам возможности для множества комбинаций. Если вы знаете как всё это работает, то сможете использовать N операторов с M команд перемещений для выдачи N * M команд!

Список операторов можно найти здесь: Перемещения и операторы.

Например, для удаления фрагментов текста существует множество способов. Вот лишь несколько наиболее употребимых:

x удалить символ под курсором (сокращение для "dl")
X удалить символ перед курсором (сокращение для "dh")
D удалить текст от курсора до конца строки (сокращение для "d$")
dw удалить текст от курсора до начала следующего слова
db удалить текст от курсора до начала предыдущего слова
diw удалить слово под курсором (исключая пробел)
daw удалить слово под курсором (включая пробел)
dG удалить до конца файла
dgg удалить текст от курсора до начала файла
   

Если вместо "d" использовать "c", то вы получите соответствующие команды замены, а с "y" у вас будет набор команд для вклейки, и т.д.

~ изменить регистр символа под курсором и переместить курсор к следующему символу. Это не оператор (если только не включена опция 'tildeop'), поэтому вы не можете использовать с тильдой команды перемещения. Тильда также работает в Визуальном режиме, где изменяет регистр всех выделенных символов.
I Переход в режим Вставки после перемещения к первому пробельному символу строки.
A Перейти в режим Вставки после перемещения курсора в конец строки.

Следующая глава: Настройки
Авторские права: см. Авторские права