Vim 中的自定义函数

A custom function in Vim

我是 Vim/Vi 的新手,我需要编写自定义 function/macro。 是否可以定义一个命令(例如:mycommand)来格式化当前文件中的行,如下所示:

初始行:

This is line 1
This is line 2

This is line 3
This is line 4

This is line 5

This is line 6
This is line 7
This is line 8

结果:

This is line 1\nThis is line 2
This is line 3\nThis is line 4
This is line 5
This is line 6\nThis is line 7\nThis is line 8

我该如何创建这样的脚本?我应该把它放在哪里?

马可

你可以录制一个宏,用\n分隔符连接两行,例如在你的vimrc:

let @x='gJi\n^['

(上面的^[,你按ctrl-v Esc)

假设你的光标在第一行,你可以在正常模式下@x,然后在第二个块)J@@,然后工作完成。

您可以将这些操作包装在函数中或将它们创建为映射。

加入插件

我写了一个Join脚本:https://github.com/sk1418/Join,它支持用分隔符和其他功能连接行,在你的情况下,你可以执行命令::J '\n',它会做上面宏 (@x) 所做的事情。你也可以把它放在你的函数中,比如:

function Foo()
   Join '\n'
   join!
   Join '\n'
endfunction

问题修改更新:

你做的修改,把问题变成了另一个问题...但是它可以解决,我在下面列出了两种可能性,一种是vim方式,另一种是使用外部awk工具,如果你在你的系统上有可用的 awk。

与 vim :s cmd

这个命令应该为你完成:

%s/\n\n/∢/g|%s/\n\ze./\n/g|%s/∢/\r/g
  • 是通过按ctrl-v u2222完成的,它只是针对一个特殊的字符,它在你的文本中不存在,你也可以使用其他的uni-code字符。

使用外部 awk

%!awk -v RS='\n\n' '{gsub(ORS, "\n")}7'

这将为您完成转换,但它会在文件末尾留下额外的 \n,只需将其删除即可。