Seleccione un elemento en la lista de autocompletar de vim sin insertar un salto de línea

22

Una característica bastante molesta de vim es que si está en modo de inserción y realiza un autocompletado (Ctrl-N), presione la tecla de flecha hacia abajo hasta el elemento deseado, y presione la tecla Intro, luego inserta el elemento pero también inserta una nueva línea que luego tiene que eliminar.

¿Hay alguna manera de seleccionar un elemento de la lista de autocompletar sin obtener una nueva línea adicional no deseada?

Tyler Durden
fuente
1
Esto no es así para mí ... Selecciono algo, presiono Enter y el cursor sigue en la misma línea después.
Ricitos

Respuestas:

37

Depende del estado del menú emergente en el que se encuentre (ver :help popupmenu-completion). Según su pregunta, entiendo que está en el estado 2 (ya que ha presionado las teclas de flecha para encontrar una finalización). Sin embargo, el comportamiento predeterminado para el Enterestado 2 es insertar la finalización sin nueva línea; lo que describe es normalmente el comportamiento del estado 1 (que es cuando usa Ctrl+ N/ Ctrl+ P).

Una forma que funciona de manera consistente en todos los estados es usar Ctrl+ Y. Me gusta recordar que la Y significa "sí, acepta esa palabra". También es posible comenzar a escribir el texto que debe aparecer después de la palabra completa, a menos que haya reasignado las cosas como en la respuesta de geedoubleya.

En el mismo contexto, puede presionar Ctrl+ Epara cancelar el menú y dejar el texto como estaba antes de invocarlo. Si está acostumbrado a los pares de Ctrl+ Ey Ctrl+ Yen otros contextos (por ejemplo, para desplazarse hacia arriba o hacia abajo en modo normal, o para insertar el carácter debajo o encima del cursor en modo de inserción), esa es una forma de recordarlo aquí. Supongo que también podrías pensar en ello como "salir" del menú o similar.

Mira :help popupmenu-keyspara más.

Echristopherson
fuente
2
Ah, ja, eso tiene sentido. He estado usando Ctrl-N para abrir el menú desplegable. Acabo de usar las teclas de flecha para navegar por el menú desplegable. No sabía que podía usar las teclas de flecha para abrir el menú desplegable.
Tyler Durden
Las teclas de flecha no pueden abrir el menú desplegable, en la configuración predeterminada. La distinción que mencioné fue sobre navegar por el menú una vez que se ha abierto.
echristopherson
Por alguna razón, cuando intenté hacer esto con <kbd> Ctrl </kbd> + <kbd> Y </kbd> también sangraba la línea, que no es deseada. ¿Alguna idea de por qué sucedería eso?
mpacer
Nunca me he encontrado con eso. Tal vez se deba a alguna configuración de sangría o un complemento que haya olvidado. Preguntaría en la lista de correo de Vim: vim.org/maillist.php .
echristopherson
6

Personalmente uso este:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

Cualquiera que use el complemento CtrlP puede encontrar conveniente esta asignación.

Dmitrii
fuente
3

Sé que esto es viejo, pero un poco como un respaldo en la respuesta de geedoubleya, ya que aunque la respuesta de echristopherson fue informativa e increíble, si alguien quiere una solución rápida y sucia:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
Arrendajo
fuente
2

Como alternativa al uso de las teclas de flecha, habilite las teclas j& kpara desplazarse por la lista de autocompletar.

Hacer esto cambia la línea actual para que coincida con la palabra seleccionada a medida que se desplaza.

Por lo tanto, no tiene que presionar enter ya que el cursor todavía está en modo de inserción al final de la palabra sustituida.

Para habilitar esto, agregue esto a su .vimrc (Gracias a otros en stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Por separado, en lugar de usar las teclas de flecha, puede repetir lo Ctrl-nque maldecirá a través de las opciones ( Ctrl-ppara ir hacia atrás) y sustituir en la línea actual a medida que se mueve, sin necesidad de Enterasignaciones de teclas vim.

geedoubleya
fuente
Este comportamiento puede ser un poco confuso, ya que es 1) en modo de inserción y 2) interpretar j y k para hacer cosas que no hacen en modo de inserción. En particular, no puede seleccionar una entrada de menú y luego seguirla directamente con algo que comience con j o k.
echristopherson
De acuerdo, es por eso que proporcioné la otra opción si este era un paso demasiado lejos. Personalmente, preferiría la confusión en lugar de mover la mano para usar las flechas.
geedoubleya