Como posso 'n' avançar, mesmo que comecei a pesquisar com '?' ou '#'?

19

O Vim possui (pelo menos) dois conjuntos de comandos que pesquisam em direções opostas. Digitar /e, em seguida, um padrão pesquisará o documento adiante; digitando ?e, em seguida, um padrão pesquisará para trás. O mesmo relacionamento existe entre os comandos *e #.

O que eu não gosto é que esses comandos também definem a direção da pesquisa para os comandos ne N. Após o uso /, navança no documento e Nretrocede; após o uso ?, nrecua e Navança. (Em outras palavras, nsempre segue na mesma direção da pesquisa original e Nsempre na outra direção.)

Como posso navançar no documento e Nretroceder, independentemente da direção em que comecei a pesquisar?

Bdesham
fonte

Respostas:

29

Você pode alterar o comportamento ne Npesquisar consistentemente para baixo / para cima usando o seguinte:

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

Atualização: como funciona?

Isso usa mapas de expressão, que mapeia os lhs do mapa para uma expressão que será avaliada sempre que o lhs for encontrado. Veja :h map-expressionna ajuda.

O que acontece é que a variável v: searchforward (que determina o estado interno de qual direção foi a última pesquisa, consulte :h v:searchforward) é usada como um índice para a sequência à sua frente. Portanto, no caso do primeiro mapa, se a última direção da pesquisa for encaminhada, o n será mapeado para 'n' (índice de 1, o que significa retornar o segundo caractere) e, se retroceder, o 'n' será mapeado para 'N' (porque a variável v: searchforward é 0 e, portanto, o 'N' será retornado.

Uma maneira alternativa de escrever esses mapas seria (o que pode ser mais claro):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

Existem também alguns plugins que fazem isso (por exemplo, o plugin SearchRepeat e possivelmente outros também).

Christian Brabandt
fonte
Obrigado por mencionar o meu plugin; Eu estava prestes a recomendar que como uma alternativa :-)
Ingo Karkat
2
Uso inteligente de assinatura!
precisa saber é
6
Você poderia adicionar uma explicação? Eu nunca vi essa sintaxe antes e gostaria de saber como ela funciona.
EvergreenTree
1
@EvergreenTree: Adicionado mais alguma explicação
Christian Brabandt
2
@ChristianBrabandt Isso é muito inteligente. Eu nunca pensei em você usando v:searchforwardcomo um índice.
EvergreenTree
1

Baseado na solução de Christian Brabandt, eu vim com

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

Esses mapeamentos também obedecem à foldopenconfiguração

Naumann
fonte
0

Estou usando o plugin SearchIndex . Para usar a resposta de Christian Brabandt, mas manter a funcionalidade do plug-in de exibir o número da correspondência cada vez que digito nou N, coloquei isso no meu vimrc:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
Bdesham
fonte