Vim: Resolve a ambiguidade dos mapeamentos de teclas em um buffer específico para evitar o tempo limite

9

Eu uso o plugin " Buffet ", e há um mapeamento de local para buffer " d " para excluir buffer sob o cursor.

Eu também uso plug-in Surround , e há um mapeamento global " ds " que significa " excluir surround ".

Então, quando eu pressiono " d " na janela do Buffet, o Vim espera por um segundo antes de executar o mapeamento " d ". Eu sei sobre &timeoutlen , mas não quero mudar isso. Então, eu quero resolver a ambigüidade dos mapeamentos de chaves para " d " na janela do Buffet para evitar tempo limite para d elete um buffer.

Para resolver o problema, quero desmapear na janela Buffet todos os mapeamentos que começam com " d ", mas exceto os mapeamentos do próprio Buffet. Como posso fazer isso?

P.S. Eu li sobre maparg() e mapcheck() , mas eles parecem não ser o que eu preciso, infelizmente.

    
por Dmitry Frank 02.02.2012 в 11:20
fonte

6 respostas

4

Parece que eu mesmo encontrei a solução:

au BufEnter buflisttempbuffer* nunmap ds
au BufLeave buflisttempbuffer* nmap   ds <Plug>Dsurround

Eu esperava que houvesse uma abordagem mais universal (para remover realmente todos os mapeamentos a partir de " d "), mas neste momento não consegui encontrá-lo.

Mesmo se eu descobrisse como obter todos esses mapeamentos, infelizmente não posso fazer unmap <buffer> ds , porque ds é um mapeamento global. Eu tenho certeza que eu deveria ser capaz de desativar o mapeamento global para algum buffer, no entanto. Vim é ótimo, mas não perfeito.

Bem, funciona para mim agora.

    
por Dmitry Frank 02.02.2012 / 14:31
fonte
2

Agora que a pergunta foi "reformulada", essa solução não é mais relevante, mas vou postá-la assim desde que passei alguns minutos nela.

Aqui está uma função que pega a saída de map <letter> e extrai os mapas individuais. Então desmata todos eles.

function! Unmap(leader)
    redir => maps
        sil exe "map " . a:leader
    redir END
    let maps_list = split(strtrans(maps),'\^@')
    if len(maps_list) > 1
        for this in maps_list
            let mapn = matchstr(this,"^\w\s*\zsd\w*\>")
            exe "unmap " . mapn
        endfor
    endif
endfunction

Exemplo de uso: call Unmap("d") . Isso removerá todos os mapeamentos que começam com d , deixando apenas os padrões do Vim.

Aviso: isso não foi rigorosamente testado. Em particular, não sei quão portátil é o caracter \^@ , mas é assim que fica na minha máquina (Win32).

    
por Prince Goulash 02.02.2012 / 17:34
fonte
0

A maneira mais fácil de fazer isso é:

:e /WHERE/YOU/HAD/INSTALLED/buffet.vim
:%s:map <buffer> <silent> d:"&: 
:wq
$ vim # Restart Vim to take effect...

Geralmente você não pode unmap com base em um padrão.

Se você quiser usar outra chave (por exemplo, com <leader> , apenas altere esta linha no plug-in:

map <buffer> <silent> d :call <sid>deletebuffer(0)<cr>
    
por Zsolt Botykai 02.02.2012 / 13:33
fonte
0

Esta pergunta é bastante antiga, mas se você ainda estiver interessado, talvez queira testar o Bufstop .

Este problema é tratado pelo plugin, você pode pressionar a tecla d para deletar um buffer, e você não obterá nenhum timeout se você instalou outros plugins que possuem mapeamentos globais.

    
por mihai 07.06.2014 / 14:17
fonte
0

Um truque barato que funcionou para mim foi tornar o timeoutlen tão curto que se tornou praticamente instantâneo. Contanto que você não use vários mapeamentos de teclas, isso abrangerá todos os plugins em um único disparo.

No entanto, não queremos que essa configuração permaneça, por isso, removemos essa configuração toda vez que deixamos o buffer.

Adicione isto para que seja executado dentro do seu buffer personalizado:

augroup no_map_chords
  autocmd!
  autocmd BufEnter <buffer> let g:bak_timeoutlen = &timeoutlen | set timeoutlen=1
  autocmd BufLeave <buffer> let &timeoutlen = g:bak_timeoutlen | unlet g:bak_timeoutlen
augroup END

Uma técnica semelhante pode ser usada para um tipo de arquivo específico ou outras configurações "globais".

    
por Christian Rondeau 05.01.2017 / 05:21
fonte
-1

Buffet é um plugin muito novo, eu não acho que é usado por tantas pessoas como Command-T ou NERDTree, então você pode não receber muitas respostas. Seu autor tem sido muito responsivo sobre os numerosos tópicos que ele criou lá sobre isso, você deve contatá-lo diretamente ou criar um problema no github .

    
por romainl 02.02.2012 / 13:35
fonte