如何在 Vim 中的括号(或引号或 ...)之间进行选择?

How to select between brackets (or quotes or ...) in Vim?

提问人:Rook 提问时间:6/30/2009 最后编辑:RandallRook 更新时间:1/6/2023 访问量:145497

问:

我敢肯定曾经有一个插件可以用于这种东西,但现在我需要它,我似乎找不到它(自然),所以我只会问简单明了。

在括号、引号或一般匹配字符列表之间进行选择的最简单方法是什么?

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

例如,这里我想选择 ,或 。(a)Computed solution coefficients:

我对多行不感兴趣,只对发生在一行上的情况感兴趣。

vim 括号 yank

评论


答:

312赞 Tim Whitcomb 6/30/2009 #1

使用要在括号内获取的任何导航键,然后可以使用其中任何一个或复制匹配参数中的所有内容。这也适用于方括号(例如)和大括号。除了 之外,您还可以删除或更改文本(例如 、 )。yi(yi)yi]yci)di]

我尝试过双引号和单引号,它似乎也在那里工作。对于您的数据,我这样做:

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

将光标移动到 ,然后键入 。将光标移动到空行,点击 ,然后得到Cyi'p

Computed solution coefficients:

正如 CMS 所指出的,这也适用于视觉模式选择 - 只需使用 、 、 等。vi)vi}vi'

评论

1赞 Rook 6/30/2009
我通常正在寻找一种方法来选择预定义的匹配字符(通常只有单引号和双引号,以及各种括号)之间的所有内容。
2赞 Tim Whitcomb 6/30/2009
分离的单词是什么意思?我在“[x, y, z]”上试了一下,它选择了“x, y, z”
4赞 Rook 6/30/2009
忽略最后一条评论 - 发现问题出在哪里。像魅力一样工作:-)
0赞 stefanB 3/5/2012
它似乎也适用于引号,也选择所有引号yi"
1赞 Eric Burel 10/5/2021
似乎不太适用于 azerty (iso-fr) 布局,因为 {, [, 必须使用“Alt Gr”键访问。
33赞 michael 6/30/2009 #2

这种选择方法是内置的,在 Vim 帮助中得到了很好的介绍。它涵盖了 XML 标记等。

看。:help text-objects

评论

2赞 Stobor 6/30/2009
:help text-objects 更接近有用的东西......在视觉模式下,您至少可以提及一些常见的,例如 a“ 和 a(。
2赞 Stobor 6/30/2009
(另外,+1,因为尽管我是 vim 的长期用户,但我不知道这些!
0赞 michael 6/30/2009
@Stobor .Cheers 修复了该引用
10赞 Stobor 6/30/2009 #3

使用箭头或进入括号表达式之一,然后选择视觉(即选择)模式,然后跳转到另一个括号。hjklv%

评论

7赞 Stobor 6/30/2009
(不幸的是,不做引号......
3赞 Adrian Panasiuk 6/30/2009 #4

使用内置函数在 .vimrc 中编写一个 Vim 函数: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)

402赞 Christian C. Salvadó 6/30/2009 #5

为了在单引号之间进行选择,我通常会做一个(“选择内部单引号”)。vi'

在括号块内,我使用(“选择内部块”)vib

在大括号块内,您可以使用(“大写 B”)viB

要使选择“包含”(同时选择引号、括号或大括号),您可以使用 代替 。ai

您可以在手册上或在 vim 中阅读有关文本对象选择的更多信息。:help text-objects

评论

0赞 alfredodeza 11/18/2010
感谢您的提示,我一直在搜索并要求类似的东西,但对我的结果不满意。棒。
0赞 Ghazaly 11/27/2010
这个技巧非常简单,很容易在我的大脑和肌肉记忆中发挥作用。谢谢。
1赞 Rai 1/18/2015
这是一个非常有用的提示。无需再摸索额外的击键。谢谢你的链接。
1赞 meotimdihia 9/11/2022
vi"选择内双引号”
29赞 Canopus 6/30/2009 #6

要选择单引号内,请使用 。vi'

要选择括号内的选择,请使用 。vi(

评论

6赞 pyronaur 5/6/2013
注意:或用于更改而不是视觉选择。但它完全符合我的要求。谢谢:)ci'ci(
0赞 816-8055 10/2/2016
第二个仅在该 () 块内有效,所以通常我会这样做或%vi(%vib
-8赞 Krishna 7/30/2009 #7

vim 中的一个简单的键盘映射可以解决这个问题。 地图 viq F“lvf”hh 上面的命令将 viq 映射到在引号之间搜索的键。将 “ 替换为任意字符并创建键盘映射。 在启动过程中将其粘贴在 vimrc 中,您应该每次都能使用它。

1赞 Anton Beloglazov 4/9/2014 #8

我做了一个插件:https://github.com/beloglazov/vim-textobj-quotesvim-textobj-quotes

它为任何类型的最接近的引号对提供文本对象。仅使用 or 允许您对当前围绕游标的单引号 (')、双引号 (“) 或后引号的内容进行操作,这些引号位于游标的前面或后面(按优先顺序)。换句话说,当需要到达报价时,它会向前或向后跳跃。iqaq

通过查看示例更容易理解(光标显示为):|

  1. 以前:;按下后:foo '1, |2, 3' bardiqfoo '|' bar
  2. 以前:;按下后:foo| '1, 2, 3' bardiqfoo '|' bar
  3. 以前:;按下后:foo '1, 2, 3' |bardiqfoo '|' bar
  4. 以前:;按下后:foo '1, |2, 3' bardaqfoo | bar
  5. 以前:;按下后:foo| '1, 2, 3' bardaqfoo | bar
  6. 以前:;按下后:foo '1, 2, 3' |bardaqfoo | bar

上面的示例是针对单引号给出的,该插件的工作方式与双引号(“)和反引号(')完全相同。

您还可以使用任何其他运算符:、等。ciqdiqyiqviq

请查看上面链接的 github 页面了解更多详情。

3赞 yuriploc 2/10/2017 #9

我会在得票最多的答案中添加一个细节:

如果您使用的是 gvim 并想要复制到剪贴板,请使用

"+<command>

复制括号(或括号或大括号)之间的所有内容

例如:将光标所在的大括号之间的所有内容复制到剪贴板。"+yi}

评论

4赞 pipe 10/12/2018
这与问题完全正交,不应该是答案。你可以把这个写在每一个问到的问题上。y
0赞 yuriploc 10/13/2018
这是对答案的补充,而不是答案本身。
0赞 pipe 10/14/2018
那么它应该是对该答案的编辑,这篇文章没有回答这个问题。
0赞 Paul Parker 3/3/2019
这是不使用 gvim :) 的广告谁在生活中需要额外的两次 shift+按键?
5赞 chillpenguin 12/23/2021 #10

我想补充已经很好的答案。我来这里是为了寻找一种更改 html 括号内文本的方法,所以我想为其他也在寻找它的人提供一个答案。

您可能认为会起作用,但实际上,这仅在您位于其中一个标签本身中时才有效:ci<

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

我想要的是更改html标签本身之间的文本:

<div>change me</div>

我想要的是“更改内部标签”:cit

感谢您提到文档()的另一个答案,这就是我找到我想要的东西的方式。:help text-objects

3赞 islamux 1/6/2023 #11

停在括号的开头,并全选并打印

vi' 

vi(

vi[ 

vi{

vi<

vi"

如果要删除,请替换为vidi