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

假设我有这行代码:

$query = "SELECT * FROM table";

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

51959 次浏览

使用 ci",这意味着: 更改双引号中的内容。

你也可以用类似的方式操作其他文本对象,例如:

  • ci'-更改单引号内部
  • ciw - change inside a word
  • ci(-括号内的更改
  • dit-在 HTML 标记中删除,等等。

更多关于不同 vim 文本对象的信息。

From already inside the quotes you can do

di"

把它当作内部删除”

您可以选择之间的引号,然后删除(d) ,更改(c)等使用

vi"

类似地,你可以用大括号、方括号、 XML 元素等代替:

vi(
vi{
vit

或者直接修改/删除,做相应的 di"ci"等。用 a代替 i将包含周围的元素(例如,您可以标记或更改括号 and的内容)

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

它为任何类型的最接近的引号对提供文本对象,并支持跨多行的引号。仅使用 iqaq,它允许您操作当前环绕光标的单引号(’)、双引号(”)或反引号(‘)的内容,这些引号位于光标的前面或后面(按照优先顺序)。换句话说,当需要到达引号时,它会向前或向后跳转。

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

  1. 压前: foo '1, |2, 3' bar; 压后: diq: foo '|' bar
  2. Before: foo| '1, 2, 3' bar; after pressing diq: foo '|' bar
  3. 压前: foo '1, 2, 3' |bar; 压后: 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. 压前: foo '1, 2, 3' |bar; 压后: daq: foo | bar

上面的例子给出了单引号,这个插件对于 double (”)和 back (’)引号的工作方式完全相同。

您还可以使用任何其他操作符: ciqdiqyiqviq等。

请看看上面链接的 github 页面,了解更多细节。

除了布莱恩的回答,你还可以用 p(粘贴)和 y(取消)新值,所以如果你想用另一个值替换引号中的值,你可以对你想要复制的选区进行 yi"vi"选择你想要替换的区域,然后只用 p来正确地替换这个值。

所选择的答案只适用于 ViM,而不适用于 vi。这个问题也是不准确的,因为作者没有提到光标的初始位置。如果我们假设光标在双引号中,那么对于 vi,答案是:

T"ct"

Where:

T" - move back just after the " character

C-change 命令

t" - provide end position for c command, where it should stop erasing characters, in other words the range to change