A documentação diz:
<afile> When executing autocommands, is replaced with the file name
for a file read or write.
<abuf> When executing autocommands, is replaced with the currently
effective buffer number (for ":r file" and ":so file" it is
the current buffer, the file being read/sourced is not in a
buffer).
<amatch> When executing autocommands, is replaced with the match for
which this autocommand was executed. It differs from
<afile> only when the file name isn't used to match with
(for FileType, Syntax and SpellFileMissing events).
No entanto, se eu tivesse isso autocmd
:
autocmd BufNewFile * echo expand('<amatch>') expand('<afile>')
E aberto, digamos .zshrc
em /tmp
( cd /tmp; vim .zshrc
), recebo:
/tmp/.zshrc .zshrc
Eles não são os mesmos. O que está acontecendo?
%
é fiel ao que eu realmente digitei. vim ./.zshrc
com expand('%')
adicionado ao acima autocmd
me dá:
/tmp/.zshrc .zshrc ./.zshrc
<afile>
apenas o nome do arquivo<amatch>
e o caminho completo para o arquivo?%
, no entanto, é fiel ao que eu realmente mencionei. Mas não tenho certeza se posso confiar%
aqui. : /vim /tmp/.zshrc
elas são as mesmas strings. Se seu cwd for,/tmp
você obterá um caminho absoluto e um caminho relativo e, embora não sejam as mesmas seqüências de caracteres, eles são os mesmos caminhos.vim .zshrc
expand('<amatch>') == expand('%:p')
eexpand('<afile>') == expand('%')
. O que você acha ? Edit: Acabei de ver sua edição, aexpand('<afile>') == expand('%')
não se aplica maisRespostas:
<amatch>
é exatamente o que corresponde aoautocmd
padrão. Paraautocmd
s que correspondem aos nomes de arquivos, os links simbólicos são resolvidos, o resultado é canônico e o caminho completo é retornado.<afile>
é o caminho completo canônico como acima, mas o resultado também é reduzido, que é essencialmente o mesmo quefnamemodify(file, ':.')
(os detalhes exatos estão mais envolvidos, mas a descrição anterior é precisa para todos os casos "normais").Assim, em geral
expand('<afile>') == expand('<amatch>:.')
( editar: desde que, naturalmente, eles se refiram à mesma coisa).fonte
autocmd
s onde<afile>
e<amatch>
que se referem à mesma coisa (ou seja, para um arquivo), ao contrário do que o manual implica. Minha resposta explica como e por que eles diferem nesse caso específico. Melhor agora? :)