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.if expand('%') !~ '^[.~]\?/'
...endif
para que os caminhos relativos ou absolutos especificados explicitamente sejam ignorados; e use emsilent
vez desilent!
, porque se você abrirvim vimrc
em dois terminais, o segundo aguardará a entrada do aviso "o arquivo está aberto em outro lugar" usual, mas o usuário não tem idéia do que está esperando. Não estou editando ainda, para ver se você tem maneiras melhores de lidar.Alternativa é fazer alguns comandos que tornarão isso mais fácil:
Estou usando o padrão
E
/S
que rails.vim / projectionist.vim usa.Para obter mais ajuda, consulte:
fonte
Esta não é uma solução, mas é o que eu faço, a fim de ter acesso fácil a
.vimrc
e.zshrc
. Pessoalmente, acho isso bem legal:fonte
No espírito de
CDPATH
, escrevi uma função baseada em Python para fazer isso (com a ajuda de Matt Boehm ):BufWinEnter
vez de,BufNewFile
porque o último não parecia se comportar de maneira confiável quando vários nomes de arquivos foram dados.bad
segui-lobd
como uma maneira confiável de fechar o buffer aberto para o arquivo não utilizado. Isso ainda não funciona quando eu faço:tabe some-file
(nenhuma nova guia é aberta). No entanto, essa é uma pergunta para outro dia.CDPATH
, eu posso adicionar facilmente mais diretórios editandoPATHS
ou tornando-o uma variável no nível do Vim e modificando-o.O que as outras respostas perdem, IMO, é que não quero criar configurações para cada arquivo , mas para cada diretório . Não me importo se estou abrindo
fstab
ouvimrc
, só queria que o Vim procurasse arquivos em algum conjunto de diretórios, se não existisse no diretório atual. +1 a todos eles pelos esforços específicos do arquivo.fonte
*
no padrão de arquivo, em vez de arquivos específicos, deve obter a mesma coisa e evitar o seu problema:tabe
.Com
'user-commands'
e'Dictionary'
, podemos editar os arquivos sem criar um buffer para substituir o arquivo que queremos editar no buffer.Observe que a função
Editfile
não tenta verificar seu argumento. Vamos fazer com que o vim lide com todos os erros como outros comandos Ex normais. Se o argumento estiver correto, o vim começará a editar o arquivo e, se não estiver correto, o vim reportará erros.Na minha opinião, não precisamos criar um buffer. Tem duas desvantagens principais.
'not-edited'
sinalizador seria definido. Como jamessan aponta em sua resposta , se definirmos o nome do arquivo atual com o:file
comando e tentarmos escrever o arquivo, receberemos a mensagem de erroE13: File exists (use ! to override)
Isso ocorre porque o vim marca o arquivo como "não editado" quando alteramos o nome do arquivo com:file
comando.:keepalt
comando Quando tentamos editar o vimrc enquanto editamos 'foo.bar', esperamos que o nome alternativo do arquivo seja 'foo.bar'. Mas se criarmos um buffer e mudarmos o nome, o nome do arquivo alternativo se tornará não o "foo.bar", mas o nome antigo do buffer 'vimrc'. Pior ainda, o buffer antigo será deixado comounlisted-buffer
ouinactive-buffer
. É por isso que devemos usar o:keepalt
comando para manter o nome do arquivo alternativo conforme o esperado e definir abufhidden
opçãowipe
para eliminar o buffer antigo.Se a letra maiúscula no nome do comando (todos os comandos definidos pelo usuário devem começar com letra maiúscula) não nos interessa, seria melhor usá-la. Como ele não cria um buffer, não temos ônus em gerenciar o buffer. Basta passar o nome do arquivo para o vim e ver como o vim lida com isso.
fonte