2012-03-22 14 views
5

Nel manuale online di Vim, :help DiffOrig mostrerà la sequenza di comando consigliata per ottenere le modifiche del file di modifica corrente.Perché utilizzare 0d_ in DiffOrig in Vim?

Eccolo:

command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis 
        \ | wincmd p | diffthis 

Mi chiedo che l'effetto di 0d_ è. Ho provato 0d_ in modalità normale, funziona come dd, ma non riesco a capire perché usato qui.

+4

La tua rovina qui sta pensando che '0d_' è un comando di modalità normale quando in realtà è un comando ex. Qualunque cosa in una pipeline come quella sarà sempre un comando ex. Quello che viene effettivamente eseguito qui è simile a ': 0delete _' se questo lo rende chiaro. –

+1

Aggiunta al commento di @RandyMorris: se hai bisogno di suonare le battiture in modalità normale in modalità ex puoi usare ': norm' (e coniugare con': exec' per legarlo): questo è più o meno equivalente a '... | exec 'norm gg "_dd' | diffthis | ...'. – Benoit

+0

@Randy Morris, Grazie. Ho sbagliato a pensare che sia un comando in modalità normale in realtà. – longbowk

risposta

8

Spieghiamo un po ': Supponiamo di avere foo.txt originale contenente (con i numeri di linea):

1 a 
2 c 
3 d 
~ 

Hai aggiunto una riga contenente “b” tra le linee 1 e 2:

  • :vert new crea una nuova, vuota, buffer in una divisione verticale (:help :new)
  • :set bt=nofile rende un buffer zero (:help 'bt'). Nota:

    1 a | 1 ·<cursor here 
    2 b | ~ 
    3 c | ~ 
    4 d | ~ 
    ~ | ~ 
    
  • :r # inserti dopo riga corrente, il contenuto del file alternativo (#), come memorizzati nel file system. Non hai salvato l'altro buffer, in modo da ottenere il contenuto originale. (:help alternate-file).
    :help :r ti dice che inserisce sempre dopo. Pertanto:

    1 a | 1 
    2 b | 2 a 
    3 c | 3 c 
    4 d | 4 d 
    ~ | ~ 
    
  • :0d_ rimuove la prima linea. Perchè 0, non lo so davvero, vorrei piuttosto scrivere :1d_. :help range dice:

    Quando si utilizza un 0 (zero) questo viene interpretato come 1 dalla maggior parte dei comandi

    Il _ specifica che va al registro buco nero. Vedere :help :d sul comando ex :d, funziona in linea.

Il resto è ovvio.

+1

TL; DR ": 0d_ rimuove la prima riga" - il resto è ovvio :) +1 – sehe

+0

@sehe: TL; DR ': 0d_' rimuove la prima riga perché': r' ha inserito il contenuto del file originale sotto una riga vuota. – Benoit

+0

Grazie a entrambi, cancella la prima riga in nero -hole registro. – longbowk

Problemi correlati