Чи можете ви захопити або видалити між дужками in vi / vim?


128

З огляду на цей рядок коду на C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Чи є спосіб видалити або витягнути з першої жирної дужки його відповідні дужки? Я подумав про df) , але це лише добереться до вас лише після 9.0.

Чи існує подібний спосіб отримати vim, щоб схопити все між відповідними дужками, незалежно від нових рядків?

Відповіді:


167

Різні рухи:%

%Команда стрибає на матч пункту під курсором. Помістіть курсор на відкриваючий (або закриваючий) парен і використовуйте y%для збивання або d%для видалення всього з курсору до відповідного.

Це працює, оскільки %це "команда руху", тому її можна використовувати будь-де, коли очікує таку команду. Від :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

За замовчуванням "елемент" включає дужки, дужки, паролі, коментарі у стилі С та різні заяви прекомпілятора ( #ifdefтощо).

Існує плагін для "розширеного% відповідності", який ви можете знайти на домашній сторінці Vim .

Ви можете прочитати документацію про %та пов'язані з ними команди руху, ввівши :help various-motionsв командному режимі.

об'єкт-вибір

Існує ще один набір команд руху, які можна використовувати у режимі Visual для вибору різних текстових об'єктів.

Для вирішення вашої конкретної проблеми слід зробити наступне:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Скажімо, ваш курсор розташований на ^. Введіть таку послідовність, щоб вибрати потрібну частину:

v2a)

Спочатку vпереходить у візуальний режим, потім ви вказуєте, що хочете 2підняти рівні паролів вгору. Нарешті a)вибирає "блок". Після цього ви можете використовувати dабо xвидалити і т.д.

Якщо ви не хочете включати зовнішні паролі, замість цього можете використовувати "внутрішній блок":

v2i)

Дивіться :help object-selectповний список пов'язаних команд.


Дякую! Я знав про% перемикання між відповідними елементами; не знав, що це також було корисно в командах. +1 та прийнято.
romandas

5
Цікаво, що я завжди думав, що aозначає «навколо», а не «а». Відчувайте, що вона доповнює «внутрішнє» краще. Не минає й дня, не дізнавшись про щось нове про Віма.
Ендрю Маршалл

217

Як щодо dibабо di(.

Він видалить внутрішній (...) блок, де знаходиться курсор.

Я люблю рухи та виділення тексту та об’єктів !


10
На щастя, це питання є першим враженням, коли я переглядаю його - я не знаю, скільки разів ця відповідь врятувала мене. І я завжди це забуваю… :-(
Конрад Рудольф

16
Чи можливо видалити, включаючи дужки? (Так, я відповів на мій власний питання: dab=> видалити в блок (включаючи його дужки)
bantic

5
Я голосую. Крім того, якщо ви хочете виправити слово всередині дужок, зробіть ciw .
розробник Marius Žilėnas

5
+1! Мені спало на думку, коли я нещодавно виявив рухи тексту-об’єкта! більше не намагаючись розташувати курсор у потрібному місці, щоб витягнути текст: D
текст

36

Щоб видалити все, що знаходиться всередині пари в дужках, завжди можна видавати di(та його похідні.

Примітка :

Як @porglezomb запропонував у своєму коментарі, ви можете використовувати a("разом з") замість i("всередині") для включення дужок. Таким чином, використовуючи da(видаляємо все всередині (і )включаючи (і ).

Видалення тексту всередині безпосередньо зовнішньої дужки:

Отже, для цього рядка коду

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

припускаючи, що ваш курсор знаходиться у вищезгаданому діапазоні курсорів, ви можете видавати наступні команди:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Видалення тексту всередині n-ї зовнішньої пари дужок:

Щоб схопити все всередині п’ятої зовнішньої пари круглих дужок, просто додайте nперед вищевказаною командою. Отже, з тим же положенням курсору, що і вище,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'

3
Вам слід додати нотатку, про яку йдеться aяк про аналог i, оскільки це, мабуть, допоможе багатьом людям.
porglezomp

@romandas це має бути прийнятим питанням. Я шукав саме таку проблему сьогодні, і @Kevin єдиний, хто дав належну відповідь. Звичайно, я міг би «неправильно використати» %цю проблему, але це потребує більше часу і, на мою думку, слід використовувати лише для складніших сценаріїв. Видалення чого-небудь всередині певного діапазону є саме тим випадком використання di.
daniel451

19

Ви можете використовувати d%для вилучення та y%для янь.


3
% - специфікатор руху для "збігнутих дужок, дужок чи дужок". Будь-яка специфікація руху може бути сполучена з d і y (та багато інших речей).
хаос

10

Розмістіть курсор на першій дужці, потім натисніть v%yабо v%d.


3
Чудово! % переходить до відповідного батька. Таким чином, ви навіть можете використовувати d% і y%.

1
Зверніть також увагу, що 'd%' може розпочатися на початку імені функції та видалить увесь виклик функції. Він також працює для пар {{} ',' [] 'і навіть' <> '.
Джонатан Леффлер

@Leffler, дякую за поради! І добре знати, що% працює і у візуальному режимі.
страгер

3

Спробуйте ci [блок-оточення]

У вашому випадку розміщуйте курсор де-небудь між двома круглими дужками та спробуйте клавіші: ci (


Близько. Перевіривши це, схоже, що курсор повинен знаходитись у першій дужці, а не між, а "c" - команда зміни. За допомогою курсору, що відкриває дужки, 'di (' видаляє відповідні дужки, що закриваються, і 'yi (' янки.
Річард Ніш

ci працює для мене весь час. Все, що мені потрібно зробити, це переконатися, що курсор знаходиться між дужками, які оточують блок тексту, який мені потрібно видалити.
Джастін Нгуен

2

Як відповідає відповідь Девіда Нормана,

Розмістіть курсор на першій дужці, потім натисніть v%yабо v%d.

Пояснення з http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

тег char note note у звичайному режимі        
-------------------------------------------------- ----------------------------
| v | v запуск символу Візуальний режим
|% | % 1 знайде наступну (фігурну / квадратну) дужку
                                       цей рядок і перейти до його відповідності, або перейти до
                                       відповідна дужка коментарів або перейдіть до відповідності
| d | ["x] d {motion} 2 видалити текст Nmove [в буфер x]

Це означає, що він буде вибирати все між і включати два дужки ( %), показуючи вам візуально ( v), а потім витягувати / копіювати yабо видаляти / вирізати d. (До буфера за замовчуванням.)

Ви можете покласти / вставити за допомогою p.

Зробив цю відповідь, щоб "навчити себе ловити рибу" .


Примітка: vimdoc.sourceforge.net посилається на vim.org, який є офіційним сайтом vim станом на 2015 рік
n611x007,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.