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


106

说我有这行代码:

$query = "SELECT * FROM table";

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

Answers:


182

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

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

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

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


2
似乎只能使用vim,但不能vi。(不确定)
Ivan Chau 2014年

对我来说,这仅适用于当前行,而不适用于文档中的任何位置。
并最终

那么什么命令会倒退呢?也就是说,如果您要替换光标后面的引号内的文本。
dtburgess

1
@dtburgess:一种方法是F"ci"
尤金·雅玛什

ci'和ci“可以正常工作,但ci(对我不起作用。任何人为什么
要这样做

24

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

vi"

同样,您可以替换花括号,方括号,XML元素等,因此:

vi(
vi{
vit

或简单地改变/删除,执行对应di"ci"等等取代ai意愿包围周围元件(这样就标记或改变支架内容,例如)


5

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

它为任何类型的最接近的引号对提供文本对象,并支持跨越多行的引号。仅使用iq或使用aq它,您可以对当前围绕光标的单引号('),双引号(“)或反引号(`)的内容进行操作,它们位于光标的前面或后面(按照优先顺序)换句话说,当需要到达引号时,它会向前或向后跳转。

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

  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页面以获取更多详细信息。


3

从已经存在的引号中,您可以执行

di"

读为“删除”


6
游标不需要位于双引号引起来的字符串内,因为该命令默认会更改行中的第一个此类字符串
Eugene Yarmash 2012年

1
谢谢,非常高兴知道!只是为了表明我应该更仔细地阅读东西。:)
Sam Peacey 2012年

3

除了Brian的答案外,您还可以p(粘贴)和y(拉取)新值,因此,如果要将引号内的值替换为另一个值,可以yi"对要复制的vi"选择内容进行选择,以选择区域您想要p替换的值,然后只是正确地替换该值。


0

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

T"ct"

哪里:

T”-在“”字符之后移回

c-更改命令

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.