Selecione um item na lista de autocompletar do vim sem inserir quebra de linha

18

Um recurso bastante irritante do vim é que se você estiver no modo de inserção e realizar um autocomplete (Ctrl-N), tecla de seta para o item desejado e pressionar a tecla Enter, insere o item, mas também insere um nova linha que você terá que deletar.

Existe uma maneira de selecionar um item fora da lista de preenchimento automático sem obter uma nova linha indesejada adicional?

    
por Tyler Durden 16.10.2014 / 16:57

4 respostas

29

Depende de qual estado do menu popup você está (veja :help popupmenu-completion ). Eu entendo pela sua pergunta que você está no estado 2 (desde que você pressionou as teclas de seta para encontrar uma conclusão). No entanto, o comportamento padrão para Enter no estado 2 é inserir a conclusão sem nova linha; o que você descreve é normalmente o comportamento do estado 1 (que é quando você usa Ctrl + N / Ctrl + P .)

Uma maneira que funcione consistentemente em todos os estados é usar Ctrl + Y . Eu gosto de lembrar o Y como sendo "sim, aceite essa palavra". Também é possível começar a digitar o texto que deve vir após a palavra completa, a menos que você tenha remapeado as coisas como na resposta de geedoubleya.

No mesmo contexto, você pode pressionar Ctrl + E para cancelar o menu e deixar seu texto como estava antes de invocá-lo. Se você está acostumado com os pares de Ctrl + E e Ctrl + Y em outros contextos (por exemplo, role para cima ou para baixo no modo normal, ou para inserir o caractere abaixo ou acima do cursor no modo de inserção), essa é uma maneira de lembrá-lo aqui. Eu acho que você também pode pensar nisso como "sair" do menu ou similar.

Veja :help popupmenu-keys para mais.

    
por 16.10.2014 / 21:22
2

Como alternativa ao uso das teclas de seta, ative seu j & k para percorrer a lista de preenchimento automático.

Isso altera a linha atual para corresponder à palavra selecionada à medida que você rola.

Portanto, você não precisa pressionar enter, pois o cursor ainda está no modo de inserção no final da palavra substituída.

Para habilitar isso, adicione isso ao seu .vimrc (Obrigado a outros no stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Separadamente, em vez de usar as teclas de seta, você pode repetir o Ctrl-n , que praguejará pelas opções ( Ctrl-p para voltar) e substituirá a linha atual conforme a movimentação, sem necessidade de Enter ou mapeamentos de chave vim.

    
por 16.10.2014 / 18:00
1

Eu sei que isso é antigo, mas meio que se apoiando na resposta de geedoubleya, já que a resposta de echristopherson foi informativa e impressionante, se alguém quiser uma solução rápida e suja:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
    
por 01.01.2017 / 07:04
1

Pessoalmente eu uso este:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

Qualquer pessoa que use o plugin CtrlP pode achar esse mapeamento conveniente.

    
por 21.03.2017 / 10:15