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?


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.


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.


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.