Як отримати попередній перегляд команди підстановки?


9

Досить часто я знаходжу себе в необхідності здійснити заміну, яка матиме розбиті збіги у великому файлі та з нетривіальними виразами пошуку та заміни.

Наприклад, скажіть, у мене є такі функції, як дзвінки okFunction(arg1, arg2 arg3). Звичайно, аргументи будуть відрізнятися з кожним викликом функції. Тепер скажіть, що я виявив кращу функцію, яка не потрібна arg2. Я можу легко налаштувати весь файл за допомогою

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

Хоча концептуально простий, але я не впевнений, що я правильно зрозумів синтаксис у цій досить довгій схемі. cПрапор дійсно допомагає тут, але проблема в тому , що при запиті підтвердження ВІМ буде непереливки , що матч буде замінений. Я маю на увазі, він покаже вираз заміни, але не оцінений результат. Якщо я підтверджую заміну y, vim негайно перейде до наступного матчу, і я не буду спокійно бачити, чи допустив я помилки.

Я знайшов плагін vim-over, який частково вирішує проблему, але тільки якщо на екрані видно всі математичні елементи, коли ви вводите команду. Після натискання клавіші enter, поведінка точно така, як я описав вище, і я не отримую попереднього перегляду.

Отже, чи є спосіб отримати vim для оцінки виразу заміни, коли запитують підтвердження на команди-замінники?


2
це пункт списку бажань у трекері vim-bug (вибачте, зараз його не знаходять)
Christian Brabandt

2
Для чого це варто, я зазвичай використовую заміну в першому рядку для заміни без %, перевірте, чи є результат тим, чого я очікував, а потім використовую заміну %(це лише кілька натискань клавіш:) :<up><c-b>%. Очевидно, що параметр попереднього перегляду буде набагато ефективнішим. Хоча патч недоступний, можливо, можна було б перетворити підстановку у функцію vimscript з таким варіантом, але це звучить як багато роботи ...
statox

2
@ChristianBrabandt Знайшов це . Це поки що з некласифікованим пріоритетом ...
Vitor Eiji

2
@VitorEiji це був не той, про кого я думав. Але це насправді не має значення, оскільки наразі це неможливо. Neovim надає варіант "вимагати", який може спрацювати (чи ні, я зараз не дуже)
Крістіан Брабандт

Зло попередньо переглядає заміну; Я не знаю, як це робиться, хоча.
Джеремия

Відповіді:


2

Одне вирішення - макроси. Виділіть усі проблемні області та робіть заміну по одній лінії за один раз. Тоді вирішіть, хочете ви цього чи ні. Як тільки ви зробите nв наступній області.

Для вашого конкретного випадку:

  1. Пошук областей: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Почніть записувати макрос qq.
  3. Застосувати :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Зупиніть макрос запису q
  5. Скасуйте ( u) або перейдіть до наступного результату пошуку ( n).
  6. Застосувати макрос @q.
  7. Повторіть кроки 5 та 6 за потребою.

Очевидно, не зовсім те, що ви шукали, але це зазвичай те, що я роблю.


круто! Я ніколи не усвідомлював, що коли ти робиш пошук, /він також поводиться як візуальний вибір - приємно.
the_velour_fog

@the_velour_fog " /... поводиться як візуальний вибір." Насправді це не так. Причина, чому це працює, полягає в тому, що :s//дії на поточному рядку та використання nпереносять вас до наступного явища.
Tumbler41

1
Якщо ви не вказали шаблон для :s/pattern/replacementнього, буде використано останню пошукову рядок, тому на кроці 3 ви можете фактично застосувати, :s//betterFunction(\1, \3)/gщоб зберегти деякий текст.
Хаегін

@ Tumbler41 ах, дякую за уточнення. Так, я також виконую цю основну техніку пошуку , потім застосовую макрос , я зазвичай спочатку заповнюю аргумент і використовую :vimgrep /pattern/ ##потім застосувати макрос , так, якщо виявиться, що моя картина насправді співпадає, а макрос - занадто нудна, я можу швидко повернутися до :argdo %s/.../..../gcта почати літати через операцію
the_velour_fog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.