2010-06-03 7 views
6

Mi piace il mio compito di entrare in modalità comando il più spesso possibile. Penso che perdere la concentrazione sarebbe un buon evento per farlo accadere. Tutto ciò che ho trovato è per il salvataggio in caso di perdita di concentrazione.Vim: torna alla modalità comando quando la messa a fuoco è persa

Mi piacerebbe che si ritorni automaticamente in modalità cmd quando si passa da una scheda in macvim o da una tabulazione di cmd + a un'altra app.

+0

c'è una domanda duplicato e rispondere da superutente: http://superuser.com/questions/236534/change -to-normal-mode-when-macvim-goes-background – rubiii

risposta

16

La seguente autocommand sarebbe la scelta "ovvia".

au FocusLost,TabLeave * stopinsert 

Sfortunatamente, sembra funzionare correttamente solo per TabLeave. L'evento FocusLost si attiva ma, per qualche motivo, il comando stopinsert non ha effettivamente effetto fino a quando non viene ricevuto un evento chiave una volta che Vim ha ripristinato la messa a fuoco.

Invece, è possibile usufruire di feedkeys e "Get me to normal mode non importa cosa!" key combo:

au FocusLost,TabLeave * call feedkeys("\<C-\>\<C-n>") 

L'unico inconveniente è che feedkeys() richiede almeno Vim 7. Questo non dovrebbe essere un grosso problema, però, dal momento Vim 7 è stato rilasciato nel 2006.

+0

Perfetto, grazie! – devth

+0

Cool - mai saputo di 'Ctrl - \ _ Ctrl-N'. Ho avuto la linea stopinsert nel mio vimrc ma è sempre stata infastidita dal fatto che ci sia voluto un altro carattere quando si ritorna al buffer ...: wq –

+0

Avrei commentato, ma il mio commento viene fornito con la formattazione. Vedi sotto. :) Devo ringraziare @jamessan per avere indicazioni su questo. –

7

avrei aggiunto una commento, ma non posso formattare la soluzione.

La soluzione feedkeys è grande, con il piccolo intoppo che torna sempre alla modalità normale, indipendentemente da quali altre modalità stavi dentro. Non si vuole annullare la modalità a riga di comando (per il drag & file goccia in Windows) e non ho bisogno di annullare la modalità visiva, volevo solo annullare la modalità di inserimento.

La soluzione, quindi, appare come:

autocmd FocusLost * call PopOutOfInsertMode() 

function! PopOutOfInsertMode() 
    if v:insertmode 
     feedkeys("\<C-\>\<C-n>") 
    endif 
endfunction 

In altre parole, solo pop fuori se si è in una modalità di inserimento. Questo potrebbe essere ulteriormente migliorato, dal momento che v: insertmode sarà 'i' in "normale inserimento", 'r' in modalità Sostituisci, e 'v' in modalità Sostituzione virtuale. Per me, saltar fuori a prescindere è buono, ma l'utente potrebbe voler modificare per soddisfare.

Se questo non funziona per voi in MacVim, sostituire il contenuto di PopOutOfInsertMode con:

if v:insertmode == 'i' | call feedkeys("\<C-\>\<C-n>") | endif 
+0

Grazie per le informazioni aggiuntive! Ho scoperto lo stesso problema con la soluzione originale. Togliere le carte mentre era in modalità comando per cercare qualcosa, poi tornare indietro e trovarlo pulito era frustrante. – devth

+1

Purtroppo questo non funziona in MacVim. Non ho esaminato il motivo, anche se è sulla lista delle cose da fare. :) –

+0

Lo hai mai capito? Sto avendo lo stesso problema! – ELLIOTTCABLE