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

220

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

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

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

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

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

ладья
источник

Ответы:

277

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

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

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

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

Computed solution coefficients:

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

Тим Уиткомб
источник
1
Я обычно ищу способ выбрать все между предопределенными совпадающими символами (обычно только одинарные и двойные кавычки и скобки всех видов).
Ладья
2
Что вы подразумеваете под разделенными словами? Я попробовал это на «[x, y, z]», и он выбрал «x, y, z»
Тим Уиткомб
4
Не обращайте внимания на последний комментарий - выяснил в чем проблема. Работает как шарм :-)
Ладья
похоже, что он работает с кавычками, а также yi"выбирайте все в кавычках
stefanB
ci(или ci)делает то, что искал. Спасибо. Я до сих пор не совсем понимаю iв этом случае, но кого это волнует, пока это работает, верно? :)
justnorris
279

Для выбора между одинарными кавычками я обычно делаю vi' («выбрать внутренние одинарные кавычки»).

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

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

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

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

CMS
источник
спасибо за этот совет, я искал и просил что-то подобное и не был удовлетворен моими результатами. Потрясающие.
Альфредодеза
этот совет очень прост и легко фиксируется в моей памяти мозга и мышц. Спасибо.
Газали
Это очень полезный совет. Нет больше возиться с дополнительными нажатиями клавиш. Спасибо за ссылку.
Рай
27

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

См :help text-objects.

Майкл
источник
1
: текстовые объекты справки становятся ближе к полезным вещам ... Вы можете, по крайней мере, упомянуть некоторые из общих, таких как "и" (в визуальном режиме.
Stobor
2
(Кроме того, +1, потому что, несмотря на то, что я долгое время был пользователем vim, я не знал об этом!)
Stobor
@ Стобор. Приветствия исправили эту ссылку
Майкл
21

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

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

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

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

Stobor
источник
5
(к сожалению, не цитирует ...)
Stobor
3

Напишите функцию 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 )

Адриан Панасюк
источник
2

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

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

"+<command>

Копировать весь контент в скобках (или в скобках или в фигурных скобках)

Например: "+yi}скопирует в буфер обмена все содержимое, заключенное в фигурные скобки вашего курсора.

yuriploc
источник
2
Это полностью ортогонально к проблеме и не должно быть ответом. Вы можете написать это на каждый вопрос, который задает y.
труба
Это дополнение к ответу, а не сам ответ.
yuriploc
Затем следует отредактировать этот ответ, этот пост как есть не отвечает на вопрос.
труба
Это реклама НЕ использовать gvim :) Кому нужны дополнительные две смены + нажатия клавиш в их жизни?
Пол Паркер
1

Я сделал плагин 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, на которую есть ссылки, для получения более подробной информации.

Антон Белоглазов
источник
-6

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


источник