我发现了一种在vimscript中使用python的方法。使用python,我能够从vim.buffers[i].name
获得所有缓冲区的名称,并使用os.path
和os.sep
来处理切换到哪个缓冲区。
最后,我决定,如果它被要求切换到的缓冲区模糊不清,它会拒绝做任何事情会更有帮助。
这就是:
"Given a file, full path, or partial path, this will try to change to the
"buffer which may match that file. If no buffers match, it returns 1. If
"multiple buffers match, it returns 2. It returns 0 on success
function s:GotoBuffer(buf)
python << EOF
import vim, os
buf = vim.eval("a:buf")
#split the paths into lists of their components and reverse.
#e.g. foo/bar/baz.py becomes ['foo', 'bar', 'baz.py']
buf_path = os.path.normpath(buf).split(os.sep)[::-1]
buffers = [os.path.normpath(b.name).split(os.sep)[::-1] for b in vim.buffers]
possible_buffers = range(len(buffers))
#start eliminating incorrect buffers by their filenames and paths
for component in xrange(len(buf_path)):
for b in buffers:
if len(b)-1 >= component and b[component] != buf_path[component]:
#This buffer doesn't match. Eliminate it as a posibility.
i = buffers.index(b)
if i in possible_buffers: possible_buffers.remove(i)
if len(possible_buffers) > 1: vim.command("return 2")
#delete the next line to allow ambiguous switching
elif not possible_buffers: vim.command("return 1")
else:
vim.command("buffer " + str(possible_buffers[-1] + 1))
EOF
endfunction
编辑:上面的代码似乎有一些错误。我不打算修复它们,因为还有另一个更好的答案。
*扭曲的笑容*我知道VIM将有一个函数来做到这一点。谢谢。 –