2012-05-02 3 views
2

Есть ли способ установить диапазон редактирования файла в Vim, чтобы он применим к любой последующей команде? Я собираюсь сделать большой рефакторинг функции, и я хотел бы ограничить все мои изменения (замены в этом случае) только этой функцией. Раньше я только что скопировал функцию в новый буфер, сделал изменения и скопировал их обратно в основной файл, но я надеюсь, что есть более умный способ.Настройка диапазона редактирования в Vim

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

Любые другие предложения?

+0

Если ваш функция использует фигурные скобки, вы можете использовать '$ v%' для выбора всей функции в либо начальную, либо конечную скобу. –

+0

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

+0

@tandu Если vim был скомпилирован с + текстовыми объектами, вы можете легко выбрать целую функцию, в которой находится курсор с помощью 'va {' –

ответ

4

Вот крутой трюк со складками:

  1. Сложите всю свою функцию.

  2. Выполните замену, :s/foo/bar/c<Enter>, отметьте флаг c для «подтверждения», это важно при проведении рефакторинга в Vim. Замена будет применена к каждой строке в сгибом. AFAIK, вы можете запустить любую команду Ex таким образом, но я никогда не использовал этот трюк ни с чем другим, кроме :s и :g/:v.

  3. Нажмите y/n, чтобы принять/отклонить каждую замену.

  4. После того, как вы приняли/отклонили последнюю замену, сбрасывание моментально возвращается в «закрытое» состояние: вам не нужно вводить диапазон для следующей подстановки.

  5. GOTO 2

+0

Ничего себе, это аккуратный трюк. Я никогда не был поклонником складок, но это, безусловно, делает то, что я ищу. Благодаря! – Pak

0

Предполагая, что vim был скомпилирован с + текстовыми объектами, вы можете выбрать функцию как блок. Поэтому, возможно, вы ищете:

va{:s/foo/bar 

Для замены foo на панель только в текущей функции {} в скобках. Если ваши функции не ограничены фигурными скобками, вы можете написать функцию для выбора диапазона в соответствии с некоторыми правилами синтаксиса, но, возможно, это достаточно хорошо для ваших нужд.

+0

. Я действительно знаю об этом методе (но не использую его почти так же, как Я должен). Проблема с этим решением заключается в том, что он все еще полагается на то, что мне нужно запомнить тип va {перед каждой командой. В идеале я мог бы установить диапазон один раз, а затем использовать что-то вроде% s для каждой последующей команды.Кроме того, va {зависит от моей текущей позиции курсора, поэтому, если я в настоящее время включен в оператор if, он будет выбирать только этот блок, и мне нужно будет нажать {еще несколько раз, чтобы получить всю функцию. – Pak

Смежные вопросы