Ctrl + Spazio per il completamento omni e parola chiave in vim
-
21-08-2019 - |
Domanda
Voglio usare Ctrl + Spazio per omni-completamento (e di completamento parola chiave se non ci sono omni-completamento) in vim. Ho provato questo che ho trovato da qualche parte sul web:
inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""
tuttavia non funziona. Chi sta usando Ctrl + Spazio anche per questo che mi può mostrare il modo corretto (che funziona) per farlo?
Da notare è che ha bisogno di lavorare nella versione terminale del Vim non gvim.
Soluzione
Prova questo:
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>
Altri suggerimenti
Il modo di cui sopra è "sorta di" lavorare, ma è così illeggibile che quasi nessuno poteva dire ciò che realmente fa. La soluzione di cui sopra non è buona.
Risposta Breve - Usare questo:
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()
Questa risposta rispetta anche che ci sono due possibili valori (a seconda del terminale / utilizzo gvim) per Ctrl + Spazio: <C-Space>
e <Nul>
.
Io uso un approccio simile a quello del primo in jedi-vim , ma più personalizzabile.
Long Risposta - Che quanto sopra fa:
L'intera fuga della risposta di cui sopra è così confuso, che ho diviso la risposta di cui sopra in un formato leggibile:
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()
Questa mostra chiaramente quello che sta facendo. Ci sono alcune cose strane accadendo in Auto_complete_opened
. Non è solo facendo il completamento, che sta facendo due cose aggiuntive dopo aver tentato di completare:
- Quando si tenta di utilizzare l'omnicompletion, lo fa in qualche modo un
<C-n><C-p><C-n>
, che potrebbe essere solo IMHO abbreviato in<C-n>
. - Nel caso in cui completamento è soccombente, utilizza un backspace e fa di nuovo un completamento, non
<C-o><C-x>
ma<Down>
, che semplicemente non ha molto senso.
Non sto dicendo che questo non è quello che alcuni utenti potrebbe desiderare, ma probabilmente non è quello che la maggior parte degli utenti desidera! La mia risposta breve si che nel credito e ti dà un modo semplice per modificarlo. È ora possibile modificare facilmente le cose solo se si desidera (ad esempio <=> a <=>, se si desidera che la prima voce da scrivere fin dall'inizio su).
Per iterm2 e vim queste righe funziona per me, che ho avuto da 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>