A 'path'
opção do Vim permite que você especifique diretórios de comandos como gf
e :find
procurará por um arquivo.
Se você deseja que essa funcionalidade seja acionada apenas para um conjunto específico de arquivos, use um autocmd para "redirecionar" automaticamente seu :edit
comando para o arquivo em um dos 'path'
diretórios.
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>'))
Isso usa o BufNewFile
autocmd como um gatilho para file not found, so try to find it somewhere else
. Quando essa situação for detectada, use findfile()
para tentar encontrar o arquivo nos 'path'
diretórios. Se for encontrado, altere o nome do buffer atual para esse arquivo e edite-o novamente; caso contrário, continue usando o novo buffer.
O nested
qualificador é necessário aqui, pois os autocmds normalmente não são aninhados. Nesse caso, você deseja que os autocmds típicos sejam acionados quando o :edit
comando abrir seu arquivo.
Observe que isso ainda criará um buffer extra em comparação com apenas editar o arquivo manualmente. Quando o tempo BufNewFile
é executado, o buffer para o nome do arquivo originalmente especificado já está criado. Usar :file
para alterar o nome de um buffer cria um novo buffer descarregado com o nome original.
Se você sempre deseja pesquisar 'path'
, o autocmd pode simplesmente ser alterado para usar o *
padrão de arquivo em vez de especificar determinados arquivos.
Aqui está uma versão atualizada que deve atender melhor aos seus requisitos. Ele é usado :find
para abrir diretamente o arquivo em vez de definir o nome do buffer com base no resultado de 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>'))
Isso resolve o problema na função anterior, na qual o Vim reclamava ao tentar salvar o :file
buffer nomeado.
keepalt file
tem a mesma desvantagem que atribuir aovim.current.buffer.name
- vim avisa que o arquivo já existe ao tentar salvar suas alterações.