如何在vim中区分行地址和行范围?

如何在vim中区分行地址和行范围?,vim,Vim,这是一个简单的用户定义函数: fun! Foo() range echo a:firstline a:lastline endfun :5call Foo()和:5,5call Foo()给我相同的结果 然而,:5j和:5,5j给出了不同的结果 我可以编写一个类似于join的函数吗? join如何区分行地址和行范围?通过定义自定义的:command,-range和-count属性可以更好地控制范围的使用方式。但是,我认为即使这样也不允许您完全复制:join的行为。自定义Vim命令的

这是一个简单的用户定义函数:

fun! Foo() range
    echo a:firstline a:lastline
endfun
  • :5call Foo()
    :5,5call Foo()
    给我相同的结果
  • 然而,
    :5j
    :5,5j
    给出了不同的结果
我可以编写一个类似于join的函数吗?

join
如何区分行地址和行范围?

通过定义自定义的
:command
-range
-count
属性可以更好地控制范围的使用方式。但是,我认为即使这样也不允许您完全复制
:join
的行为。自定义Vim命令的界面不如内置命令的界面丰富

作为一种解决方法,您可以使用
histget('cmd',-1)
获取调用命令的命令行,并解析确切的命令调用,包括原始范围(然后可以通过将其传递给另一个命令来重复使用,但使用它进行行算术是有问题的,因为它是原始范围,而不是实际的行号)。该解决方法仅适用于交互式命令,非常脆弱,需要一些努力。或许可以通过定义两个不同的命令来完全避免此问题