118

假设我有这行代码:

$query = "SELECT * FROM table";

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

4

6 回答 6

208

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

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

  • ci'- 在单引号内更改
  • ciw- 改变一个词
  • ci(- 改变括号内
  • dit- 在 HTML 标签内删除,等等。

更多关于不同 vim 文本对象的信息在这里

于 2012-07-24T12:04:45.120 回答
27

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

vi"

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

vi(
vi{
vit

或简单地更改/删除,执行相应di"ci"等。替换ai包含周围的元素(例如,您标记或更改括号内容)

于 2012-07-24T12:05:20.387 回答
5

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

它为任何类型的最接近的引号对提供文本对象,并支持跨多行的引号。使用 onlyiqaq它允许您对当前围绕光标、位于光标前面或后面(按优先顺序)的单引号 (')、双引号 (") 或反引号 (`) 的内容进行操作. 换句话说,它在需要到达引号时向前或向后跳跃。

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

  1. 之前:foo '1, |2, 3' bar; 按下后diqfoo '|' bar
  2. 之前:foo| '1, 2, 3' bar; 按下后diqfoo '|' bar
  3. 之前:foo '1, 2, 3' |bar; 按下后diqfoo '|' bar
  4. 之前:foo '1, |2, 3' bar; 按下后daqfoo | bar
  5. 之前:foo| '1, 2, 3' bar; 按下后daqfoo | bar
  6. 之前:foo '1, 2, 3' |bar; 按下后daqfoo | bar

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

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

请查看上面链接的 github 页面以获取更多详细信息。

于 2014-04-28T05:02:34.090 回答
4

从已经在引号内你可以做

di"

把它读作删除里面“

于 2012-07-24T12:04:57.593 回答
4

除了布莱恩的回答,您还可以p(粘贴)和y(拉动)新值,因此如果您想用另一个值替换引号内的值,您可以yi"在要复制的选择上执行,vi"以选择区域您想要替换然后只是p正确替换该值。

于 2018-04-10T12:43:38.920 回答
1

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

T"ct"

在哪里:

T" - 在 " 字符之后向后移动

c - 更改命令

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

于 2020-08-09T19:21:29.300 回答