Vim 将用逗号分隔的单词放在引号中

Vim 将用逗号分隔的单词放在引号中,vim,vi,Vim,Vi,我有一长串的词,看起来像这样: foo,foo bar,bar@foo,foo# bar,bar$ foo# 现在我想把它变成: "foo","foo bar","bar@foo","foo# bar","bar$ foo#" 因此,分隔符是逗号。 在vi(m)中,最好的方法是什么 编辑: 有人想详细说明反对票的情况吗?试试: for l in range( 1, line('$') ) | call append( line('.') - 1, join( map( split( g

我有一长串的词,看起来像这样:

foo,foo bar,bar@foo,foo# bar,bar$ foo#
现在我想把它变成:

"foo","foo bar","bar@foo","foo# bar","bar$ foo#"
因此,分隔符是逗号。 在
vi(m)
中,最好的方法是什么

编辑: 有人想详细说明反对票的情况吗?

试试:

for l in range( 1, line('$') ) | 
  call append( line('.') - 1, join( map( split( getline('.'), ',' ), '"\"" . v:val . "\""' ), ',' ) ) | 
  delete | 
endfor
说明


对于用逗号分隔的每一行,使用
map
函数添加一个前导和尾随双引号,用逗号连接它们并将其附加到当前行上方,然后删除当前光标行,这将是旧的光标行。

这似乎有效。捕获所有不是逗号的内容,并将其替换为引号中捕获的部分。命令末尾的
g
表示替换行中与正则表达式匹配的所有实例。如果没有
g
,它将只与第一个匹配。看看
:h:s
:h:s_标志

:%s/\([^,]\+\)/"\1"/g
输入:

foo,foo bar,bar@foo,foo# bar,bar$ foo#
输出:

"foo","foo bar","bar@foo","foo# bar","bar$ foo#"

在vim中做简单事情的最快方法是使用宏;它比学习如何定义函数或找出搜索和替换模式所需的时间更短

在命令模式下,
将光标移动到行的开头
0

开始将宏记录为宏a
qa

插入引号
i“

移动到冒号或行尾,\\\$

添加引号
a“

移动到下一个单元格的开头
ll

停止录制宏
q


现在您已经转换了第一个单元格并录制了一个宏。转换另一个单元格
@a
(或
@
,表示运行上次使用的宏)。到达一行末尾后,移动到下一行的开头。

除了字符串的开头和结尾,
s/,/“,”/g
。因此,我想这一切都取决于你是否在寻找一个快速而肮脏的黑客来完成这项工作,或者你是否期望这项工作需要重复很多次。

我做错了什么吗?当我插入命令时,它仅用引号括住第一个单词,其余单词保持原样。我的结果:
“foo”,foo-bar,bar@foo,foo#bar,bar$foo#
@cherrun最后你忘了
g
吗?@FDinoff不,肯定有
g
。我还尝试添加一个
c
,以查看它实际查找的单词,它只表明第一个单词与模式匹配。@cherrun我刚刚在您的测试字符串上再次尝试了我的解决方案(复制并粘贴),我得到了上面发布的输出。你到底在打什么?或者您是在另一个字符串上测试它?@FDinoff不,实际上我只是复制了输入并应用了命令。什么都没有改变。一个字符串,在一行中。我甚至尝试使用一个完全空的
vimrc
文件。因此,它也与我的配置文件无关。我不知道这对你来说是怎么回事。是的,在我看来,有些人会毫无理由地否决问题和答案,就像你一样。你的问题怎么了?我不知道。i.m.o.是个正确的问题。我唯一能想到的是“你尝试了什么”-但这个问题并不适合这种过程。