Vim (сокращение от Vi Improved, произносится как «vim») — кошмар для обычного пользователя. Если вам, наконец, удастся закрыть ее, вы вздохнете с облегчением и твердо уверены, что никогда больше не будете запускать эту программу ни разу в своей жизни.
Пожалуй, Vim нельзя просто запустить и начать работать — это требует некоторой подготовки. Но как только вы попробуете его в действии, вы удивитесь, как можно было обходится без него.
Базовый поиск и замена
В Vim вы можете найти и заменить текст с помощью команды: substitute (: s).
Чтобы запускать команды в Vim, вы должны находиться в обычном режиме — режиме по умолчанию при запуске редактора. Чтобы вернуться в обычный режим из любого другого режима, просто нажмите клавишу Esc.
Общая форма команды замены следующая:
:[range]s/{pattern}/{string}/[flags] [count]
Команда ищет в каждой строке [range]
шаблон {pattern}
и заменяет его на {string}
. [count]
раз (положительное целое число) повторение команды.
Если не указаны [range]
и [count]
, будет заменен только образец, найденный в текущей строке. Текущая строка — это строка, в которой находится курсор.
Например, чтобы найти первое вхождение «foo»
в текущей строке и заменить его на «bar»
, вы должны использовать:
:s/foo/bar/
Чтобы заменить все вхождения шаблона поиска в текущей строке, добавьте g
флаг:
:s/foo/bar/g
Если вы хотите найти и заменить шаблон во всем файле, используйте символ процента % в качестве диапазона. Этот символ указывает диапазон от первой до последней строки файла:
:%s/foo/bar/g
Если часть {string}
опущена, она будет рассматриваться как пустая строка, и соответствующий шаблон будет удален. Следующая команда удаляет все экземпляры «foo»
в текущей строке:
:s/foo//g
Вместо косой черты (/) можно использовать любой другой небуквенно-цифровой однобайтный символ, за исключением разделителя. Эта опция полезна, если в шаблоне поиска или строке замены есть символ ‘/’.
:s|foo|bar|
Для подтверждения каждой замены используйте c
флаг:
:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?
Нажмите y, чтобы заменить совпадение, или l, чтобы заменить совпадение и выйти. Нажмите n, чтобы пропустить совпадение, q или Esc, чтобы выйти из замены. a вариант заменяет текущее совпадение и все остальные вхождения. Для прокрутки экрана вниз используйте CTRL Y , а для прокрутки вверх используйте CTRL E.
Вы также можете использовать регулярные выражения в качестве шаблона поиска. Приведенная ниже команда заменяет все строки, начинающиеся с «foo», на «Vim is the best»:
:%s/^foo.*/Vim is the best/gc
Символ ^
(каретка) соответствует началу строки и .*
соответствует любому количеству любых символов.
Чувствительность к регистру
По умолчанию операция поиска чувствительна к регистру; поиск «FOO» не будет соответствовать «Foo».
Чтобы игнорировать регистр в шаблоне поиска, используйте i
флаг:
:s/Foo/bar/gi
Другой способ принудительно игнорировать регистр — добавить c после шаблона поиска.
Если вы изменили регистр по умолчанию и хотите выполнять поиск с учетом регистра, используйте флаг I.
:s/foo/bar/gI
Заглавные буквы C
после шаблона приводят к поиску совпадений по регистру.
Диапазон поиска
Если интервал не указан, команда переопределения работает только в текущей строке.
Диапазон может быть строкой или интервалом между двумя строками. Спецификаторы строки разделяются символом , или ; . Диапазон можно указать с помощью абсолютного номера строки или специальных символов.
Например, чтобы заменить все вхождения ‘foo’ на ‘bar’ во всех строках от строки 3 до строки 10, вы должны использовать:
:3,10s/foo/bar/g
Диапазон является включительным, что означает, что первая и последняя строки включены в диапазон.
Точка . обозначает текущую строку, а знак доллара $ обозначает последнюю строку. Чтобы заменить ‘foo’ на всех строках от текущей до последней:
:.,$s/foo/bar/
Спецификатор строки также можно установить с помощью символа «» или «-», за которым следует число, которое добавляется к предыдущему номеру строки или вычитается из него. Если число после символа опущено, по умолчанию используется 1.
Например, чтобы заменить каждый «foo» на «bar» из текущей строки и следующих четырех строк, введите:
:., 4s/foo/bar/g
Замена всего слова
Команда replace находит образец как строку, а не целое слово. Если, например, вы искали «gnu», поиск совпадет с тем, что «gnu» включено в более крупные слова, такие как «cygnus» или «magnum».
Чтобы отметить начало слова, введите < , введите > чтобы отметить конец слова:
Например, чтобы найти слово «foo», вы должны использовать:
:s//bar/
История замены
Vim отслеживает все команды, которые вы выполняете в текущем сеансе. Чтобы просмотреть историю предыдущих команд замены, введите :s
и используйте клавиши со стрелками вверх/вниз, чтобы найти предыдущую операцию замены. Чтобы запустить команду, просто нажмите Enter. Вы также можете отредактировать команду перед выполнением операции.
Примеры
Строки комментариев (добавить #
перед строкой) от 5 до 20:
:5,20s/^/#/
Раскомментируйте строки с 5 по 20, отмените предыдущие изменения:
:5,20s/^#//
Замените все экземпляры «яблоко», «апельсин» и «манго» на «фрукты»:
:%s/apple|orange|mango/fruit/g
Удалите завершающие пробелы в конце каждой строки:
:%s/s $//e
Если то, что было описано выше, полезно для вас и Vim подходит для написания и редактирования текста, пора начать компилировать ваш файл конфигурации. Для этого откройте файл vimrc в своем домашнем каталоге и введите в нем команды, которые вы сочтете полезными для повседневного использования. Для меня это ширина текста, проверка орфографии и использование макроса для выравнивания текста «по абзацам».
Кроме того, если используется Unicode, настоятельно рекомендую ознакомиться с материалами на ru.wikibooks.org/wiki/Vim и записать переназначение символа в файл конфигурации. Потому что постоянная смена русско-английской раскладки в командном режиме утомляет.