如何在vi中替换引号内的文本

127

假设我有以下一行代码:

$query = "SELECT * FROM table";

在vi/vim中是否有一个命令可以立即删除引号之间的所有内容并将光标定位在它们之间,以便我可以开始输入?

6个回答

229

使用ci",表示:更改双引号内的内容。

您还可以通过类似的方式操纵其他文本对象,例如:

  • ci' - 更改单引号内的内容
  • ciw - 更改单词内部的内容
  • ci( - 更改圆括号内的内容
  • dit - 删除HTML标签中的内容等

更多有关不同vim文本对象的信息请在此处查看


2
似乎只能在 vim 中工作,而不能在 vi 中工作。(不确定) - Ivan Chau
对我来说,这只在当前行起作用,而不是在整个文档中。 - And Finally
哪个命令可以反向操作呢?也就是说,如果您想替换光标后面的引号内文本,该怎么做? - dtburgess
1
@dtburgess:一种方法是 F"ci" - Eugene Yarmash
"ci'"和"ci""都没问题,但"ci("不能用。有人知道为什么吗?" - Vram Vardanian
@Vram Vardanian,“ci()”有一个同义词“cib”,也许它会起作用。 - Hope

29

您可以使用以下方法在引号之间进行选择,然后删除(d),更改(c)等操作。

vi"

同样的,您可以这样替换大括号、方括号、XML元素等:

vi(
vi{
vit

如果要进行简单的更改或删除,可以通过对应的di"ci"等方式来实现。将i替换为a,则会涵盖周围的元素(例如,您可以同时标记或更改括号内容)。


6
在Brian的回答之外,您还可以使用p(粘贴)和y(复制)新值。因此,如果您想用另一个值替换引号内的值,您可以在要复制的选择上执行yi",然后使用vi"选择要替换的区域,最后只需执行p即可正确地替换该值。

谢谢。yi" 对于复制引号之间的文本非常有用。 - ipatch

5
我制作了一个插件 vim-textobj-quoteshttps://github.com/beloglazov/vim-textobj-quotes 该插件提供文本对象,用于任何类型引号的最接近一对,并支持跨多行的引号。只需使用 iqaq 即可操作当前光标所在位置前面、后面或包围光标的单引号(')、双引号(")或反引号(`)之间的内容。换句话说,它会根据需要向前或向后跳转以到达引号。
通过以下示例更容易理解(光标用 | 表示):
  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
上述示例是针对单引号的,该插件对双引号(")和反引号(`)的工作方式完全相同。
您还可以使用任何其他操作符:ciqdiqyiqviq 等。
请查看上面链接到的 github 页面以获取更多详细信息。

4

从引号内部,您可以执行以下操作

di"

将其读作删除 "


9
光标不必在双引号字符串内,因为该命令默认更改行中第一个这样的字符串。 - Eugene Yarmash
1
谢谢,这很好知道!这只是表明我应该更仔细地阅读事物。 :) - Sam Peacey

2

所选答案仅适用于ViM,而不适用于vi。问题也不准确,因为作者没有提及光标的初始位置。如果我们假设光标在双引号内,则对于vi,答案将是:

T"ct"

位置说明:

T" - 移动到 " 字符后面

c - 修改命令

t" - 为 c 命令提供结束位置,在此位置停止擦除字符,换句话说,是要更改的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接