Come posso eliminare più righe in vi?


129

Ho provato a seguire quanto segue:

Come eliminare il testo selezionato nell'editor VI

ma

5dd

E492: Non un comando dell'editor: 5dd

Ho quindi provato:

5d

Che elimina solo una singola riga. Come posso eliminare più righe?


2
Per quanto ricordo, 5dd dovrebbe essere una sintassi valida e dovrebbe eliminare 5 righe a partire da quella su cui si trova il cursore. C'è qualche possibilità che BLOC MAIUSC sia attivo e usi un layout di tastiera che fa spostare i tasti numerici quando è?
Eric J.

Risposte:


132

Sembra che tu stia inserendo i comandi in modalità di comando (alias "Ex mode"). In quel contesto :5drimuoverebbe la riga numero 5, nient'altro. Per 5ddfunzionare come previsto, ovvero rimuovere cinque righe conseguenti a partire dal cursore - immetterlo in modalità normale e non aggiungere il prefisso ai comandi :.



142

Puoi eliminare più righe (intervallo) se conosci i numeri di riga:

:[start_line_no],[end_line_no]d

Nota: d sta per cancellazione

dove
start_line_no è la riga iniziale no che si desidera eliminare e end_line_no è la riga finale no che si desidera eliminare. Le linee tra l'inizio e la fine, incluso l'inizio e la fine, verranno eliminate.

Per esempio:

:45,101d

Le righe tra 45 e 101, comprese 45 e 101, verranno eliminate.


14
Puoi usare anche $per indicare l'ultima riga nel file. Quindi :45,$deliminerei ogni riga da 45 fino alla fine.
Freethebees,

Puoi anche usare Pattern come/<\/div>/
Björn

1
Se vuoi iniziare il range dal lne in cui ti trovi attualmente puoi farlo:.,[end_line_no]d
Joe

15

Comandi elencati per l'uso in modalità normale (prefisso con :per modalità di comando).
Testato a Vim.

Per importo riga:

  • numdd : elimina le linee num DOWN in conteggio iniziale dalla posizione corrente del cursore (ad es. 5ddelimina la riga corrente e 4 righe al di sotto di essa => elimina la riga corrente e ( num-1 ) le righe sottostanti )
  • numdk : cancella le linee numerica SU dalla linea corrente e la linea corrente stessa (ad es. 3dkelimina la linea corrente e 3 linee sopra di essa => elimina la linea corrente e le linee numerica sopra di essa )

Per numero di riga:

  • dnumG : eliminerà le righe dalla riga corrente (inclusiva) UP al numero di riga num (inclusivo) (ad es. se il cursore si trova attualmente sulla riga 5 d2Geliminerà le righe 2-5 incluse)
  • dnumgg : eliminerà le righe dalla riga corrente (inclusiva) GIÙ al numero della riga num (inclusiva) (ad es. se il cursore si trova attualmente sulla riga 2 d6ggeliminerà le righe 2-6 incluse)
  • ( solo modalità comando ) :num1 ,num2d : eliminerà il numero di riga num1 (incluso) GIÙ fino al numero di riga num2 (compreso) . Nota: se num1 è maggiore di num2 - vim reagirà conBackwards range given, OK to swap (y/n)?

1
Questo mi ha aiutato perché non mi rendevo conto che num 'd' 'd' stava cercando di eliminare sotto il cursore. Ho avuto il mio cursore in fondo al file cercando di eliminare le linee sopra il mio cursore! grazie per l'aiuto!
Jonathan Chad Faling,

Eliminazione tramite lino numero: ': <start>, $ d' verrà eliminato fino alla fine del file.
Devolus

11

Se preferisci un metodo in modalità non visiva e riconosci i numeri di riga, vorrei suggerirti un altro modo semplice.

Esempio

Voglio eliminare il testo dalla riga 45 alla riga 101.

Il mio metodo suggerisce di digitare un comando di seguito in modalità comando:

45Gd101G

Si legge:

Vai alla riga 45 ( 45G) quindi elimina il testo ( d) dalla riga corrente alla riga 101 ( 101G).

Nota che vimpotresti usare ggal posto di G.

Confronta con la risposta di @Bonnie Varghese che è:

:45,101d[enter]

Il comando sopra riportato dalla sua risposta richiede 9 volte la digitazione incluso enter, dove la mia risposta richiede 8-10 volte la digitazione. Pertanto, una velocità del mio metodo è comparabile.

Personalmente, io preferisco 45Gd101Gsopra :45,101dperché mi piace bastone per la sintassi del comando del VI, in questo caso è:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "taglia" cinque righe

Di solito lancio semplicemente il numero nel mezzo come:

d7l = cancella 7 lettere


7

Premi il Esctasto per assicurarti di non essere in una modalità di modifica. Posiziona il cursore sulla prima riga da eliminare. Enter :5dd. La riga corrente e le quattro righe successive devono essere eliminate.

In alternativa, se hai attivato la numerazione delle righe ...

Premi il Esctasto per assicurarti di non essere in una modalità di modifica. Inserisci :#,#ddove '#' indica i numeri di riga iniziale e finale da eliminare.


Non credo che funzioni con i due punti all'inizio.
Emarginato il

@PoeteMaudit Questi sono comandi vi validi. I due punti inducono vi a spostare il cursore nella parte inferiore dello schermo e ad accettare un comando dell'editor di linea.
Kenster,

5
  1. Esc per uscire dalla modalità di inserimento
  2. :1enter vai alla riga 1 (sostituisci '1' con la riga che ti interessa)
  3. 5dd elimina 5 righe (dalla riga corrente)

Digitare (per righe numerate).:set number


3

Se si desidera eliminare un intervallo DOPO un trigger di linea specifico, è possibile utilizzare qualcosa del genere

:g/^TMPDIR/ :.,+11d

Ciò elimina 11 righe (incluse) dopo ogni incontro di ^TMPDIR.


0

è dxd, non ddx

se si desidera eliminare 5 righe, spostare il cursore all'inizio della prima riga per eliminare e d5d


0

Per cancellare tutte le linee usate - ESC gg dG Per cancellare alcune righe diciamo 5 quindi usate ESC 5dd


-1

Potrebbe essere fatto come segue ..

  1. Posiziona il cursore nel punto che desideri eliminare.
  2. Premere "v" per iniziare la selezione visiva.
  3. Porta il cursore nella posizione che desideri eliminare usando il tasto freccia.
  4. Premi "d" che cancellerà le righe.
  5. Ora salva ed esci usando ": x!"
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.