如何在 vim 列表中的单词之间添加引号?

How to add quotes beetwen words in a list in vim?

我有以下列表:

[torunn,sentry,moonstone,avispa,phil coulson]

是否可以使用 Vim 将其更改为此?:

["torunn","sentry","moonstone","avispa","phil coulson"]

借助 vim-surround 和一个宏,很简单:

我假设你的光标在第一个字母上("t",在这种情况下):qqys/\v,|]<cr>"nlq99@q

让我们一步步分解:

qqys/\v,|]<cr>"nlq99@q
qq               q       # record a macro in the q register
  ys                     # surround something with something
    /\v,|]<cr>           # search for comma or closing bracket
              "          # surround until there with double-quotes
               n         # jump to the next match
                l        # go one to the right
                  99@q   # run the macro 99 times (will stop at first failure)

搜索查询 \v,|] 只是开启 very 魔法模式,然后匹配逗号或 (|) 右括号。我们不需要转义括号,因为我们没有打开一个。

Substitute Ex 命令是处理 CSV 行的好工具

我经常使用替代 Ex 命令来处理 CSV。

在这种情况下,我只是通过字符范围匹配您的集合中的值:

[ a-zA-Z]

->类似于\w,但是你的集合没有_0-9,我们需要空格。

我使用转义括号将它放在一个字符组中。

此外,由于接下来可以有逗号或结束括号,我创建了另一个字符组并使用交替运算符允许任一字符:

\(,\|\]\)

在此处检查我们的模式匹配:

然后在替换字符串中引用这些字符组(并包括引号)。

综合起来,这里是替换命令:

:s/\([ a-zA-Z]\+\)\(,\|\]\)/""/g

之前:

之后:


减少过度设计的解决方案

正如@bimlas 所指出的,一个不那么过度设计的解决方案如下:

:s/[^,]\+/"[=15=]"/g

[=16=] 只是对整个匹配模式的引用(参见 :help [=17=])。

您可以使用替换:

s/\v(\w|\s)+/"&"/g

这将匹配单词 \w 或 space \s 字符出现一次或多次 (+) 次。替换字符串 "&" 是用引号括起来的匹配模式 && 字符在 :help s/\&

中描述