Pregunta

Quiero usar Control+Espacio para omnicompletado (y finalización de palabras clave si no hay omnicompletado) en vim.Probé esto que encontré en algún lugar de la web:

inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""

sin embargo no funciona.Cualquiera que esté usando Control+Espacio Para esto también, ¿quién puede mostrarme la forma correcta (que funciona) de hacerlo?

Vale la pena señalar que debe funcionar en la versión terminal de vim, NO en gvim.

¿Fue útil?

Solución

Prueba esto:

inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\\<lt>c-n>\\<lt>c-p>\\<lt>c-n>\" :" .
\ "\" \\<lt>bs>\\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>

Otros consejos

La forma anterior "más o menos" funciona, pero es tan ilegible que casi nadie podría decir qué hace realmente. La solución anterior no es buena.

Respuesta corta: use esto:

function! Auto_complete_string()
    if pumvisible()
        return "\<C-n>"
    else
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end
endfunction

function! Auto_complete_opened()
    if pumvisible()
        return "\<Down>"
    end
    return ""
endfunction

inoremap <expr> <Nul> Auto_complete_string()
inoremap <expr> <C-Space> Auto_complete_string()

Esta respuesta también respeta que hay dos valores posibles (dependiendo del uso del terminal/gvim) para Ctrl+Espacio: <C-Space> y <Nul>.

Utilizo un enfoque similar al primero en jedi-vim, pero más personalizable.


Respuesta larga: qué hace lo anterior:

Todo el escape de la respuesta anterior es tan confuso que he dividido la respuesta anterior en un formato legible:

function! Auto_complete_string()                               
    if pumvisible()                                            
        return "\<C-n>"                                        
    else                                                       
        return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
    end                                                        
endfunction                                                    

function! Auto_complete_opened()                               
    if pumvisible()                                            
        return "\<c-n>\<c-p>\<c-n>"                            
    else                                                       
        return "\<bs>\<C-n>"                                   
    end                                                        
endfunction                                                    

inoremap <expr> <Nul> Auto_complete_string()

Esto muestra claramente lo que está haciendo.Están sucediendo algunas cosas raras en Auto_complete_opened.No se trata solo de completar, sino de hacer dos cosas adicionales después de intentar completar:

  • Al intentar utilizar la omnicompleción, de alguna manera hace un <C-n><C-p><C-n>, que en mi humilde opinión podría abreviarse como <C-n>.
  • En caso de que la finalización no tenga éxito, utiliza un retroceso y completa nuevamente, no <C-o><C-x> pero <C-n>, lo cual simplemente no tiene mucho sentido.

No estoy diciendo que esto no sea lo que algún usuario podría querer, ¡pero probablemente no sea lo que la mayoría de los usuarios quieren!Mi respuesta breve toma eso en crédito y le brinda una forma sencilla de editarlo.Ahora puedes cambiar cosas fácilmente si lo deseas (por ejemplo <Down> a <C-n>, si desea que la primera entrada se escriba desde el principio).

Para iterm2 y vim estas líneas funciona para mí, que me dieron de jedi-vim

" Next three lines are to enable C-Space to autocomplete, omnicomplete
inoremap <C-Space> <C-x><C-o>
imap <buffer> <Nul> <C-Space>
smap <buffer> <Nul> <C-Space>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top