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

22

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 seta para baixo até o item desejado e pressione a tecla Enter; depois, ele insere o item, mas também insere uma nova linha. então tem que excluir.

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

Tyler Durden
fonte
11
Não é assim que funciona para mim ... seleciono algo, pressione Enter e o cursor continua na mesma linha depois.
Goldilocks

Respostas:

37

Depende do estado do menu pop-up em que você está (consulte :help popupmenu-completion). Entendemos 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 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 consistentemente em todos os estados é usar Ctrl+ Y. Eu gosto de lembrar o Y como "sim, aceite essa palavra". Também é possível simplesmente começar a digitar o texto que deve vir após a palavra concluída, 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 seu 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. Eu acho que você também pode pensar nisso como "sair" do menu ou similar.

Veja :help popupmenu-keyspara mais.

echristopherson
fonte
2
Ah, isso faz sentido. Eu tenho usado Ctrl-N para abrir o menu suspenso. Acabei de usar as teclas de seta para navegar no menu suspenso. Eu não sabia que você poderia usar as setas do teclado para abrir o menu suspenso.
Tyler Durden
As teclas de seta não podem abrir o menu suspenso, na configuração padrão. A distinção que mencionei foi sobre a navegação no menu depois que ele foi aberto.
Echristopherson
Por alguma razão, quando tentei fazer isso com <kbd> Ctrl </kbd> + <kbd> Y </kbd>, também recuou a linha, o que é indesejável. Alguma idéia de por que isso aconteceria?
mpacer
Eu nunca encontrei isso. Talvez seja devido a alguma configuração de recuo ou a um plugin que você tenha esquecido. Gostaria de perguntar na lista de discussão do Vim: vim.org/maillist.php .
Echristopherson
6

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 plug-in CtrlP pode achar esse mapeamento conveniente.

Dmitrii
fonte
3

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

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

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

Fazer isso altera a linha atual para corresponder à palavra selecionada enquanto 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 em 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 apenas repetir o Ctrl-nque amaldiçoará através das opções ( Ctrl-ppara retroceder) e substituir na linha atual conforme ela se move, sem necessidade de Entermapeamentos de teclas ou vim.

geedoubleya
fonte
Esse comportamento pode ser um pouco confuso, pois é 1) no modo de inserção e 2) interpretando j e k para fazer coisas que não fazem no modo de inserção. Em particular, você não pode selecionar uma entrada de menu e segui-la diretamente com algo que comece com j ou k.
Echristopherson
Concordo, é por isso que forneci a outra opção, se este foi um passo longe demais. Pessoalmente, eu preferiria a confusão do que mover minha mão para usar as flechas.
geedoubleya