3

特定のバッファに切り替える必要がある vimscript があります。そのバッファーは、完全パス、部分パス、またはその名前だけで指定されます。

例えば:

私はディレクトリ/home/user/codeにいて、3 つの vim バッファを開いfoo.py src/foo.pyていsrc/bar.pyます。

  • スクリプトが buffer に切り替えるように指示された場合、 buffer/home/user/code/foo.pyに切り替えfoo.pyます。

  • 切り替えるように指示された場合user/code/src/foo.py、バッファーに切り替えますsrc/foo.py

  • 切り替えるように指示された場合foo.py、バッファーに切り替えますfoo.py

  • に切り替えるように指示された場合bar.py、バッファに切り替えますsrc/bar.py

私が見ることができる最も簡単な解決策は、変数に格納されているバッファーのリストを何らかの方法で取得し、試行錯誤を行うことです。

ソリューションがクロス プラットフォームであればよいのですが、少なくとも Linux 上で実行する必要があります。

4

2 に答える 2

7

bufname()/関数は、bufnr()読み込まれたバッファを部分的なファイル名で検索できます。$次のようにa を追加することで、一致を最後に固定できます。

echo bufnr('/src/foo.py$')
于 2012-11-27T09:27:40.480 に答える
0

私は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

編集:上記のコードにはいくつかのバグがあるようです。はるかに良い別の答えがあるので、私はそれらを修正するつもりはありません。

于 2012-11-27T06:42:01.497 に答える