假设我有以下内容
printf(text goes here);
然后我在可视模式下选择“文本在此处显示”...
我如何快速将其更改为
printf("text goes here");
答案1
这旨在回答您提出的具体问题。您声明您已在视觉上选择了一些文本并希望将其用引号括起来。为此,请运行:
:s/\%V\(.*\)\%V/"\1"/
将其分解成几个部分:
:
允许您输入ex
命令。s/old/new/
是通常的替代命令。\%V
是一个文档不足的原子,用于标记所选文本的开头\(.*\)
选择所有内容并将其保存到选择 1 中。第二个
\%V
表示所选文本的结束。替换文本是所选的所有内容,存储在 中
\1
,并用引号括起来:"\1"
。
此命令逐行应用。因此,如果选定的文本跨越多行,您可能会得到不想要的结果。
答案2
你应该进行更多研究。哪些 Vim 命令可用于引用/取消引用单词?
引用:
环绕.vim将是最简单的答案。如果你真的不想使用它,这里有一些你可以做的事情的例子。不一定是最有效的,但这就是编写 around.vim 的原因。
- 使用单引号引用一个单词
ciw'Ctrl+r"'
ciw
- 删除光标所在的单词,并进入插入模式。'
- 添加第一个引文。Ctrl+r"
- 插入寄存器的内容"
,也就是最后的提取/删除。'
- 添加结束语。- 取消引用单引号内的单词
di'hPl2x
di'
- 删除单引号内的单词。hP
- 将光标向左移动一个位置(在开头的引语上方),并将刚刚删除的文本放在引语之前。l
- 将光标向右移动一个位置(在开头的引语上方)。2x
- 删除两个引号。- 将单引号改为双引号
va':s/\%V'\%V/"/g
va'
- 直观地选择引用的单词和引文。:s/
- 开始替换。\%V'\%V
- 仅匹配视觉选定区域内的单引号。/"/g
- 将它们全部替换为双引号。
答案3
命令序列cw""<ESC>P
是可以对文本进行包围的操作,其工作原理是剪切单词(字母数字字符串:az、AZ、0-9,包括 _ [下划线]),然后插入文本""
,并按退出键(<ESC>
退出插入模式,然后可以在光标前粘贴)。因此,该命令分解为:
c
- 切入寄存器
w
- 正则表达式匹配 \w
""
-"
在当前光标位置插入两个字符
<ESC>
- VIM 中按 Esc 键的简写。在此上下文中,返回命令模式
P
- 粘贴当前寄存器
但是,如果希望包围当前行上的较长字符串集,则需要使用带有捕获组的替换正则表达式命令,例如:
:s/\(\w\+\)/"\1"/g
此命令将捕获的结果匹配正则表达式存储为组“1”,并执行替换以将该组的内容插入引号中。因此,给定文本:
fubar: 1
变成:
"fubar": 1
这vim 简介帮助文件与命令一起是任何人的最佳资源之一:help
。
答案4
不要使用可视模式。只需将括号中的文本更改为“”,然后将已删除的文本粘贴在中间即可。ci)“”<Esc>磷
如果你想使用视觉模式,它的工作原理是相同的,你只需删除'i)'部分:c“”<Esc>磷
(<Esc>表示按下 Esc 键)