Come posso ottenere 'n' per andare avanti anche se ho iniziato a cercare con '?' o '#'?


19

Vim ha (almeno) due serie di comandi che cercano in direzioni opposte. Digitando /e quindi un motivo si cercherà in avanti nel documento per il motivo; digitando ?e quindi un modello cercherà all'indietro. La stessa relazione esiste tra i comandi *e #.

Quello che non mi piace è che questi comandi impostano anche la direzione di ricerca per i comandi ne N. Dopo l'uso /, nprocede attraverso il documento e Ntorna indietro; dopo l'uso ?, nva indietro e Nva avanti. (In altre parole, nva sempre nella stessa direzione della ricerca originale e Nva sempre nella direzione opposta.)

Come posso nandare avanti attraverso il documento e Nandare indietro, indipendentemente dalla direzione in cui ho iniziato la ricerca?

Risposte:


29

È possibile modificare il comportamento ne la Nricerca in modo coerente verso il basso / verso l'alto utilizzando quanto segue:

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

Aggiornamento: come funziona?

Questo utilizza le mappe delle espressioni, che mappano i valori lhs della mappa su un'espressione che verrà valutata, ogni volta che si incontra lhs. Vedi :h map-expressionin aiuto.

Quello che succede è che la variabile v: searchforward (che determina lo stato interno di quale direzione era l'ultima ricerca, vedi :h v:searchforward) viene usata come indice per la stringa di fronte. Quindi, nel caso della prima mappa, se l'ultima direzione di ricerca era in avanti, la n sarà mappata su 'n' (indice di 1, che significa restituire il secondo carattere) e se era all'indietro, la 'n' sarà mappata su 'N' (perché la variabile v: searchforward è 0 e quindi la 'N' verrà restituita.

Un modo alternativo per scrivere quelle mappe sarebbe (che potrebbe essere più chiaro):

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

Ci sono anche alcuni plugin, che lo fanno (cioè il plugin SearchRepeat e possibilmente anche altri).


Grazie per aver menzionato il mio plugin; Stavo per consigliarlo in alternativa :-)
Ingo Karkat

2
Uso intelligente dell'abbonamento!
mercoledì

6
Potresti per favore aggiungere una spiegazione? Non ho mai visto questa sintassi prima e vorrei sapere come funziona.
EvergreenTree

1
@EvergreenTree: aggiunte altre spiegazioni
Christian Brabandt,

2
@ChristianBrabandt È molto intelligente. Non ho mai pensato di usare v:searchforwardcome indice.
EvergreenTree

1

Sulla base della soluzione di Christian Brabandt che mi è venuta in mente

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

Queste mappature obbediscono anche foldopenall'impostazione


0

Sto usando il plugin SearchIndex . Per utilizzare la risposta di Christian Brabandt ma mantenere la funzionalità del plug-in di visualizzare il numero di corrispondenza ogni volta che scrivo no N, inserisco questo nel mio vimrc:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.