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
,只需将其删除即可。
我是 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
,只需将其删除即可。