Comprensione delle differenze di riferimento di linea attraverso: g / ^ / norm e attraverso:% norm


8

Diciamo che ho il seguente file molto semplice

a
b
c
d
e

e ho deciso che volevo aggiungere righe vuote dopo ogni riga. Diversi metodi diversi mi saltano immediatamente in mente. Potremmo semplicemente farlo (e quindi abbracciare il fallimento). Potremmo registrare una macro come qqo<ESC>jqe ripeterla più volte.

Altri due metodi mi sembravano più ovvi in ​​quel momento.

In primo luogo, ho pensato di emettere il :normcomando osu ogni riga. Quindi corro :%norm o. Ma ciò che realmente accade è che otteniamo 5 righe vuote, seguite dalle linee non separate come sopra. Interpreto questo per dire che %norm, in realtà, vim rileva il problema del messaggio il seguente comando normale sulle prime cinque righe di questo file di cinque righe . Il ocomando crea una nuova riga e vim è "stupido", nel senso che fa riferimento per numero di riga e non effettivamente da qualche altro identificatore.

Bene, ero imbarazzato. Sicuro. Ho provato alcune altre cose per vedere se potevo far funzionare il metodo sopra, ma purtroppo non ci sono riuscito. Per curiosità, ho provato il mio altro metodo di applicazione di massa preferito. Questo mi ha portato a provare :g/^/norm o. Con mia sorpresa, questo funziona bene! Quindi, ai miei occhi, sembra che vim non sia "stupido" qui come sopra e fa riferimento a righe per più del semplice numero di riga.

Cosa sta succedendo esattamente?


2
Su un lato nota: si può anche fare in questo modo: :%s/$/\r/, o come questo: :%s/\n/\r\r/. L'asporto è che le nuove righe possono essere abbinate \n, ma devono essere scritte come \rnei valori di sostituzione.
lcd047,

Risposte:


9

Bene, %è una scorciatoia per 1,$(un intervallo dalla prima riga all'ultima). Da :he :%:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

E per :global:

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

Quindi, il primo caso è come attraversare un elenco mentre lo si modifica, quindi un contatore sugli elementi dell'elenco diventa non valido. Nel secondo caso, contrassegniamo gli elementi che vogliamo scegliere come target in un passaggio, in modo che anche se l'elenco viene modificato nel secondo passaggio, sappiamo ancora su quali elementi vogliamo lavorare.


Ah, è anche nel file di aiuto per globale. Sono sciocca. Grazie
davidlowryduda,

man - the g è eccessivamente folle utile. devo passare più tempo per passare da un utente vi medio a un utente
esperto
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.