vim script 不定参数问题 [解决]
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
vim script 不定参数问题 [解决]
一个预处理函数 Fun(...),一个处理函数 FunOp(...)
Fun 最终要调用 FunOp 进行具体操作,Fun 该如何调用 FunOp 才能把所有参数原封不动地再传给 FunOp ?
效果就如同 shell 脚本的 exec command "$@"。
Fun 最终要调用 FunOp 进行具体操作,Fun 该如何调用 FunOp 才能把所有参数原封不动地再传给 FunOp ?
效果就如同 shell 脚本的 exec command "$@"。
上次由 自由建客 在 2011-05-10 0:33,总共编辑 1 次。
- acer4740
- 帖子: 1405
- 注册时间: 2010-09-13 19:04
- 来自: 0xFF00EE
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
代码: 全选
fun Fun(...)
" 预处理
return FunOp(这里该怎么写) " 把接收的所有参数原封不动的再传给 FunOp
endfun
fun FunOp(...)
" 具体操作
endfun
- qy117121
- 论坛版主
- 帖子: 50587
- 注册时间: 2007-12-14 13:40
- 系统: Winbuntu
- 来自: 志虚国乌由市
- 联系:
- SmallV
- 论坛版主
- 帖子: 9017
- 注册时间: 2011-01-26 17:52
- 来自: 万林丛中的一抹浓绿,夹带落日余晖的安祥
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
- fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
Re: vim script 不定参数问题
代码: 全选
:h a:000
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
- fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
Re: vim script 不定参数问题
自由建客 写了:fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
代码: 全选
fun! Fun(...)
" 预处理
echo a:000
if a:0 > 0
let args = ''
for idx in range(1, a:0 - 1)
let args .= 'a:'.idx.', '
endfor
let args .= 'a:'.a:0.''
endif
" echo args
" return FunOp(a:000) " 把接收的所有参数原封不动的再传给 FunOp
exec 'let ret = FunOp('. args .')'
return ret
" return FunOp(args) " 把接收的所有参数原封不动的再传给 FunOp
endfun
fun! FunOp(...)
echo a:000
" 具体操作
endfun
call Fun('a', 1, ['xyz'])
你自己可以想办法自己封装一下
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
代码: 全选
fun! Fun(...)
echo "=== Fun ==="
echo a:0
let args=""
let i=1
while i<=a:0
let args.="a:".i.","
let i+=1
endwhile
echo args
exe "let r=FunOp(".args.")"
return r
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
endfun

有没有宏,只要写一行就扩展为
代码: 全选
let args=""
let i=1
while i<=a:0
let args.="a:".i.","
let i+=1
endwhile
exe "let r=FunOp(".args.")"
return r
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
代码: 全选
let s:CALL_FUNOP="let args=''\n let i=1\n while i<=a:0\n let args.='a:'.i.','\n let i+=1\n endwhile\n echo args\n exe 'let r=FunOp('.args.')'\n return r"
fun! Fun(...)
echo "=== Fun ==="
echo a:0
exe s:CALL_FUNOP
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
endfun

- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
代码: 全选
fun! s:Args(begin, end)
if a:begin>a:end
return ""
else
let args="a:".a:begin
endif
let i=a:begin+1
while i<=a:end
let args.=",a:".i
let i+=1
endwhile
return args
endfun
fun! Fun(...)
echo "=== Fun ==="
echo a:0
echo s:Args(1, a:0)
exec "let r=FunOp(".s:Args(1, a:0).")"
return r
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
return "*****".a:0."*****"
endfun

- acer4740
- 帖子: 1405
- 注册时间: 2010-09-13 19:04
- 来自: 0xFF00EE
Re: vim script 不定参数问题
自由建客 写了:好吧,最后方案了!代码: 全选
fun! s:Args(begin, end) if a:begin>a:end return "" else let args="a:".a:begin endif let i=a:begin+1 while i<=a:end let args.=",a:".i let i+=1 endwhile return args endfun fun! Fun(...) echo "=== Fun ===" echo a:0 echo s:Args(1, a:0) exec "let r=FunOp(".s:Args(1, a:0).")" return r endfun fun! FunOp(...) echo "=== FunOp ===" echo a:0 return "*****".a:0."*****" endfun
应该还有更简单的办法
代码: 全选
call Fun(1, 2, 3)
FunOp(a:000)
a:1[0]
a:1[1]
a:1[2]
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: vim script 不定参数问题
FunOp 的接口不能变动,这是规定