Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim-使用范围将2个命令合并为一个_Vim - Fatal编程技术网

Vim-使用范围将2个命令合并为一个

Vim-使用范围将2个命令合并为一个,vim,Vim,我有两个命令可以正常工作,将行号添加到整个文件或选择中,并更改这些行号以创建1]格式: command -range=% Addln2 <line1>,<line2>!cat -n command -range=% Addln3 <line1>,<line2>s/\v\s+(\d+)\s+/\1] /g 命令-范围=%Addln2,!n类 命令-范围=%Addln3,s/\v\s+(\d+)\s+/\1]/g 但是,我无法将它们合并到一个命令

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

command -range=% Addln2 <line1>,<line2>!cat -n 
command -range=% Addln3 <line1>,<line2>s/\v\s+(\d+)\s+/\1] /g
命令-范围=%Addln2,!n类
命令-范围=%Addln3,s/\v\s+(\d+)\s+/\1]/g
但是,我无法将它们合并到一个命令中。我试过:

command -range=% Addln2 <line1>,<line2>!cat -n | s/\v\s+(\d+)\s+/\1] /g
命令-范围=%Addln2,!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'
命令-范围=%Addln2,!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()
函数Addlnfn()范围
a:第一行,a:最后一行!n类
a:lastline,a:firstline s/\v\s+(\d+)\s+/\1]/g
端功能
命令-范围=%Addlnfn,调用Addlnfn()
但这也会产生一个错误:
缺少endfunction


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

一般来说,
|
可以用来分隔命令,但也有例外,而且
就是其中之一,正如
:help:bar
所解释的那样。这里的原因是
调用的外部shell命令:
可能是管道(例如
cmd1 | grep foo
),因此
|
字符需要是参数的一部分,并且不能分离Vim命令

一种解决方法是使用
:execute

command -range=% Addln2 execute '<line1>,<line2>!cat -n' | s/\v\s+(\d+)\s+/\1] /g
全面批评
您不需要外部命令对行进行编号;这完全可以在Vim内部完成。看看你的,你似乎已经发现了。

也许你可以用这样的东西来代替,而不必依赖外部程序
3,10s/^/\=line(“.”-2.”“
我如何将其转换为一个可以在整个文件和视觉选择上工作的命令。这应该可以实现
功能!Test()范围执行:firstline。"," . a:最后一行。”s/^/\=行(“.”-”。a:第一线。”。“]”结束函数
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()