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

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

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

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

Respuesta1

Depende del estado del menú emergente en el que se encuentre (ver :help popupmenu-completion). Entiendo por tu pregunta que estás en el estado 2 (ya que presionaste las teclas de flecha para encontrar una finalización). Sin embargo, el comportamiento predeterminado para Enterel estado 2 es insertar la finalización sin nueva línea; lo que usted 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 simplemente 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, puedes presionar Ctrl+ Epara cancelar el menú y dejar tu texto como estaba antes de invocarlo. Si está acostumbrado a los emparejamientos 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 insertar), esa es una forma de recordarlo aquí. Supongo que también podrías considerarlo como "salir" del menú o similar.

Ver :help popupmenu-keyspara más.

Respuesta2

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 utilice elComplemento CtrlPPuede que este mapeo le resulte conveniente.

Respuesta3

Sé que esto es antiguo, pero es una especie de respaldo a 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>"))

Respuesta4

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

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

Por lo tanto, no es necesario que presione Intro 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 simplemente repetir lo Ctrl-nque recorrerá las opciones ( Ctrl-ppara retroceder) y sustituir en la línea actual a medida que se mueve, sin necesidad de Enterasignaciones de teclas vim.

información relacionada