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

С учетом этой строки кода в C:

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

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

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

Ответ 1

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

Команда % переходит к совпадению элемента под курсором. Поместите курсор на паз открытия (или закрытия) и используйте y% для yanking или 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.

По умолчанию "элемент" содержит скобки, фигурные скобки, парсеры, комментарии в стиле С и различные предкомпиляторы (#ifdef и т.д.).

Существует плагин для "расширенного% соответствия", который вы можете найти на домашней странице Vim.

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

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

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

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

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

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

v2a)

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

Если вы не хотите включать внешние parens, вы можете вместо этого использовать "внутренний блок":

v2i)

См. :help object-select для полного списка связанных команд.

Ответ 2

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

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

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

Ответ 3

Чтобы удалить все, что находится внутри пары круглых скобок, вы всегда можете выдать 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))'

Ответ 4

Вы можете использовать d% для удаления и y% для yanking.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

tag                char           note action in Normal mode        
------------------------------------------------------------------------------
|v|                v                   start characterwise Visual mode
|%|                %                1  find the next (curly/square) bracket on
                                       this line and go to its match, or go to
                                       matching comment bracket, or go to matching
|d|                ["x]d{motion}    2  delete Nmove text [into buffer x]

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

Вы можете поместить/вставить с помощью p.

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