Можете ли вы взять или удалить скобки в vi / vim? - PullRequest
107 голосов
/ 01 января 2009

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

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

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

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

Ответы [ 7 ]

179 голосов
/ 01 января 2009

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

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

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

153 голосов
/ 01 января 2009

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

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

28 голосов
/ 27 июля 2014

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

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

10 голосов
/ 01 января 2009

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

2 голосов
/ 15 января 2014

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

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

0 голосов
/ 01 апреля 2015

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

Наведите курсор на первую скобку, затем нажмите 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), а затем дергать / копировать y или удалять / вырезать d. (В буфер по умолчанию.)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...