vim globpath() 问题 [解决]

Vim、Emacs配置和使用
回复
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

vim globpath() 问题 [解决]

#1

帖子 自由建客 » 2011-05-13 12:37

代码: 全选

let lst=split(globpath(&runtimepath, "lib/".a:A."*"), "\n")
其结果中的目录并不以 / 结尾。

遍历一遍列表,判断其是否为目录,是则追加 / 。
好麻烦,还要遍历,费时!
是否有简单方法,能直接在 globpath() 那里搞定?
-----------------------------------------

代码: 全选

fun s:Lib_CmdComp(A, L, P)
	if a:L=~'\m^\s*Lib\s\+path\s\+'
		let lst=split(globpath(&runtimepath, "lib/".a:A."*"), "\n")
		" 遍历一遍自己搞
		let i=0
		while i<len(lst)
			if isdirectory(lst[i])
				let lst[i].='/'
			endif
			let i+=1
		endwhile
		let i=0
		while i<len(lst)
			let lst[i]=matchstr(lst[i], '\m\/\zs'.a:A.'[^\/]*\/\?$')
			let i+=1
		endwhile
	elseif a:L=~'\m^\s*Lib\s\+'
		let lst=["list", "path"]
		let i=0
		while i<len(lst)
			let lst[i]=matchstr(lst[i], '\m^'.a:A.'.*$')
			let i+=1
		endwhile
	endif
	return lst
endfun
上次由 自由建客 在 2011-05-23 21:58,总共编辑 1 次。
头像
lilydjwg
论坛版主
帖子: 4165
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: vim globpath() 问题

#2

帖子 lilydjwg » 2011-05-13 13:27

自由建客 写了:

代码: 全选

let lst=split(globpath(&runtimepath, "lib/".a:A."*"), "\n")
其结果中的目录并不以 / 结尾。

遍历一遍列表,判断其是否为目录,是则追加 / 。
好麻烦,还要遍历,费时!
是否有简单方法,能直接在 globpath() 那里搞定?
这样如何?

代码: 全选

let lst=map(split(globpath(&runtimepath, "lib/".a:A."*"), "\n"),
   \ 'isdirectory(v:val) ? v:val."/": v:val')
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: vim globpath() 问题

#3

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

lilydjwg, 还不如我遍历一遍列表快 :em20

代码: 全选

globpath(&runtimepath, "lib/"."{*\/,*}")
有点遗憾,会出现重复项,目录会被列两次,要这样再删除重复项比遍历一遍列表还慢
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45
送出感谢: 0
接收感谢: 9 次

Re: vim globpath() 问题

#4

帖子 fanhe » 2011-05-13 13:48

重复项用字典键值方法剔除
回复

回到 “Vim和Emacs”