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



我有这样的文字:

* configobj
* pymongo
* tornado
* pandas

并希望将其转换为:

configobj, pymongo, tornado, pandas
最有效的

方法是什么?


补充:这是我自己想出来的:

  1. configobj c开始,C-v e j j j y拉动文本块。
  2. 然后p把它放在我想要的地方。
  3. 然后转到configobj行的末尾
  4. 击中C-vj j j到底部
  5. A然后插入,并点击C-[
  6. 再次使用 C-vx 删除最后的空格并删除最后的逗号。

然后,意识到configobj的最后一个字母被切断了,所以我必须回去添加它。

编辑

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

  1. 直观地选择您的块。

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

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

    xx
    

如果只是为了你问题中的例子,你可以一次性完成:

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

如果行有空格,则上述cmd将不起作用。

您也可以考虑安装Join插件(https://github.com/sk1418/Join),然后按:

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

如果行也有空间,这将适用于这种情况。

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

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

qqxxA,^[Jq3@qx

细分:

  • qq - 开始将宏录制到寄存器q
  • xx - 删除*和空格
  • A,^[ - 将,追加到行尾并退出插入模式
  • J - 将下一行与当前行连接
  • 起来
  • q - 结束宏
  • 3@q - 运行宏三次
  • x - 删除尾随逗号

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

我不知道

这是否是最有效的方法,但它可以完成工作:

:execute "normal ggVGJ" | s/vs**s*// | s/s**s*/, /g

它产生:

configobj, pymongo, tornado, pandas

我会使用正则表达式:

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

最新更新