我有以下形式的块:
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
String that is not supposed to be enclosed in quotes
String that is supposed to be enclosed in quotes
我需要将声明它们应该用引号引起来的行放在引号中:
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
String that is not supposed to be enclosed in quotes
"String that is supposed to be enclosed in quotes"
Vim 有没有半自动的方法来做到这一点?我认为可能的解决方案可能涉及g
命令。
答案1
使用正则表达式:
:%s/.*is supposed.*/"&"/
如果“半自动”意味着您希望在每次替换之前得到提示,只需将修饰符添加/c
到替换模式中即可:
:%s/.*is supposed.*/"&"/c
解释
:%s
意味着将此替换应用于当前缓冲区中的所有行- 我们匹配的模式是包含单词的任何行
is supposed
(如果其他一些行包含单词“is Should”,而后面没有“to be returned in quote”,您可以随时将模式更改为.*is supposed to be enclosed in quotes.*
- 我们用来替换匹配模式的字符串是
"&"
,其中&
代表模式匹配的内容。
答案2
有名的环绕声插件提供了各种映射,使这一过程变得快速而简单。要引用整行(不缩进),只需使用yss"
.您可以通过以下:global
命令自动将其应用于示例文本的所有匹配行:normal
:
:g/is supposed/normal yss"
或者只是搜索匹配的行并通过n
and重复.
答案3
我几乎总是更喜欢使用宏来搜索替代品,因为它们更强大并且更容易记住,同时仍然保留在跳跃之前进行交互式检查的选项。在您想要更改的第一行尝试此操作(不要键入我在 ESC 和 ENTER 周围放置的空格以提高可读性):
qqI" ESC $bea" ESC /is supposed ENTER zzq
它能做什么:
qq
启动一个名为“q”的宏(qa 将启动宏“a”)I" ESC
在第一个单词之前插入一个“,而不是像“0”那样在行的开头插入,从而保留那里通常有价值的空白。$bea" ESC
转到行尾 ($),但然后后退一个单词 (b) 并再次前进到行尾 (e),最后附加 (a) "。此操作甚至会附加到该行的最后一个单词之后if 后面跟着通常无用的尾随空格。/is supposed
执行编辑后,此搜索将搜索“is Should”的下一个实例,该实例可能会向下很多页,并将光标很好地定位在那里,以便您查看并决定是否继续编辑。如果没有找到“应该”,则宏将退出且不会造成任何损害。zzq
将该行很好地集中在页面上 (zz),这样您就可以看到当前行之外的几行。当您快速应用宏并想要浏览前面的几个动作时非常有用。 “q”结束宏的定义,它也恰好被称为“q”。
如何使用:
- 完成上面的宏定义后,第一行已经更改。
- 如果出现错误,您可以简单地撤消这一行并重试。
- 光标现在位于第二个匹配项(如果有)上,并且在页面中很好地居中。
- 如果需要,您可以使用 @q 应用该宏(或其他类似的宏!),这将编辑该行并将您定位在第三个匹配项上。
- 您可以使用 @@ 重新应用最后一个宏(比 @q 更快)。
- 您可以同时拨打多个电话,例如:111@@。请记住,如果应用宏时出现任何错误,则不会再重复。
- 或者您可以手动跳过 PageDown 和朋友并重新应用宏。
- 您可以将宏与任何其他编辑交错。
- 您可以使用 :tab 来将此宏应用于其他缓冲区或文件。
- 馅饼上的樱桃:即使退出 vim 后,宏也会被记住!
一旦你熟悉了宏,你就会拥有惊人的力量!
答案4
如果您的行确实是这样的,并且有一些区分的字符串可以标识哪些行是哪些行,那么正则表达式版本就可以工作。否则,我们可以记录一个宏做你想做的事。
为此,请转到第 2 行的开头并按:
qq I" Escape A" Escape 3j q
这将引用第一行并将我们带到下一行来查看。然后,您可以@q
按 重播您刚刚执行的所有操作,或者说5@q
执行五次。
这是如何运作的: q
是开始录制宏的命令,我们也调用它q
(您可以选择任何字母)。在该宏中,我们在行的开头插入一个双引号 ( I"
),离开插入模式 (Escape),在行的末尾附加一个双引号 ( A"
),然后再次离开插入模式。我们向下移动三行 ( 3j
) 到要引用的下一行。q
停止录制宏。
之后,我们回到了我们开始的地方,所以我们可以运行@
我们保存的宏 ( ) 来q
对下一行再次执行此操作。在 之前进行计数@
,例如在 中5@q
,我们会执行多次。
如果3j
间距有些不规则,您可以使用}}k
: 向下移动两段到下一段之后的空行 (}}
)并备份(k
)。无论哪种方式,运行宏都是相同的。
事实上,您可以记录任何一系列执行您想要的操作并让您回到您想要的位置的操作。只要您采取的步骤在要运行它的每个上下文中都有意义,您就可以启动宏,进行所需的所有更改并移动到下一个位置,然后停止宏并重复。