Vim-使用范围组合2个命令

时间:2017-05-30 05:08:01

标签: vim

我有2个命令可以正常工作,为整个文件或选择添加行号,并更改这些行号以创建1]格式:

command -range=% Addln2 <line1>,<line2>!cat -n 
command -range=% Addln3 <line1>,<line2>s/\v\s+(\d+)\s+/\1] /g

但是,我无法将它们组合到一个命令中。我试过了:

command -range=% Addln2 <line1>,<line2>!cat -n | s/\v\s+(\d+)\s+/\1] /g

但它会产生错误。

使用sed也不起作用:

command -range=% Addln2 <line1>,<line2>!cat -n | sed 's/\v\s+(\d+)\s+/\1] /g'

我也尝试将它们放在一个函数中:

function Addlnfn() range
    a:firstline,a:lastline !cat -n 
    a:lastline,a:firstline s/\v\s+(\d+)\s+/\1] /g
endfunction

command -range=% Addlnfn <line1>,<line2>call Addlnfn()

但这也会产生错误:Missing endfunction

问题出在哪里?如何解决?谢谢。

1 个答案:

答案 0 :(得分:2)

通常,|可用于分隔命令,但也有例外情况,:!就是其中之一,正如:help :bar所解释的那样。这里的原因是:!调用的外部shell命令可能是管道(例如cmd1 | grep foo),因此|字符必须是参数,并不能分开Vim命令。

一种解决方法是使用:execute包围第一个命令:

command -range=% Addln2 execute '<line1>,<line2>!cat -n' | s/\v\s+(\d+)\s+/\1] /g

将命令移动到函数中是另一种好方法。您错过的是a:firstline,a:lastline函数参数的评估不会在Vimscript中自动发生。再次:execute来救援:

function Addlnfn() range
    execute a:firstline . ',' . a:lastline . '!cat -n'
    execute a:lastline . ',' . a:firstline . 's/\v\s+(\d+)\s+/\1] /g'
endfunction
command -range=% Addlnfn <line1>,<line2>call Addlnfn()

整体评论

您不需要外部命令来对线路进行编号;这可以完全在Vim内部完成。查看您的other recent question,您似乎已经发现了这一点。