vim - Come eliminare un grande blocco di testo senza contare le righe?


193

In verità, mi trovo spesso a cancellare (o copiare) grandi blocchi di testo. Si possono contare le righe di testo e dire (ad esempio) 50dddi eliminare 50 righe.

Ma come si cancellerebbe questo grande blocco di testo senza sapere quante righe cancellare?


1
Se la finestra è abbastanza grande, qui è utile la numerazione delle righe relative. Posiziona il cursore nella parte superiore della finestra, trova il numero di riga relativo dell'ultima riga da eliminare (diciamo, n), aggiungi uno, quindi digita quel numero, quindi digita dd. Ad esempio, se n = 50, allora 51dd. In alternativa, usa un comando di movimento -50d<down arrow>
BallpointBen

"Trova il numero di riga relativo" - oppure, usa :set rnue Vim lo farà immediatamente! La linea su cui ti trovi verrà comunque numerata in modo assoluto, ma le linee sopra e sotto il cursore verranno simmetricamente numerate 1, 2, ... (e aggiornarle con il movimento del cursore, eventi a livello di file, ecc.)
John P,

Risposte:


287

Non sono un vim guru, ma quello che uso in questa circostanza è la "modalità visiva". In modalità comando, digitare V(maiuscolo). Quindi spostare su / giù per evidenziare il blocco che si desidera eliminare (funzionano tutti i normali comandi di movimento). Quindi rimuoverlo con xo d.


2
Strano. So che funziona per me (tm) qui su Linux (vim 7.3.50) e con gVim su Windows. E a giudicare dalle altre risposte, funziona per altre persone. Forse alcune impostazioni nel tuo lo .vimrcstanno facendo agire?
Mat

OK, per qualche motivo non mi ero reso conto che avresti potuto entrare in modalità linea visiva usando Shift- v... Stavo cercando di usare anche il CTRLtasto. Quindi funziona e probabilmente è il modo più conveniente.
Justin Ethier,

7
Potresti voler chiarire che esistono due modalità visive: Visual Line ( CTRL- v) e Visual Block ( Shift- v).
Justin Ethier,

2
Lo faccio molto. Ma lo considero sempre un imbroglio e un film tutt'altro che ideale.
Jim Mitchener,

9
Esistono in realtà tre modalità visive: Modalità visiva (basata sui caratteri {v}), Modalità linea visiva (basata su linee {Sv}) e Modalità blocco visivo (Consente la selezione di blocchi {Cv})
Tom Regner

293

Vai alla linea di partenza e digita ma(segna "a"). Quindi vai all'ultima riga e inserisci d'a(elimina per contrassegnare "a").

Ciò eliminerà tutte le righe da quella corrente a quella contrassegnata (incluso). È anche compatibile con vie anche nel vimcaso in cui il tuo ambiente non sia benedetto da quest'ultimo.


3
Questo strabiliante scoglio! Odio per quanto tempo faccio qualcosa (come contare le righe) prima di andare a cercare una soluzione migliore. Grazie!
ryanjdillon,

1
davvero fantastico Uso sempre la modalità visiva per eliminare il blocco ma in questo modo è meglio +1
hish

4
Ho trovato questo più utile della modalità visiva per eliminare 500k + righe
Michael - Where's Clay Shirky,

Risposta davvero pratica. Lo uso per eliminare i messaggi nel mio server dal file /var/mail/usernamein blocco e lasciando intatti gli ultimi messaggi. Faccio un segno, quindi inserisco, ad esempio, 50000seguito ggper andare alla riga 50.000, quindi elimino tutte le righe nel mezzo. funziona come un fascino!
otmezger,

1
@horta, probabilmente non userei vimcome strumento per la modifica di file gigabyte - tendo a optare per strumenti di elaborazione del testo come awke i suoi fratelli :-)
paxdiablo

46

È possibile utilizzare la modalità visiva anche (alcuni comandi sono utilizzabili con l'opzione di eliminazione anche) vip vapper selezionare il paragrafo, v2apper selezionare due paragrafi dapopere, d2apanche. È possibile eliminare in blocchi di [ ]likeda[

Per riferimento: i tipi di oggetti. Dalla documentazione di vim: sezione 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [, da {, da "tutto utile per i programmatori
Rene Wooller,

1
Grazie! dapè molto facile da ricordare come "elimina un paragrafo"
Tropilio il

38

Ci sono molte risposte migliori qui, ma per completezza menzionerò il metodo che ho usato prima di leggere alcune delle grandi risposte sopra menzionate.

Supponiamo di voler eliminare dalle righe 24-39. Puoi usare il comando ex

:24,39d

Puoi anche strappare le linee usando

:24,39y

E trova e sostituisci solo le righe 24-39 usando

:24,39s/find/replace/g

11

Se attivi i numeri di riga tramite set numberpuoi semplicemente dNNGche verranno eliminati nella riga NN dalla posizione corrente. Quindi puoi navigare fino all'inizio della riga che desideri eliminare e d50Gpresupponendo semplicemente che sia l'ultima riga che desideri eliminare.


10

Dipende da cosa sia quel blocco di grandi dimensioni . Forse intendi semplicemente eliminare un paragrafo, nel qual caso diplo farebbe.


Grazie per il consiglio. Sfortunatamente sto lavorando con il codice qui, e di solito ho bisogno di un controllo più preciso di quello.
Justin Ethier,

1
Sto lavorando anche con il codice e separo i blocchi logici da una riga vuota. Questo suggerimento mi ha appena reso felice. Ora posso eliminare grandi blocchi di logica con tre sequenze di tasti.
minimo

funziona perché 'd' significa cancellare, 'p' in questo contesto significa paragrafo
user98761

7

Esistono diverse possibilità, la cosa migliore dipende dal testo su cui lavori.

Mi vengono in mente due possibilità:

  • passare alla modalità visiva ( V, S-V, ...), selezionare il testo con il movimento del cursore e premered
  • elimina un intero paragrafo con: dap

uso dap molto spesso ora che lo conosco e preferisco che sia dis e dip, ma elimina sempre un blocco e la riga vuota che segue il blocco, ma è stato un modo per eliminare il blocco e la riga vuota che viene prima?
Funkodebat,

Nel mezzo di un testo con paragrafi non c'è differenza sintattica nel risultato, vero? Se c'è, ti suggerisco di scrivere quello che vuoi, con esempi, in una nuova domanda.
Tom Regner,

6

Se l'intero blocco è visibile sullo schermo, è possibile utilizzare l'impostazione relativa. Vedi: help relativenumber. Disponibile in 7.3


Non mi rendevo conto di quanto fosse utile: fino a quando non ho iniziato a usarlo - ottimo per sapere 50dd e navigazione, 50j
rshdev

3

È possibile posizionare il cursore all'inizio o alla fine del blocco ed entrare in modalità visiva (shift-v). Quindi spostati semplicemente verso l'alto o verso il basso fino a quando non viene evidenziato il blocco desiderato. Infine, copia il testo premendo y o taglia il testo premendo d.


forse strano, ma da questo ho capito come selezionare il testo da un punto medio desiderato in una linea e selezionare più righe di seguito nello stesso punto alla fine di ogni riga. Esattamente quello che stavo cercando.
nanker

3

Oltre ad altri movimenti che sono già menzionati qui, c'è anche /{pattern}<CR>movimento, quindi se sai che vuoi eliminare una riga che contiene pippo, puoi farlo dV/foo<CR>. Vè qui per forzare il movimento in modo lineare poiché per impostazione predefinita /è il carattere.


3

Contare le righe è troppo noioso per me, ma contare i "paragrafi" non è poi così male. '{' e '}' spostano il cursore sulla prima riga vuota prima e dopo il cursore, rispettivamente. Le operazioni di spostamento del cursore possono essere combinate con l'eliminazione e diverse altre risposte hanno utilizzato un approccio simile (dd per una riga, dG per la fine del documento, ecc.)
Ad esempio:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Se il cursore inizia sopra il blocco dei commenti, 'd}' cancella il blocco dei commenti e 'd2}' cancella sia il blocco dei commenti sia il blocco del codice. Se il cursore inizia sotto il blocco di codice, 'd {' elimina il codice e 'd2 {' elimina entrambi. Ovviamente, puoi saltare un blocco spostando prima il cursore: '{d {' o '} d}'.

Se sei coerente con il tuo spazio bianco o puoi contare i paragrafi a colpo d'occhio, questo dovrebbe funzionare. Il file della guida di Vim ha più trucchi con il cursore se sei interessato.


1

È anche possibile inserire un numero molto grande, quindi premere ddse si desidera eliminare tutte le righe sotto il cursore.


Potrebbe essere ancora più facile da usare dG, che cancella fino alla fine del documento, come Gimpostazione predefinita per andare all'ultima riga.
andyg0808

1

Eliminazione di un blocco di testo

Supponendo che il cursore si trovi all'inizio del blocco:

V/^$<CR>d (where <CR> is the enter/return key)

Spiegazione

  • Entra nella modalità "linewise-visual": V
  • Evidenzia fino alla prossima riga vuota: /^$<CR>
  • Elimina: d

Legatura chiave

Una soluzione più solida:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

Spiegazione

  • Disattiva ricerca a capo: :set nowrapscan
  • Rimappare il Dtasto (ai seguenti comandi)::nnoremap D
  • Entra nella modalità "linewise-visual": V
  • Evidenzia fino alla prossima riga vuota / bianca o EOF: /^\s*$\\|\%$<CR>
  • Elimina: d
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.