Question

Je veux utiliser Ctrl + Espace pour omni-complétion (et l'achèvement mot-clé s'il n'y a pas omni-complétion) dans vim. J'ai essayé ce que j'ai trouvé quelque part sur le web:

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

mais il ne fonctionne pas. Toute personne qui utilise Ctrl + Espace pour cela aussi qui peut me montrer la bonne façon (qui fonctionne) pour le faire?

A noter qu'il a besoin de travailler dans la version terminale de vim gvim pas.

Était-ce utile?

La solution

Essayez ceci:

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>

Autres conseils

La façon ci-dessus est « genre de » travail, mais il est si illisible que presque personne ne pouvait dire ce qu'il fait. La solution ci-dessus n'est pas bon.

Réponse courte - Utilisez ceci:

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()

Cette réponse respecte également qu'il existe deux valeurs possibles (dépendant du terminal / utilisation gvim) pour Ctrl + Espace: et <C-Space> <Nul>.

J'utilise une approche similaire à la première jedi-vim , mais plus personnalisable.


long Réponse - Ce que le ci-dessus:

La Escaping toute la réponse ci-dessus est si confus, que j'ai divisé la réponse ci-dessus dans un format lisible:

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()

Cela montre clairement ce qu'il fait. Il y a des trucs bizarres qui se passe dans Auto_complete_opened. Il ne suffit pas de faire la fin, il a fait deux choses supplémentaires après avoir essayé de compléter:

  • Lorsque vous essayez d'utiliser le omnicompletion, il fait en quelque sorte un <C-n><C-p><C-n>, qui pourrait être à mon humble avis juste abrégé <C-n>.
  • En fin de cas d'échec, il utilise un backspace et fait une fin encore, non, mais <C-o><C-x> <Down>, qui n'a tout simplement pas beaucoup de sens.

Je ne dis pas que ce n'est pas ce que certains utilisateur peut vouloir, mais il est probablement pas ce que la plupart des utilisateurs veulent! Ma réponse courte que prend le crédit et vous donne un moyen simple de le modifier. Vous pouvez maintenant facilement changer les choses simplement si vous voulez (par exemple à <=> <=>, si vous voulez la première entrée à écrire depuis le début sur).

Pour iterm2 et vim ces lignes fonctionne pour moi, je suis arrivé 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top