分页: 1 / 2

vim script 不定参数问题 [解决]

发表于 : 2011-05-01 20:20
自由建客
一个预处理函数 Fun(...),一个处理函数 FunOp(...)
Fun 最终要调用 FunOp 进行具体操作,Fun 该如何调用 FunOp 才能把所有参数原封不动地再传给 FunOp ?
效果就如同 shell 脚本的 exec command "$@"。

Re: vim script 不定参数问题

发表于 : 2011-05-01 20:31
acer4740
说的不清楚

Re: vim script 不定参数问题

发表于 : 2011-05-01 21:07
自由建客

代码: 全选

fun Fun(...)
	" 预处理
	return FunOp(这里该怎么写)	" 把接收的所有参数原封不动的再传给 FunOp
endfun

fun FunOp(...)
	" 具体操作
endfun

Re: vim script 不定参数问题

发表于 : 2011-05-01 21:19
qy117121
:em01

Re: vim script 不定参数问题

发表于 : 2011-05-01 21:22
SmallV
:em01

Re: vim script 不定参数问题

发表于 : 2011-05-01 21:32
月下叹逍遥
返回字符还是数组?

Re: vim script 不定参数问题

发表于 : 2011-05-01 22:14
fanhe

代码: 全选

:h a:000
你就不能多看看手册么

Re: vim script 不定参数问题

发表于 : 2011-05-01 23:08
自由建客
fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果

Re: vim script 不定参数问题

发表于 : 2011-05-01 23:09
月下叹逍遥
不会,只学过一点C……

Re: vim script 不定参数问题

发表于 : 2011-05-01 23:26
fanhe
自由建客 写了: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'])
方法是自己想出来的
你自己可以想办法自己封装一下

Re: vim script 不定参数问题

发表于 : 2011-05-02 0:59
自由建客

代码: 全选

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
Fun 这样的预处理函数有很多个,每个都这样写,好麻烦 :em68
有没有宏,只要写一行就扩展为

代码: 全选

	let args=""
	let i=1
	while i<=a:0
		let args.="a:".i.","
		let i+=1
	endwhile
	exe "let r=FunOp(".args.")"
	return r
像 C 语言的 #define

Re: vim script 不定参数问题

发表于 : 2011-05-02 1:18
自由建客

代码: 全选

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
:em26 可读性啊

Re: vim script 不定参数问题

发表于 : 2011-05-02 13:32
自由建客

代码: 全选

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
好吧,最后方案了! :em28

Re: vim script 不定参数问题

发表于 : 2011-05-02 14:06
acer4740
自由建客 写了:

代码: 全选

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
好吧,最后方案了! :em28




应该还有更简单的办法

代码: 全选

call Fun(1, 2, 3)

FunOp(a:000)
传入列表,FunOp再按列表解析
a:1[0]
a:1[1]
a:1[2]

Re: vim script 不定参数问题

发表于 : 2011-05-02 14:36
自由建客
FunOp 的接口不能变动,这是规定