Você pode usar o seguinte mapeamento:
cnoremap <expr> <CR> getcmdtype() == '/' ? '<CR>zz' : '<CR>'
O que pode ser explicado assim:
cnoremap
Crie um mapeamento no modo de linha de comando
<expr>
O mapeamento avaliará uma expressão (permitindo usar condições)
<CR>
A chave para remapear ( Enter)
getcmdtype()
Retorna um caractere indicando qual modo de linha de comando é usado
== '/'
Será que getcmdtype()
retornou /
que significa que estamos em modo de pesquisa?
'<CR>zz'
Se estivermos no modo de busca, execute zz
após pressionar<CR>
'<CR>'
Senão executar apenas <CR>
Tópicos de ajuda relacionados:
EDITAR Observe que seria interessante criar um mapeamento que funcionasse com a pesquisa para frente e para trás, ou seja, quando getcmdtype()
retornar /
ou ?
. Aqui está o mapeamento para fazer isso:
cnoremap <expr> <CR> (getcmdtype() == '?' \|\| getcmdtype() == '/') ? '<CR>zz' : '<CR>'
Observe o escape dos |
caracteres: se eles não forem escapes, o vim entenderá cnoremap <expr> <CR> (getcmdtype() == '?'
como o primeiro comando a ser executado, seguido pelo getcmdtype() == '/') ? '<CR>zz' : '<CR>'
qual não faz sentido e cria um erro.
EDIT 2 @Antony sugeriu uma solução mais legível, graças a ele:
cnoremap <expr> <CR> getcmdtype() =~ '[/?]' ? '<CR>zz' : '<CR>'
getcmdtype() =~ '[?/]'
fosse um pouco mais fácil./
como movimento: por exemploc/search
, mudará da minha posição atual para a próxima localização correspondentesearch
, mas, por causa dissocnoremap
, insira o textozz
. Pensamentos sobre uma solução alternativa ou devo remover o mapeamento?A resposta da Statox é definitivamente a melhor até agora, mas como alternativa, eu acabei de descobrir o Vim-slash , um plugin que visa "aprimorar a experiência de pesquisa no buffer".
E a partir dele, leia-me:
Apenas tentei e está funcionando sem problemas nas duas direções (
/
e?
).fonte