2012-11-27 46 views
1

我有一个需要切换到特定缓冲区的vimscript。该缓冲区将由完整路径,部分路径或其名称指定。vimscript:通过文件名路径切换到缓冲区

例如:

我在目录/home/user/code,我有3个开放式foo.pysrc/foo.pysrc/bar.py vim的缓冲区。

  • 如果脚本被告知要切换到缓冲/home/user/code/foo.py它会切换到缓冲foo.py

  • 如果它被告知要切换到user/code/src/foo.py它会切换到缓冲src/foo.py

  • 如果它被告知要切换到foo.py将切换到缓冲foo.py

  • 如果被告知SWITH到bar.py它将切换到缓冲src/bar.py

我可以看到的最简单的解决方案是以某种方式获取存储在变量中的缓冲区列表并使用试验和错误。

如果解决方案是跨平台的,那将是很好的,但它至少需要在Linux上运行。

回答

6

bufname()/bufnr()函数可以通过部分文件名查找加载的缓冲区。您可以通过附加$,像这种定位的比赛进行到结束:

echo bufnr('/src/foo.py$') 
+0

*扭曲的笑容*我知道VIM将有一个函数来做到这一点。谢谢。 –

0

我发现了一种在vimscript中使用python的方法。使用python,我能够从vim.buffers[i].name获得所有缓冲区的名称,并使用os.pathos.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 

编辑:上面的代码似乎有一些错误。我不打算修复它们,因为还有另一个更好的答案。