Como posso centralizar automaticamente o primeiro resultado da pesquisa?

7

Quero ter o primeiro resultado da pesquisa centralizado na tela. Eu sei sobre :nnoremap n nzzmapeamento, mas ele só funciona para centralizar as próximas partidas, não a primeira.

Eu pensei que talvez pudesse usar algum AutoCmd, mas não encontrei um evento apropriado.

Jan Warchoł
fonte

Respostas:

14

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 zzapó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>'
statox
fonte
3
Talvez getcmdtype() =~ '[?/]'fosse um pouco mais fácil.
Antony
@Antony De fato isso é muito melhor, editei minha resposta. Obrigado!
statox
2
Impressionante! Apenas o que eu preciso, obrigado! E obrigado pelas explicações detalhadas, elas são muito úteis para aprender o vimscript.
Jan Warchoł
Recentemente, tive um problema com isso usando /como movimento: por exemplo c/search, mudará da minha posição atual para a próxima localização correspondente search, mas, por causa disso cnoremap, insira o texto zz. Pensamentos sobre uma solução alternativa ou devo remover o mapeamento?
D. Ben Knoble
11
@DavidBenKnoble, de fato, é um problema em que não pensei. Vou tentar encontrar uma solução alternativa e editar minha resposta se encontrar uma.
Statox
5

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:

Costumização

zz após a pesquisa

Coloca a correspondência atual no centro da janela.

noremap <plug>(slash-after) zz

Apenas tentei e está funcionando sem problemas nas duas direções ( /e ?).

lsrdg
fonte