Solo voy a abordar la pregunta (1).
Tu problema es KEYTIMEOUT. Cito de zshzle (1):
Cuando ZLE está leyendo un comando desde el terminal, puede leer un
secuencia que está vinculada a algún comando y también es un prefijo de una
cuerda unida más larga. En este caso ZLE esperará un cierto tiempo para ver.
si se escriben más caracteres, y si no (o no coinciden con ninguno)
cadena más larga) ejecutará el enlace. Este tiempo de espera está definido
por el parámetro KEYTIMEOUT; su valor predeterminado es 0.4 seg. No hay
timeout si la cadena de prefijo no está vinculada a un comando.
Ese 0.4s es el retraso que estás experimentando después de presionar ESC. La solución es establecer KEYTIMEOUT hasta 0.01s en uno de los archivos de inicio del shell:
export KEYTIMEOUT=1
Desafortunadamente, esto tiene un efecto en cadena: otras cosas comienzan a ir mal ...
En primer lugar, ahora hay un problema en el modo de comando vi: escribir ESC hace que el cursor se bloquee, y luego el carácter que escriba a continuación se traga. Esto se debe a que ESC no está vinculado a nada de forma predeterminada en el modo de comando vi, pero hay widgets de múltiples caracteres que comienzan con ESC (teclas de cursor). Así que cuando presionas ESC, ZLE espera al siguiente personaje ... y luego lo consume.
La solución es vincular ESC a alguna cosa en modo comando, asegurando así que la alguna cosa se pasa a ZLE después de $ KEYTIMEOUT centisegundos. Ahora podemos mantener los enlaces que comienzan con ESC en modo de comando sin estos efectos negativos. Asilo ESC al carácter de campana, que me parece incluso menos intrusivo que el autoinserto (y mi shell está silenciado):
bindkey -sM vicmd '^[' '^G'
Actualización 2017:
Desde entonces he encontrado una solución aún mejor para unir el ESC: el undefined-key
widget No estoy seguro de si este widget estaba disponible en zsh cuando escribí esta respuesta originalmente.
bindkey -M vicmd '^[' undefined-key
Problema siguiente: hay, por defecto, algunos widgets de dos teclas que comienzan en ^ X en el modo de inserción vi; estos se vuelven inutilizables si $ KEYTIMEOUT se establece completamente. Lo que hago es desenlazar ^ X en el modo de inserción vi (se inserta automáticamente de forma predeterminada); Esto permite que los widgets de dos teclas sigan funcionando.
bindkey -rM viins '^X'
Pierde el enlace de autoinserción, pero puede enlazarlo a otra cosa, por supuesto. (No lo hago, ya que no tengo uso para ello).
El último problema (lo he encontrado hasta ahora): quedan algunas combinaciones de teclas predeterminadas que "perdemos" debido a que configuramos $ KEYTIMEOUT a la derecha, a saber: aquellos que comienzan con ESC en el modo de inserción vi, que son no teclas de cursor Yo personalmente los reviento para comenzar con ^ X en su lugar:
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
Actualización 2018:
Resulta que la sección completa anterior (después de "Actualización 2017") no es necesariamente requerida. Es posible configurar la clave META para que sea equivalente a ESC en asignaciones de teclado usando:
bindkey -mv
Por lo tanto es posible no para desenlazar ^ X, y para acceder a las combinaciones de teclas que comienzan en ESC presionando META como líder (ALT o OPT en los teclados modernos).
Si tienes acceso al libro. De Bash a Z Shell por Kiddle et al., la equivalencia de ESC y META en las combinaciones de teclas se analiza en la barra lateral del Capítulo 4 en las páginas 78–79.
i
dos veces para volver al modo de inserción, recomiendo altamente esta ¡fijar!