Pergunta

Eu quero usar Ctrl + Espaço para omni-conclusão (e conclusão de palavras-chave, se não houver omni-conclusão) no vim. Eu tentei isso que eu achei em algum lugar na web:

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

no entanto, ele não está funcionando. Qualquer pessoa que está usando Ctrl + Espaço para isso também que pode me mostrar o caminho correto (que funciona) para fazê-lo?

Digno de nota é que ele precisa para trabalhar na versão terminal do vim NÃO gvim.

Foi útil?

Solução

Tente isto:

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>

Outras dicas

A forma acima é "tipo de" trabalho, mas é tão ilegível que quase ninguém poderia dizer que ele realmente faz. A solução acima não é bom.

Resposta Curta - Use esta:

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 resposta também aspectos que existem dois possíveis valores (dependendo do uso / gvim terminais) para Ctrl + Espaço: <C-Space> e <Nul>.

Eu uso uma abordagem semelhante à do primeiro em jedi-vim , mas mais personalizável.


Long Resposta - O que o anterior faz:

Toda a escapar da resposta acima é tão confuso, que eu tenho dividido a resposta acima em um formato legível:

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

Esta mostra claramente o que está fazendo. Há algumas coisas estranhas acontecendo em Auto_complete_opened. Não é só fazer a conclusão, ele está fazendo duas coisas adicionais depois de tentar completa:

  • Ao tentar usar o omnicompletion, de alguma forma faz um <C-n><C-p><C-n>, o que poderia IMHO apenas ser abreviado para <C-n>.
  • No caso de conclusão não for bem sucedida, ele usa um retrocesso e faz uma conclusão novamente, não <C-o><C-x> mas <C-n>, que simplesmente não faz muito sentido.

Eu não estou dizendo que isso não é o que algum usuário pode querer, mas é provavelmente não o que a maioria dos usuários quer! Minha resposta curta leva isso em crédito e dá-lhe uma maneira simples de editá-lo. Agora você pode apenas facilmente mudar as coisas, se você quiser (por exemplo <Down> para <C-n>, se quiser que a primeira entrada a ser escrito desde o início diante).

Para iterm2 e Vim estas linhas obras para mim, eu tenho 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top