Можете ли вы захватить или удалить в скобках в vi / vim?


129

Учитывая эту строку кода на C:

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

Есть ли способ удалить или перенести первую жирную скобку на соответствующую скобку? Я думал о df) , но это поможет вам сразу после 9.0.

Есть ли аналогичный способ заставить vim захватывать все между соответствующими фигурными скобками, независимо от новых строк?

Ответы:


168

Различные движения:%

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

Это работает, потому что %это «команда движения», поэтому ее можно использовать везде, где vim ожидает такую ​​команду. Откуда :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.

По умолчанию «элемент» включает скобки, фигурные скобки, скобки, комментарии в стиле C и различные операторы прекомпилятора ( #ifdefи т. Д.).

На домашней странице Vim есть плагин для "расширенного% соответствия" .

Вы можете прочитать документацию %и связанные с ними команды движения, войдя :help various-motionsв командный режим.

объект-выберите

Существует еще один набор команд движения, которые вы можете использовать в визуальном режиме для выбора различных текстовых объектов.

Чтобы решить вашу конкретную проблему, вы должны сделать следующее:

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 01

5
Интересно, я всегда думал, что aозначает «около», а не «а». Почувствуйте, как он лучше дополняет «внутреннее». Кажется, не проходит и дня, чтобы не узнать что-то новое о Vim.
Эндрю Маршалл

218

А как насчет dibили di(.

Он удалит внутренний (...) блок, на котором находится курсор.

Я люблю движения и выделения текстовых объектов !


10
К счастью, этот вопрос становится первым, когда я ищу его в Google - я не знаю, сколько раз этот ответ меня спасал. И я всегда это забываю… :-(
Конрад Рудольф

16
Можно ли удалить включая круглые скобки? (да, я ответил на мой собственный вопрос: dab=> удалить в блок (включая его скобки)
bantic

5
Я голосую за. Кроме того, если вы хотите исправить слово в скобках, сделайте ciw .
Разработчик Мариус Жиленас,

5
+1! Я был поражен, когда недавно обнаружил движения текстовых объектов! больше не нужно пытаться
поместить

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-й внешней пары круглых скобок, просто добавьте 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 09

@romandas, это должен быть принятый вопрос. Сегодня я искал ту же проблему, и @Kevin - единственный, кто здесь дает правильный ответ. Конечно, я мог бы «неправильно использовать» %эту проблему, но это требует больше времени и, на мой взгляд, должно использоваться только для более сложных сценариев. Удаление чего-либо внутри определенной области - это именно тот сценарий использования di.
daniel451

19

Можно использовать d%для удаления и y%для рывка.


3
% - это спецификатор движения для «совпадающих скобок, скобок или скобок». Любая спецификация движения может быть связана с d и y (и многими другими вещами).
хаос

10

Поместите курсор на первую скобку, затем нажмите v%yили v%d.


3
Большой! % переходит к соответствующему парену. Таким образом, вы даже можете использовать d% и y%.

1
Также обратите внимание, что 'd%' может начинаться с начала имени функции и удалит весь вызов функции. Он также работает для пар '{}', '[]' и даже '<>'.
Джонатан Леффлер,

@Leffler, спасибо за подсказки! И хорошо знать, что% работает и в визуальном режиме.
Strager 01

3

Попробуйте ci [block-surrounder]

В вашем случае поместите курсор в любое место между двумя выделенными скобками и попробуйте использовать клавиши: ci (


Почти. При тестировании похоже, что курсор должен находиться в первой скобке, а не между ними, а «c» - это команда изменения. Когда курсор находится на открывающей скобке, 'di (' удаляется до соответствующей закрывающей скобки, а 'yi (' yanks.
Ричард Нейш

ci у меня работает постоянно. Все, что мне нужно сделать, это убедиться, что курсор находится между скобками, окружающими блок текста, который мне нужно удалить.
Justin Nguyen

2

Как говорится в ответе Дэвида Нормана:

Поместите курсор на первую скобку, затем нажмите v%yили v%d.

Объяснение с http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

тег char note действие в обычном режиме        
-------------------------------------------------- ----------------------------
| V | v запустить посимвольный визуальный режим
|% | % 1 найти следующую (фигурную / квадратную) скобку на
                                       эту строку и перейдите к ее совпадению, или перейдите к
                                       соответствующая скобка комментария или перейти к соответствующему
| D | ["x] d {движение} 2 удалить Nпереместить текст [в буфер x]

Это означает, что он будет выбирать все, что находится между двумя скобками ( %) включительно, показывая вам выбор визуально ( v), а затем выдергивает / копирует yили удаляет / вырезает dего. (В буфер по умолчанию.)

Ставить / вставлять можно с помощью p.

Сделал этот ответ, чтобы «научиться ловить рыбу» .


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