可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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.
回答1:
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.
回答2:
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.
回答3:
This method of selection is built-in and well covered in the Vim help. It covers XML tags and more.
See :help text-objects
.
回答4:
For selecting within single quotes use vi'
.
For selecting within parenthesis use vi(
.
回答5:
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.
回答6:
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)
回答7:
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.
回答8:
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 |
):
- Before:
foo '1, |2, 3' bar
; after pressing diq
: foo '|' bar
- Before:
foo| '1, 2, 3' bar
; after pressing diq
: foo '|' bar
- Before:
foo '1, 2, 3' |bar
; after pressing diq
: foo '|' bar
- Before:
foo '1, |2, 3' bar
; after pressing daq
: foo | bar
- Before:
foo| '1, 2, 3' bar
; after pressing daq
: foo | bar
- 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.
回答9:
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.