Vim: замена текста в теле функции - PullRequest
5 голосов
/ 30 марта 2011

У меня есть несколько очень полезных плагинов для поиска и замены текста через файлы (см. EasyGrep vim script - это очень полезно для программистов). Я даже могу заменить текст только в текущем буфере - используя плагины или :%s .... Но что, если я просто хочу заменить текст в текущем теле функции?

Рассмотрим следующий пример:

void f0()
{
     int foo = 0;
     // ...
}

// 99 other functions that uses foo as local variable.

void f100()
{
     int foo = 0;  // I want to replace foo with bar only in this function
     // 1000 lines of code that uses foo goes below
     // ...
}

Конечно, я могу использовать :%s ... с флагом c для подтверждения, но я считаю, что есть более быстрый способ сделать это.

Спасибо.

Ответы [ 3 ]

14 голосов
/ 30 марта 2011

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

Для создания выделения :

Перейдите в визуальный режим. Например, с помощью Shift+v выберите несколько строк и введите :.

Ваше приглашение будет выглядеть так: :'<,'> это означает: текущий выбор

Введите затем s/foo/bar/g, и он заменит foo на bar в текущей выбранной строке.

Способ выбора содержания функции лучше состоит в том, чтобы перейти внутрь функции с помощью курсора и ввести: vi} будет выбирать все от { до }.

См. :help text-objects для получения дополнительных советов по выбору.

6 голосов
/ 30 марта 2011

Вы можете пометить функцию буквой V. Затем, когда вы введете команду в:, она будет автоматически иметь префикс и выполняться только в отмеченной области.

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

1 голос
/ 10 декабря 2015

Я всегда использовал [[, чтобы перейти к началу функции, а затем использовать%, чтобы перейти к концу функции.Я использовал mt и mb , чтобы отметить верхнюю и нижнюю части функции соответственно.Затем для поиска и замены в отмеченных сверху и снизу : 't,' bs / pattern / newpattern / g .Это всегда работало для меня.Я уверен, что вы можете создать макрос для этого.

Визуальный выбор (vi}) намного проще и быстрее.Он знает о позиции курсора.Таким образом, если курсор находится внутри субблока функции, то vi} выбирает все строки в этом блоке.Если вы хотите выбрать всю функцию, нужно поместить курсор за пределы субблоков, затем выполните vi}.Это отлично подходит для функциональных блоков, которые вписываются в текущее окно.Для функций, выходящих за пределы текущего окна, выбор теряется при прокрутке вверх.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...