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.