Come cercare le linee che corrispondono alla linea corrente in vim


11

Di solito cerco parole per :/string, ma se devo cercare l'intera riga corrente, come farlo.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Ad esempio, se cursorè attualmente su line 1come cercare in modo simile come :/per il testo contenente l'intera riga corrente. Il cursore dovrebbe passare quindi alla corrispondenza line 4e di nuovo aline 7

Risposte:


7

Ecco come lo farei:

  1. Sposta la linea (nel registro senza nome), senza includere la nuova riga alla fine: 0y$
  2. Inizia una ricerca molto nomagica :/\V
  3. Aggiungi la linea strappata: <c-r>"
  4. Spegni la ricerca: <cr>

Come sottolinea @EvergreenTree in un commento , puoi ovviamente creare una mappatura per eseguire tutti i passaggi in una volta sola:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Argomenti della guida pertinenti:

:help registers
:help /magic
:help c_CTRL-R

NB Se la linea che stai cercando contiene barre rovesciate, dovrai comunque attraversarle e sfuggirle (aggiungendo un'altra barra rovesciata), anche con una ricerca molto nomagica .


4
Naturalmente, puoi anche creare una mappatura per questo: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

Soprattutto per scopi di mappatura, trovo che sia getline()più elegante che fare lo strappo da soli. La chiamata getline()con una stringa '.'restituisce la linea sotto il cursore. Esistono due buone opzioni per l'utilizzo di questo:

:exec '/' . getline('.')

che analizza le stringhe '/'e ciò che viene restituito getline()insieme e lo esegue come comando vim.

o

/<C-r>=getline('.')<CR>

che utilizza il registro delle espressioni @=. L'espressione seguente =viene valutata dopo la prima <CR>e posizionata nella riga di comando.


Bello! Quando la riga contiene caratteri simili /o 'non funziona molto bene. Comunque, imparo qualcosa oggi! Grazie
Luc M

4

Personalmente otterrei un plug-in Visual Star ( ce ne sono pochi là fuori ). C'è un bel Vimcast su questo: Cerca il testo selezionato . Ciò significa che è possibile selezionare visivamente la linea e quindi premere *.

Se un plug-in non fa per te, puoi aggiungere il seguente mapping al tuo vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Nota: Visual-block ( <c-v>) non è supportato per questo mapping.


Ho aggiunto i mapping, ma in realtà sta saltando alla prima parola corrispondente e NON selezionando l'intera riga.
manav mn,

Se corrisponde a una parola, suppongo che si stia utilizzando *dalla modalità normale o che la mappatura non sia installata correttamente.
Peter Rincker,

4

Tutte le risposte esistenti hanno esito negativo se la linea contiene determinati elementi interpretati come parte di un modello. Il \Vpunto arriva in gran parte lì ma continua a incasinare la barra rovesciata.

Prova questo per sfuggire alle barre rovesciate ...

/\V<C-R>=escape(getline('.'), '\')

E poi se lo stai usando in una mappatura avrai bisogno di uno o due <Enter>secondi alla fine a seconda di come vuoi che funzioni.


Risposta eccellente! Le linee contengono spesso entrambi i tipi di barra che confondono le altre risposte. Quest'ultimo argomento di fuga dovrebbe includere anche una barra:escape(…, '/\')
bobbogo,

2

Con vim-asterisk installato basta usare V$*(o 0v$*) per selezionare la linea corrente e cercarla.

Nel secondo comando 0non è necessario se il cursore si trova già all'inizio della riga.


1
Non *cerca solo la parola sotto il cursore e non l'attuale selezione visiva?
EvergreenTree

1
@EvergreenTree Ho dimenticato di menzionare il plugin. Grazie per l'avviso
adelarsq,

2

Un altro modo per farlo è utilizzare la finestra della riga di comando: yy/<Ctrl-F>p<Enter>

  • Tieni tutta la linea di cui hai bisogno yy
  • Premi /e poi Ctrl-F per aprire la finestra della riga di comando
  • Premere pper incollare la linea
  • Premi Invio per iniziare la ricerca

5
Puoi anche usare q/per ottenere lo stesso effetto di/<c-f>
evilsoup il

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.