Vim:将文本中间的换行符分隔列表复制到逗号分隔列表的最有效方法

时间:2013-10-24 13:08:52

标签: vim

我有这样的文字:

* configobj
* pymongo
* tornado
* pandas

并希望将其转换为:

configobj, pymongo, tornado, pandas

最有效的方法是什么?


加法:这就是我自己想出来的:

  1. c中的configobj开始C-v e j j j y来抓取文本块。
  2. 然后p将其放置在我想要的位置。
  3. 然后转到configobj
  4. 的末尾
  5. 点击C-vj j j到底部
  6. A然后插入,并点击C-[
  7. 再次使用C-vx删除最终空格并删除最后一个逗号。
  8. 然后,意识到configobj的最后一个字母被切断了,所以我必须回过头来添加它。

    修改

    我很抱歉没有指定这只是缓冲区的 part ,而不是整个缓冲区。

5 个答案:

答案 0 :(得分:5)

  1. 直观地选择您的区块。

  2. 替换每个换行符后跟*替换为,

    :'<,'>s/\n\*/,
    
  3. 删除第一个*<space>

    xx
    

答案 1 :(得分:2)

如果仅针对您问题中的示例,您可以一次性完成:

%s/^\*//|%join|s/ /, /g

如果该行有空格,则上述cmd将无效。

您还可以考虑安装Join插件(https://github.com/sk1418/Join)并按:

%s/^\*//|%J ', '

如果行也有空格,这将适用于该情况。

答案 2 :(得分:2)

对于宏来说,这是一个不错的用例。

将光标放在第一颗星上,运行以下内容(^[ Escape ):

qqxxA,^[Jq3@qx

细分:

  • qq - 开始将宏录制到注册表q
  • xx - 删除*和空格
  • A,^[ - 在行尾添加,并退出插入模式
  • J - 使用当前行加入下一行
  • q - 结束宏
  • 3@q - 运行宏三次
  • x - 删除尾随逗号

事后的想法:如果您的列表元素以标点符号(.?!)结尾,则 J 的行为受{的影响{1}}选项,因此在这些情况下,此宏可能会在元素之间留下额外的空格。有关详细信息,请参阅joinspaces

答案 3 :(得分:1)

我会使用正则表达式:

%s/^\s*\*\s*//    -- remove stars
%s/$\n/, /        -- join
%s/, $//          -- remove the last trailing comma

答案 4 :(得分:1)

我不知道这是否是最有效的方法,但它完成了工作:

:execute "normal ggVGJ" | s/\v\s*\*\s*// | s/\s*\*\s*/, /g

它产生:

configobj, pymongo, tornado, pandas