如何在vim的列表中添加单词?

如何在vim的列表中添加单词?,vim,vi,Vim,Vi,我有以下清单: [torunn,sentry,moonstone,avispa,phil coulson] 是否可以使用Vim将其更改为此 ["torunn","sentry","moonstone","avispa","phil coulson"] 借助和宏,它很容易: 我假设您的光标位于第一个字母(“t”,在本例中):qqys/\v,|]nlq99@q 让我们一步一步地把它分解: qqys/\v,|]<cr>"nlq99@q qq q

我有以下清单:

[torunn,sentry,moonstone,avispa,phil coulson]
是否可以使用Vim将其更改为此

["torunn","sentry","moonstone","avispa","phil coulson"]
借助和宏,它很容易:

我假设您的光标位于第一个字母(“t”,在本例中):
qqys/\v,|]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)
qqys/\v,|]nlq99@q
qq q#在q寄存器中记录一个宏
用某物围绕某物
/\v、 |]#搜索逗号或结束括号
“#用双引号括起来
跳转到下一场比赛
往右转一个
99@q#运行宏99次(第一次失败时将停止)

搜索查询
\v,|]
只需打开
v
ery magic模式,然后匹配逗号或(
|
)结束括号。我们不需要转义括号,因为我们没有打开括号。

替换Ex命令是一个很好的工具,可以操作CSV行。

我经常使用substitute-Ex命令操纵CSV

在本例中,我只是通过字符范围匹配集合中的值:

[a-zA-Z]

->类似于
\w
,但您的集合没有
\u 0-9
,我们需要空格

我使用转义括号将其放在字符组中

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

\(,\\\\]\)

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

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

总而言之,这里是替换命令:

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

之后:


减少过度设计的解决方案

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

:s/[^,]\+/“\0”/g


\0
只是对整个匹配模式的引用(请参见
:help\0
)。

您可以使用替换:

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

这将与单词
\w
或空格
\s
字符的一个或多个(
+
)匹配。替换字符串
“&
是匹配的模式
&
,用引号括起来。
&
字符在
:help s/\&

中描述,无环绕:
wqqciw”“”wq5@q
@PeterRincker,它不能正确解释多词元素,但
wqqc/\v,|]“”“wq5@q
应该可以使用更短的等效代码:
s/[^,]\+/“\0”/g
(无法尝试,我使用的是Android)同意,非逗号字符方法更有意义,而且更简单。