Vimの'path'
オプションは、コマンドが好きなディレクトリを指定することができますgf
し、:find
ファイルを検索します。
この機能を特定のファイルセットに対してのみトリガーする場合は、autocmdを使用して、:edit
コマンドを'path'
ディレクトリの1つにあるファイルに自動的に「リダイレクト」できます。
set path+=~/
function! FindInPath(name)
let found = findfile(a:name)
if !empty(found)
exe 'silent keepalt file '. fnameescape(found)
edit
endif
endfunction
autocmd BufNewFile .vimrc,.zshrc nested call FindInPath(expand('<afile>'))
これは、BufNewFile
autocmdをのトリガーとして使用しfile not found, so try to find it somewhere else
ます。そのような状況が検出されたら、を使用findfile()
して、'path'
ディレクトリ内のファイルを見つけようとします。見つかった場合は、現在のバッファの名前をそのファイルに変更し、バッファを再編集します。そうでない場合は、新しいバッファの使用を続けます。
nested
autocmdsが正常に巣をしないので、修飾子は、ここで必要とされます。この場合、:edit
コマンドがファイルを開いたときに典型的なautocmdsがトリガーされるようにします。
これにより、ファイルを手動で編集するだけの場合と比較して、追加のバッファーが作成されることに注意してください。BufNewFile
実行されるまでに、最初に指定されたファイル名のバッファがすでに作成されています。を使用:file
してバッファの名前を変更すると、元の名前でアンロードされた新しいバッファが作成されます。
で常に検索する'path'
場合は、*
特定のファイルを指定するのではなく、ファイルパターンを使用するようにautocmdを変更できます。
ここにあなたの要件によりよく一致するはずの更新されたバージョンがあります。:find
の結果に基づいてバッファ名を設定する代わりに、ファイルを直接開くために使用しますfindfile()
。
function! FindInPath(name)
let path=&path
" Add any extra directories to the normal search path
set path+=~,~/.vim,/etc
" If :find finds a file, then wipeout the buffer that was created for the "new" file
setlocal bufhidden=wipe
exe 'silent! keepalt find '. fnameescape(a:name)
" Restore 'path' and 'bufhidden' to their normal values
let &path=path
set bufhidden<
endfunction
autocmd BufNewFile * nested call FindInPath(expand('<afile>'))
これにより、:file
-namedバッファーを保存しようとするとVimが文句を言う以前の関数の問題が解決されます。
keepalt file
に割り当てるのと同じ欠点がありvim.current.buffer.name
ます-変更を保存しようとすると、vimはファイルがすでに存在することを警告します。