Selecione um item na lista de preenchimento automático do vim sem inserir quebra de linha

Selecione um item na lista de preenchimento automático do vim sem inserir quebra de linha

Um recurso bastante irritante do vim é que se você estiver no modo de inserção e fizer um preenchimento automático (Ctrl-N), pressione a tecla de seta para baixo até o item desejado e pressione a tecla Enter, ele insere o item, mas também insere uma nova linha que você então tem que deletar.

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

Responder1

Depende do estado do menu pop-up em que você se encontra (consulte :help popupmenu-completion). Entendo pela sua pergunta que você está no estado 2 (já que pressionou as teclas de seta para encontrar uma conclusão). No entanto, o comportamento padrão Enterno 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 funciona de forma consistente em todos os estados é usar Ctrl+ Y. Gosto de lembrar que o Y significa "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+ Epara cancelar o menu e deixar o texto como estava antes de invocá-lo. Se você está acostumado com os pares de Ctrl+ Ee Ctrl+ Yem outros contextos (por exemplo, para rolar 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. Acho que você também pode pensar nisso como "sair" do menu ou algo semelhante.

Veja :help popupmenu-keyspara mais.

Responder2

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 oPlug-in CtrlPpode achar esse mapeamento conveniente.

Responder3

Eu sei que isso é antigo, mas meio que está apoiado na resposta de geedoubleya, pois embora a resposta de echristopherson tenha sido informativa e incrível, se alguém quiser uma solução rápida e suja:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))

Responder4

Como alternativa ao uso das teclas de seta, ative as teclas j& kpara rolar pela lista de preenchimento automático.

Isso altera a linha atual para corresponder à palavra selecionada conforme 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 isto 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 simplesmente repetir o Ctrl-nque irá percorrer as opções ( Ctrl-ppara voltar) e substituir a linha atual conforme ela se move, sem necessidade de Entermapeamentos de teclas do vim.

informação relacionada