2012-02-02 8 views
9

Io uso plugin "Buffet", e non c'è local-to-buffer di mappatura "d" per eliminare tampone sotto il cursore.Vim: risolvere l'ambiguità di mapping dei tasti in un buffer specifico per evitare il timeout

Io uso anche plugun Surround, e c'è la mappatura globale "ds", che significa "cancellazione Surround".

Quindi, quando premo "d" nella finestra di Buffet, Vim aspetta un secondo prima di eseguire il mapping "d". So di &timeoutlen, ma non voglio cambiarlo. In modo che io voglia risolvere l'ambiguità dei mapping dei tasti per "d" nella finestra di Buffet per evitare il timeout a d elete un buffer.

Per risolvere il problema, desidero annullare la mappatura nella finestra Buffet di tutti i mapping che iniziano con "d", ma ad eccezione dei mapping di Buffet. Come lo posso fare?

P.S. Ho letto su maparg() e mapcheck(), ma non sembrano essere ciò di cui ho bisogno, sfortunatamente.

risposta

4

Sembra che io trovato la soluzione da solo:

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

Spero che ci sia un approccio più universale (per rimuovere davvero tutti i mapping a partire da "d"), ma in questo momento non sono riuscito a trovarlo.

Anche se ho trovato come ottenere tutti questi mapping, purtroppo non posso fare unmap <buffer> ds, perché ds è una mappatura globale. Sono sicuro che i dovrebbero essere in grado di disabilitare la mappatura globale per alcuni buffer, per il. Vim è fantastico ma non perfetto.

Bene, ora funziona per me.

0

Il modo più semplice per farlo è:

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

In genere non si può unmap sulla base di un modello.

Se si desidera utilizzare un altro tasto (ad esempio con <leader>, basta cambiare questa linea nel plugin:

map <buffer> <silent> d :call <sid>deletebuffer(0)<cr> 
+0

Hmmm, sembra che tu mi abbia frainteso. Hai appena suggerito di disattivare i mapping "' d' "per Buffet (in realtà commenta queste mappature), ma non è assolutamente quello di cui ho bisogno. Al contrario, io ** voglio ** usare 'd', ma voglio usarlo senza questo timeout. Peccato che non ci sia modo di "smontare" per modello, ma forse c'è un modo complicato. Ho provato a trovarlo da solo (ho scritto su 'maparg()' e 'mapcheck()'), ma ancora senza fortuna. –

+0

bene dal mio punto di comprensione, ciò che aveva scritto: 'Voglio eliminare la mappatura in una finestra a buffet tutte le mappature che iniziano con 'd'' significa che non si desidera più. –

+0

Volevo dire che voglio eliminare la mappatura tutte le mappature che iniziano con "' d'", ma tranne proprie mappature del buffet =) beh, ho trovato la soluzione locale, non universale (vedi la mia risposta alla mia domanda) –

-1

a buffet è molto giovane plug-in, non credo che è usato da più persone Comando-T o NERDTree per cui potresti non ricevere molte risposte.Il suo autore è stato molto reattivo sui numerosi thread che ha creato lì a questo proposito dovresti contattarlo direttamente o creare un problema su github di Buffet.

+4

Non penso che dovrebbe. È un problema di configurazione locale. –

2

Ora che la domanda è stata "riformulata", questa soluzione non è più pertinente, ma la pubblicherò comunque poiché ho passato alcuni minuti su di essa.

Ecco una funzione che cattura l'output di map <letter> ed estrae le singole mappe. Quindi li cancella tutti.

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 

Esempio di utilizzo: call Unmap("d"). Questo rimuoverà tutti i mapping che iniziano con d, lasciando solo i valori predefiniti di Vim.

Disclaimer: questo non è stato sottoposto a test rigorosi. In particolare, non so quanto sia portatile il carattere \^@, ma è così che appare sulla mia macchina (Win32).

+0

Grazie, in realtà ho voluto ottenere qualcosa di simile, e quindi vorrei metterlo in buffet.vim poco prima della sua definizione proprie mappature, ma il problema principale è che tutte le mappature globali saranno rimossi in modo permanente, non solo per il buffer locale di Buffet. Peccato che Vim non permetta di rimuovere alcuni mapping globali per il solo buffer locale. –

0

Questa domanda è un po 'vecchia, ma se siete ancora interessati, si potrebbe desiderare di dare Bufstop una prova.

Questo problema viene gestito dal plug-in, è possibile premere il tasto d per eliminare un buffer e non si otterrà alcun timeout se sono stati installati altri plug-in con mapping globali.

0

Un trucco economico che ha funzionato per me è stato quello di rendere lo timeoutlen così breve da diventare praticamente istantaneo. Finché non utilizzi più mappature dei tasti, questo coprirà tutti i plugin in un'unica operazione.

Noi non vogliamo che l'impostazione di rimanere comunque, quindi togliamo ogni volta che ci lascia il buffer.

Aggiungere questo modo che venga eseguito all'interno del tampone personalizzato:

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 

Una tecnica simile potrebbe essere utilizzato per un determinato tipo di file, o altre impostazioni "globali".

Problemi correlati