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

Vim、Emacs配置和使用
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

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

#1

帖子 自由建客 » 2011-05-01 20:20

一个预处理函数 Fun(...),一个处理函数 FunOp(...)
Fun 最终要调用 FunOp 进行具体操作,Fun 该如何调用 FunOp 才能把所有参数原封不动地再传给 FunOp ?
效果就如同 shell 脚本的 exec command "$@"。
上次由 自由建客 在 2011-05-10 0:33,总共编辑 1 次。
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

Re: vim script 不定参数问题

#2

帖子 acer4740 » 2011-05-01 20:31

说的不清楚
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim script 不定参数问题

#3

帖子 自由建客 » 2011-05-01 21:07

代码: 全选

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

fun FunOp(...)
	" 具体操作
endfun
头像
qy117121
论坛版主
帖子: 50587
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: vim script 不定参数问题

#4

帖子 qy117121 » 2011-05-01 21:19

:em01
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

邮箱 [email protected]
头像
SmallV
论坛版主
帖子: 9017
注册时间: 2011-01-26 17:52
来自: 万林丛中的一抹浓绿,夹带落日余晖的安祥

Re: vim script 不定参数问题

#5

帖子 SmallV » 2011-05-01 21:22

:em01
Just do it, you will succeed!
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: vim script 不定参数问题

#6

帖子 月下叹逍遥 » 2011-05-01 21:32

返回字符还是数组?
浮生七十今三十,从此凄惶未可知
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim script 不定参数问题

#7

帖子 fanhe » 2011-05-01 22:14

代码: 全选

:h a:000
你就不能多看看手册么
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim script 不定参数问题

#8

帖子 自由建客 » 2011-05-01 23:08

fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: vim script 不定参数问题

#9

帖子 月下叹逍遥 » 2011-05-01 23:09

不会,只学过一点C……
浮生七十今三十,从此凄惶未可知
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim script 不定参数问题

#10

帖子 fanhe » 2011-05-01 23:26

自由建客 写了: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 不定参数问题

#11

帖子 自由建客 » 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
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim script 不定参数问题

#12

帖子 自由建客 » 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 可读性啊
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim script 不定参数问题

#13

帖子 自由建客 » 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
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

Re: vim script 不定参数问题

#14

帖子 acer4740 » 2011-05-02 14:06

自由建客 写了:

代码: 全选

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]
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim script 不定参数问题

#15

帖子 自由建客 » 2011-05-02 14:36

FunOp 的接口不能变动,这是规定
回复