Defina imap dependendo do tipo de arquivo

2

Estou usando o xml e omnicppcompl plugins para o Vim, e fazendo uso de dois mapeamentos de inserção que estes plugins definem para o '>' chave. Meu problema é que, enquanto o plug-in omnicppcompl ficará feliz em imap o '>' chave quando eu inserir um buffer de filetype cpp ou c , mas quando isso acontecer, o xml do plugin imap do '& gt ; ' a chave não funcionará mais, pois ela não será remapeada quando eu inserir um buffer de tipo de arquivo xml . Isso faz com que eu não consiga usar mais a funcionalidade que o mapeamento fornece quando edito arquivos xml, que é escrever automaticamente uma tag de fechamento (o mapa omnicppcompl permanece).

O que eu estou procurando é que esses dois mapeamentos estejam disponíveis em seus respectivos filetype , e acredito que o problema está no plugin xml não se remapeando da mesma forma omnicppcompl pode. Eu tentei escrever rapidamente autocmd no meu .vimrc para remapear manualmente o '>' key, mas o xml plugin imap para uma função local em seu script com o <SID> bit.

Alguém sabe como posso contornar isso? Existe uma maneira de forçar o plug-in xml a executar novamente seu mapeamento? Eu não sei muito sobre o script do vim e como os plugins operam, mas é porque o plugin xml não possui autoload scripts?

Para referência, o plug-in xml mapeia o '>' chave na linha 1485 de ftplugin/xml.vim , e o plug-in omnicppcompl mapeia '>' tecla na linha 40 de autoload/omni/cpp/complete.vim

Eu agradeceria muito qualquer ajuda e sugestões sobre como corrigir / solucionar isso.

    
por ZeroKnight 02.06.2013 / 08:24

1 resposta

2

Eu apenas dei uma rápida olhada nesses dois arquivos e, pelo que sei, parece que o mapeamento é feito corretamente no xml plugin:

inoremap <silent> <buffer> > ><Esc>:call <SID>CloseTagFun()<Cr>

enquanto isso é feito incorretamente no plug-in omnicppcomplete :

inoremap <expr> > omni#cpp#maycomplete#Arrow()

Ao fazer esse tipo de mapeamento, os autores de plug-in devem tentar restringir seu escopo o máximo possível: mapeamentos específicos de tipo de arquivo devem ser locais de buffer, usando <buffer> como no primeiro exemplo.

Como está, dependendo de como você carregou seus arquivos, o mapeamento cpp pode ter precedência sobre o mapeamento xml , porque parece ser aplicado de forma muito ampla a toda a instância Vim, em vez de cpp buffers. / p>

Além disso, o plug-in omnicppcomplete não usa ftplugin , o que é o tipo de norma para itens específicos do tipo de arquivo.

Como uma solução imediata, sugiro que você adicione <buffer> ao mapeamento cpp e, se isso funcionar, tente entrar em contato com o autor e convencê-lo a modificar o plug-in.

inoremap <buffer> <expr> > omni#cpp#maycomplete#Arrow()
    
por 02.06.2013 / 08:55