270

I'm sure there used to be a plugin for this kinda stuff, but now that I need it, I can't seem to find it (naturally), so I'll just ask nice and simple.

What is the easiest way to select between brackets, or quotes, or generally a list of matching characters?

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

For example, here I'd like to select (a), or Computed solution coefficients:.

I'm not interested in multiline, just cases which occur on one line.

Randall
  • 2,859
  • 1
  • 21
  • 24
Rook
  • 60,248
  • 49
  • 165
  • 242

11 Answers11

393

To select between the single quotes I usually do a vi' ("select inner single quotes").

Inside a parenthesis block, I use vib ("select inner block")

Inside a curly braces block you can use viB ("capital B")

To make the selections "inclusive" (select also the quotes, parenthesis or braces) you can use a instead of i.

You can read more about the Text object selections on the manual, or :help text-objects within vim.

Rob Bednark
  • 25,981
  • 23
  • 80
  • 125
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
311

Use whatever navigation key you want to get inside the parentheses, then you can use either yi( or yi) to copy everything within the matching parens. This also works with square brackets (e.g. yi]) and curly braces. In addition to y, you can also delete or change text (e.g. ci), di]).

I tried this with double and single-quotes and it appears to work there as well. For your data, I do:

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

Move cursor to the C, then type yi'. Move the cursor to a blank line, hit p, and get

Computed solution coefficients:

As CMS noted, this works for visual mode selection as well - just use vi), vi}, vi', etc.

Community
  • 1
  • 1
Tim Whitcomb
  • 10,447
  • 3
  • 35
  • 47
  • 1
    I'm generally looking for a way to select everything between predefined matching chars (normally only single and double quotes, and brackets of all kinds). – Rook Jun 30 '09 at 06:03
  • 2
    What do you mean by separated words? I tried it on "[x, y, z]" and it picked out "x, y, z" – Tim Whitcomb Jun 30 '09 at 06:04
  • 4
    Disregard the last comment - found what the problem was. Works like a charm :-) – Rook Jun 30 '09 at 06:47
  • it seems to work with quotes as well `yi"` select all withing quotes – stefanB Mar 05 '12 at 02:09
  • `ci(` or `ci)` does it for what I was looking for. Thanks. I still don't fully understand the `i` in that case, but who cares as long as it works, right ? :) – pyronaur May 06 '13 at 10:22
  • As noted below, check the help for text-objects. the `i` is modifying the `c` command, so it's no longer "insert": I think of it as "inside" so `ci(` becomes "change inside parentheses". If you want to include the parens, use `a` instead of `i` like `ca(` – Tim Whitcomb May 06 '13 at 15:34
  • I've added an answer below describing my plugin `vim-textobj-quotes` that provides a unified text object for handling different type of quotes with a single key binding. – Anton Beloglazov Apr 09 '14 at 10:01
  • is there any method that after yanking it goes to the insert mode? – Moj Oct 23 '15 at 09:40
  • Note that it is not needed to be inside the quotes when you call it, the own command looks for the first occurence of text inside quotes in the current line and deletes it, so you can save some key strokes. – aturegano Oct 06 '16 at 14:44
  • Neat! That's awesome - however, note that it only works with quotes. Trying it with the parentheses didn't seem to work. – Tim Whitcomb Oct 06 '16 at 20:32
  • 1
    Doesn't seem to work very well with azerty (iso-fr) layout, because {, [, has to be accessed using the "Alt Gr" key. – Eric Burel Oct 05 '21 at 08:11
33

This method of selection is built-in and well covered in the Vim help. It covers XML tags and more.

See :help text-objects.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
michael
  • 11,667
  • 2
  • 26
  • 25
29

For selecting within single quotes use vi'.

For selecting within parenthesis use vi(.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Canopus
  • 7,351
  • 11
  • 46
  • 57
10

Use arrows or hjkl to get to one of the bracketing expressions, then v to select visual (i.e. selecting) mode, then % to jump to the other bracket.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Stobor
  • 44,246
  • 6
  • 66
  • 69
4

I wanted to add to the already good answers. I came here looking for a way to change the text inside of html brackets, so I want to provide an answer for anyone else that is also looking for that.

You might think ci< would work, but actually that only works if you are inside one of the tags themselves:

<would work inside here> But not here </would work inside here>

What I wanted was to change the text between the html tags themselves:

<div>change me</div>

What I wanted was "change inner tag": cit

Thank you to the other answer that mentioned the documentation (:help text-objects) which is how I found what I was looking for.

chillpenguin
  • 2,989
  • 2
  • 15
  • 18
3

Write a Vim function in .vimrc using the searchpair built-in function:

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)

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Adrian Panasiuk
  • 7,249
  • 5
  • 33
  • 54
3

I would add a detail to the most voted answer:

If you're using gvim and want to copy to the clipboard, use

"+<command>

To copy all the content between brackets (or parens or curly brackets)

For example: "+yi} will copy to the clipboard all the content between the curly brackets your cursor is.

yuriploc
  • 315
  • 3
  • 13
  • 4
    This is completely orthogonal to the problem and should not be an answer. You can write this on _every_ question which asks about `y`. – pipe Oct 12 '18 at 13:28
  • This is an addition to the answer, not an answer itself. – yuriploc Oct 13 '18 at 14:34
  • Then it should be an edit to that answer, this post as-is does not answer the question. – pipe Oct 13 '18 at 18:33
  • This is an advertisement for NOT using gvim :) Who needs an extra two shift+keypresses in their life? – Paul Parker Mar 02 '19 at 23:53
3

Stop at the beginning of brackets, and to select all and print

vi' 

vi(

vi[ 

vi{

vi<

vi"

if you want to delete replace vi with di

islamux
  • 97
  • 5
1

I've made a plugin vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

It provides text objects for the closest pairs of quotes of any type. Using only iq or aq it allows you to operate on the content of single ('), double ("), or back (`) quotes that currently surround the cursor, are in front of the cursor, or behind (in that order of preference). In other words, it jumps forward or backwards when needed to reach the quotes.

It's easier to understand by looking at examples (the cursor is shown with |):

  1. Before: foo '1, |2, 3' bar; after pressing diq: foo '|' bar
  2. Before: foo| '1, 2, 3' bar; after pressing diq: foo '|' bar
  3. Before: foo '1, 2, 3' |bar; after pressing diq: foo '|' bar
  4. Before: foo '1, |2, 3' bar; after pressing daq: foo | bar
  5. Before: foo| '1, 2, 3' bar; after pressing daq: foo | bar
  6. Before: foo '1, 2, 3' |bar; after pressing daq: foo | bar

The examples above are given for single quotes, the plugin works exactly the same way for double (") and back (`) quotes.

You can also use any other operators: ciq, diq, yiq, viq, etc.

Please have a look at the github page linked above for more details.

Anton Beloglazov
  • 4,939
  • 1
  • 21
  • 9
-8

A simple keymap in vim would solve this issue. map viq F”lvf”hh This above command maps viq to the keys to search between quotes. Replace " with any character and create your keymaps. Stick this in vimrc during startup and you should be able to use it everytime.