Vim 用引号括起来

use*_*814 14 vim

说我有以下

printf(text goes here);
Run Code Online (Sandbox Code Playgroud)

我在视觉模式下选择“文本在此处”...
如何快速将其更改为

printf("text goes here");
Run Code Online (Sandbox Code Playgroud)

ari*_*nmz 22

你应该多研究一下。哪些 Vim 命令可用于引用/取消引用单词?

引用:

环绕.vim 将是你最简单的答案。如果你真的反对使用它,这里有一些你可以做的例子。不一定是最有效的,但这就是编写环绕.vim 的原因。

  • 引用一个词,使用单引号 ciw'Ctrl+r"'
    • ciw - 删除光标所在的单词,并以插入模式结束。
    • ' - 添加第一个引号。
    • Ctrl+r"- 插入"寄存器的内容,也就是最后一次猛拉/删除。
    • ' - 添加结束语。

  • 取消用单引号括起来的单词 di'hPl2x
    • di' - 删除单引号括起来的单词。
    • hP - 将光标向左移动一个位置(在开头引用的顶部)并将刚刚删除的文本放在引用之前。
    • l - 将光标向右移动一个位置(在开头引用的顶部)。
    • 2x - 删除两个引号。

  • 将单引号改为双引号 va':s/\%V'\%V/"/g
    • va' - 直观地选择引用的单词和引号。
    • :s/ - 开始更换。
    • \%V'\%V - 仅匹配视觉选定区域内的单引号。
    • /"/g - 用双引号替换它们。

  • tl;dr 安装 [**surround.vim**](https://github.com/tpope/vim-surround),视觉上选择文本然后按“S””。 (11认同)
  • @CristianCiupitu `ysi)"` 没有视觉模式。 (5认同)

Dwi*_*cer 17

命令序列cw""<ESC>P是可以环绕文本并通过剪切单词(字母数字字符串:az、AZ、0-9,包括 _ [下划线]),然后插入文本""并点击转义键(<ESC>要退出插入模式,然后可以在光标前粘贴。因此该命令分解为:

c - 切入注册

w - 正则匹配 \w

"" -"在当前光标位置插入两个字符

<ESC>- 按转义键的 VIM 简写。在这种情况下,返回命令模式

P - 粘贴当前寄存器

但是,如果当前行上有更长的字符串集希望环绕,则需要使用带有捕获组的替换正则表达式命令,例如:

:s/\(\w\+\)/"\1"/g

此命令存储作为组 '1' 捕获的结果匹配正则表达式,并执行替换以将组的内容插入引号内。因此,鉴于文本:

fubar: 1
Run Code Online (Sandbox Code Playgroud)

变成:

"fubar": 1
Run Code Online (Sandbox Code Playgroud)

VIM介绍帮助文件是任何人最好的资源之一,与一起:help命令。

  • 我认为一个小的改进是使用 ciw""&lt;ESC&gt;P 因为您可以将光标放在单词中间,并且可以执行“更改内部单词”。 (2认同)

Joh*_*024 14

这是为了回答您提出的具体问题。您声明您在视觉上选择了一些文本并希望用引号将其括起来。为此,请运行:

:s/\%V\(.*\)\%V/"\1"/
Run Code Online (Sandbox Code Playgroud)

把它分成几部分:

  • :允许您输入ex命令。

  • s/old/new/ 是通常的替代命令。

  • \%V 是一个记录不足的原子,用于标记所选文本的开头

  • \(.*\) 选择所有内容并将其保存到选择 1 中。

  • 第二个\%V表示所选文本的结束。

  • 替换文本是选择的所有内容,存储在 中\1,用引号括起来:"\1"

此命令逐行应用。因此,如果所选文本扩展到多行,您可能会得到不需要的结果。

  • @John1024 真正的解决方法是使用更合适的 '&lt;,'&gt; 或在紧要关头在第二个 \%V 之后包含一个 `.` (2认同)