Как выбрать между скобками (или кавычками) в Vim?

Я уверен, что раньше был плагин для такого рода вещей, но теперь, когда он мне нужен, я не могу его найти (естественно), поэтому я просто попрошу красиво и просто.

Как проще всего выбрать скобки, кавычки или вообще список совпадающих символов?

   write ( *, '(a)' ) 'Computed solution coefficients:'

Например, здесь я хочу выбрать (a) или Computed solution coefficients:.

Меня не интересуют многострочные, просто случаи, которые встречаются в одной строке.


person Rook    schedule 30.06.2009    source источник


Ответы (9)


Используйте любую клавишу навигации, которую хотите поместить в круглые скобки, затем вы можете использовать yi( или yi), чтобы скопировать все, что находится в совпадающих скобках. Это также работает с квадратными скобками (например, yi]) и фигурными скобками. Помимо y, вы также можете удалить или изменить текст (например, ci), di]).

Я пробовал это с двойными и одинарными кавычками, и, похоже, там тоже работает. К вашему сведению, я делаю:

write (*, '(a)') 'Computed solution coefficients:'

Переместите курсор на C, затем введите yi'. Переместите курсор в пустую строку, нажмите p и получите

Computed solution coefficients:

Как указано в CMS, это также работает для выбора визуального режима - просто используйте vi), vi}, vi' и т. д.

person Tim Whitcomb    schedule 30.06.2009
comment
Обычно я ищу способ выбрать все между предопределенными совпадающими символами (обычно только одинарные и двойные кавычки и скобки всех видов). - person Rook; 30.06.2009
comment
Что вы подразумеваете под разделенными словами? Я попробовал его на [x, y, z], и он выбрал x, y, z - person Tim Whitcomb; 30.06.2009
comment
Пропустить последний комментарий - нашел, в чем проблема. Работает как шарм :-) - person Rook; 30.06.2009
comment
похоже, он также работает с кавычками yi" выберите все кавычки - person stefanB; 05.03.2012
comment
ci( или ci) делает то, что я искал. Спасибо. Я все еще не совсем понимаю i в этом случае, но кого это волнует, пока он работает, верно? :) - person justnorris; 06.05.2013
comment
Как указано ниже, проверьте справку по текстовым объектам. i изменяет команду c, поэтому она больше не вставляется: я думаю, что это внутри, поэтому ci( становится изменением в круглых скобках. Если вы хотите включить скобки, используйте a вместо i, например ca( - person Tim Whitcomb; 06.05.2013
comment
Я добавил ответ ниже, описывающий мой плагин vim-textobj-quotes, который предоставляет унифицированный текстовый объект для обработки различных типов кавычек с одной привязкой ключа. - person Anton Beloglazov; 09.04.2014
comment
есть ли способ, который после рывка переходит в режим вставки? - person Moj; 23.10.2015
comment
Обратите внимание, что при вызове не обязательно находиться внутри кавычек, собственная команда ищет первое появление текста внутри кавычек в текущей строке и удаляет его, поэтому вы можете сохранить несколько нажатий клавиш. - person aturegano; 06.10.2016
comment
Аккуратный! Это круто, но учтите, что это работает только с кавычками. Попытка использовать круглые скобки, похоже, не сработала. - person Tim Whitcomb; 06.10.2016

Чтобы выбрать одинарные кавычки, я обычно использую vi' («выбрать внутренние одинарные кавычки»).

Внутри блока скобок я использую vib ("выбрать внутренний блок")

Внутри блока фигурных скобок вы можете использовать viB ("заглавная буква B")

Чтобы сделать выбор «включающим» (выберите также кавычки, круглые скобки или фигурные скобки), вы можете использовать a вместо i.

Вы можете узнать больше о выборе текстовых объектов в руководстве или :help text-objects в пределах vim.

person Christian C. Salvadó    schedule 30.06.2009
comment
спасибо за этот совет, я искал и просил что-то подобное и не был удовлетворен своими результатами. Потрясающий. - person alfredodeza; 18.11.2010
comment
этот совет очень прост и легко закрепить в моей мозговой и мышечной памяти. благодаря. - person Ghazaly; 27.11.2010
comment
Это очень полезный совет. Больше не нужно возиться с лишними нажатиями клавиш. Спасибо за ссылку. - person Rai; 18.01.2015

Этот метод выбора встроен и подробно описан в справке Vim. Он охватывает теги XML и многое другое.

См. :help text-objects.

person michael    schedule 30.06.2009
comment
: help text-objects приближается к полезным вещам ... вы могли бы хотя бы упомянуть некоторые из распространенных, например a и a (в визуальном режиме. - person Stobor; 30.06.2009
comment
(Кроме того, +1, потому что, несмотря на то, что я давний пользователь vim, я не знал об этом!) - person Stobor; 30.06.2009
comment
@Stobor. Приветствия исправили эту ссылку - person michael; 30.06.2009

Для выбора в одинарных кавычках используйте vi'.

Для выбора в скобках используйте vi(.

person Canopus    schedule 30.06.2009
comment
Примечание: ci' или ci( для изменения вместо визуального выбора. Но он делает именно то, что я хотел. Спасибо :) - person justnorris; 06.05.2013
comment
Второй работает только в этом блоке (), поэтому обычно я делаю %vi( или %vib - person 816-8055; 02.10.2016

Используйте стрелки или hjkl, чтобы перейти к одному из выражений скобок, затем v, чтобы выбрать визуальный (т.е.выбирающий) режим, затем %, чтобы перейти к другой скобке.

person Stobor    schedule 30.06.2009
comment
(к сожалению, не цитирует ...) - person Stobor; 30.06.2009

Напишите функцию Vim в .vimrc, используя встроенную функцию searchpair:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
            [, {stopline} [, {timeout}]]]])
    Search for the match of a nested start-end pair.  This can be
    used to find the "endif" that matches an "if", while other
    if/endif pairs in between are ignored.
    [...]

(http://vimdoc.sourceforge.net/htmldoc/eval.html)

person Adrian Panasiuk    schedule 30.06.2009

Я бы добавил деталь к наиболее проголосовавшему ответу:

Если вы используете gvim и хотите скопировать в буфер обмена, используйте

"+<command>

Чтобы скопировать все содержимое между скобками (или скобками, или фигурными скобками)

Например: "+yi} скопирует в буфер обмена все содержимое между фигурными скобками, в которых находится курсор.

person yuriploc    schedule 09.02.2017
comment
Это полностью ортогонально проблеме и не должно быть ответом. Вы можете написать это на каждом вопросе о y. - person pipe; 12.10.2018
comment
Это дополнение к ответу, а не сам ответ. - person yuriploc; 13.10.2018
comment
Тогда это должно быть редактирование этого ответа, этот пост как есть не отвечает на вопрос. - person pipe; 13.10.2018
comment
Это реклама НЕ использования gvim :) Кому в жизни нужны лишние две Shift + нажатия клавиш? - person Paul Parker; 03.03.2019

Я сделал плагин vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Он предоставляет текстовые объекты для ближайших пар цитат любого типа. Используя только iq или aq, он позволяет вам работать с содержимым одинарных ('), двойных (") или обратных (`) кавычек, которые в настоящее время окружают курсор, находятся перед курсором или позади него (в этом порядке Предпочтение). Другими словами, он перескакивает вперед или назад, когда это необходимо, чтобы добраться до кавычек.

Это легче понять, посмотрев на примеры (курсор показан с |):

  1. Раньше: foo '1, |2, 3' bar; после нажатия diq: foo '|' bar
  2. Раньше: foo| '1, 2, 3' bar; после нажатия diq: foo '|' bar
  3. Раньше: foo '1, 2, 3' |bar; после нажатия diq: foo '|' bar
  4. Раньше: foo '1, |2, 3' bar; после нажатия daq: foo | bar
  5. Раньше: foo| '1, 2, 3' bar; после нажатия daq: foo | bar
  6. Раньше: foo '1, 2, 3' |bar; после нажатия daq: foo | bar

Приведенные выше примеры приведены для одинарных кавычек, плагин точно так же работает для двойных (") и обратных (`) кавычек.

Также можно использовать любые другие операторы: ciq, diq, yiq, viq и т. Д.

Пожалуйста, взгляните на страницу github, указанную выше, для получения более подробной информации.

person Anton Beloglazov    schedule 09.04.2014

Простая раскладка клавиатуры в vim решит эту проблему. map viq F ”lvf” hh Эта команда выше отображает viq на ключи для поиска между кавычками. Замените "любым символом и создайте свои раскладки. Вставьте это в vimrc во время запуска, и вы сможете использовать его каждый раз".

person Community    schedule 30.07.2009