2010-06-03 9 views
6

Me gusta que mi vim se ponga en el modo de comando tan a menudo como sea posible. Creo que perder el enfoque sería un buen evento para que eso suceda. Todo lo que encontré es para ahorrar en el enfoque perdido.Vim: volver al modo de comando cuando se pierde el foco

Me gustaría que vuelva automáticamente al modo cmd al cambiar las pestañas en macvim o cuando cmd + tabbing a otra aplicación.

+0

hay una pregunta duplicado y contestar en superusuario: http://superuser.com/questions/236534/change -to-normal-mode-when-macvim-goes-background – rubiii

Respuesta

16

La siguiente autocommand sería la elección "obvia".

au FocusLost,TabLeave * stopinsert 

Lamentablemente, parece que solo funciona correctamente para TabLeave. El evento FocusLost se está disparando, pero por algún motivo el comando stopinsert no entra en vigencia hasta que se reciba un evento clave una vez que Vim haya recuperado el foco.

En su lugar, puede aprovechar el feedkeys y el "¡Lléveme al modo normal sin importar qué!" key combo:

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

El único inconveniente es que requiere al menos feedkeys() Vim 7. Esto no debería ser un gran problema, sin embargo, ya Vim 7 fue lanzado en 2006.

+0

Perfecto, gracias! – devth

+0

Cool- nunca se supo acerca de 'Ctrl - \ _ Ctrl-N'. Tenía la línea stopinsert en mi vimrc, pero siempre me molestaba el hecho de que tomaba un carácter más cuando volvía al buffer ...: wq –

+0

Hubiera comentado, pero mi comentario viene con el formateo. Vea abajo. :) Debo agradecer a @jamessan por su orientación sobre esto. –

7

yo hubiera añadido una comenta, pero no puedo formatear la solución.

La solución de feedkeys es genial, con el pequeño enganche que SIEMPRE vuelve al modo normal, independientemente de en qué otro modo esté. No quiero cancelar el modo de línea de comando (para arrastrar & soltar archivos en Windows) y no necesito cancelar el modo visual, solo quería cancelar el modo de inserción.

La solución, entonces, aparece como:

autocmd FocusLost * call PopOutOfInsertMode() 

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

En otras palabras, sólo se salga si usted está en un modo de inserción. Esto podría refinarse aún más, ya que v: insertmode será 'i' en "inserción normal", 'r' en el modo Reemplazar y 'v' en el modo de Reemplazo Virtual. Para mí, saltar independientemente es bueno, pero el usuario puede querer editar para adaptarse.

Si esto no funciona para usted en MacVim, sustituir el contenido de PopOutOfInsertMode con:

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

¡Gracias por la información adicional! Descubrí el mismo problema con la solución original. Hacer tapping mientras estaba en el modo comando para buscar algo y luego regresar y encontrarlo despejado fue frustrante. – devth

+1

Lamentablemente, esto no funciona en MacVim. No he investigado por qué, aunque está en la lista de cosas que hacer. :) –

+0

¿Alguna vez resolvió esto? ¡Estoy teniendo el mismo problema! – ELLIOTTCABLE

Cuestiones relacionadas