Ctrl+Espacio para completar omni y palabras clave en vim
-
21-08-2019 - |
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.
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>