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

StackOverflow https://stackoverflow.com/questions/405415

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Поместите курсор на первую скобку, затем нажмите 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top