我有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
问题出在哪里?如何解决?谢谢。
答案 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,您似乎已经发现了这一点。