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


91

In realtà, ho spesso bisogno di eliminare, o strappare / mettere grandi blocchi di testo.

Posso contare le righe di testo e inserire qualcosa come 50ddeliminare 50 righe.

Ma è un po 'una seccatura. Come posso eliminare questo grande blocco di testo senza dover sapere quante righe eliminare in anticipo?


4
Come fai a sapere dove finisce? Se riesci a descrivere la fine, puoi eliminare fino a quel punto. Se riesci a descrivere come puoi movefino alla fine. Quindi eliminare fino alla fine non è diverso dal passare alla fine.
Martin York,

@Loki, spostarsi alla fine di solito è solo usando la pagina in basso e i tasti freccia fino a quando non ci arrivo. Esso può essere il primo o decima riga vuota, che può essere la prima parentesi di chiusura. La linea di fondo è che varia un po '.

2
controlla anche questa risposta: stackoverflow.com/a/16407391/164835
Kent

Risposte:


111

Vai alla linea di partenza del tuo blocco e digita ma(segna "a", anche se puoi ovviamente usare lettere diverse e anche più lettere per segni diversi purché tu possa tenerlo dritto in testa di ciò che ogni lettera è un segno di) .

Quindi vai all'ultima riga e inserisci d'a(elimina per contrassegnare "a") o y'a(yank per contrassegnare "a") (a) .

Ciò eliminerà / strapperà tutte le linee dalla corrente a quella contrassegnata (inclusiva).

Quindi puoi incollarlo da qualche altra parte con i normali comandi incolla, come po P.

È anche compatibile con vie anche nel vimcaso in cui il tuo ambiente non sia benedetto da quest'ultimo.


(a) Lo uso anche per salvare il mio posto nel file se devo andare a cercare altrove qualcosa come, ad esempio, incollare la definizione di una funzione che voglio chiamare.

Semplicemente segnare la linea corrente allo stesso modo ma, quindi mi allontano per trovare quello che stai cercando.

Quindi, una volta trovato e copiato in un registro, entro 'ae torno per contrassegnare "a", la linea che ho salvato in precedenza, dove posso quindi incollarlo.


9
Potresti anche usare la modalità visiva per questo, giusto?
jmc

3
Questo è un modo, jmc, ma non sono sicuro che vi standard abbia una modalità visiva.

5
Da quando sono passato dalla selezione visiva alla marcatura e ai relativi numeri di riga circa un anno fa, ho scoperto che i comandi di movimento vi sono molto più veloci ed efficienti della selezione visiva. Anche se in seguito è più facile ogni volta che premo il vtasto, mi chiedo: ne ho davvero bisogno o esiste un modo migliore per muoversi?
Sukima,

1
Sì, allo stesso modo è interessante, @Sukima, che mi sento più efficiente meno utilizzo il mouse, anche in una GUI. Mi ritrovo ad essere più veloce se riesco a rimanere sulla tastiera.

3
Se stai modificando qualcosa con linee molto lunghe, anche la versione di backtick potrebbe essere molto utile (che si riferisce al posto all'interno della linea, piuttosto che all'intera linea).
msouth,

65

In Vim, usa la modalità linea visiva :

  1. Posiziona il cursore sulla riga superiore del blocco di testo / codice da rimuovere
  2. Premi V(Questa è la "V" maiuscola: Shift+ v)
  3. Sposta il cursore verso il basso nella parte inferiore del blocco di testo / codice per rimuoverlo
  4. stampa d

Per eliminare grossi blocchi di testo, questo è preferito rispetto alla semplice modalità visiva perché non è necessario preoccuparsi della colonna su cui si trova il cursore.


3
Al passaggio 3. puoi muoverti più velocemente usando i movimenti degli oggetti. Ad esempio, è possibile utilizzare }per selezionare l'intero paragrafo o )per le frasi. Ce ne sono altre, puoi leggerle in:h object-motions
mxlian

2
Anche la ricerca di una sottostringa con /something<CR>è un metodo molto efficiente per raggiungere la fine del blocco di selezione
mxlian

1
Questo è il mio metodo preferito. Tuttavia, in alternativa, senza dover premere ripetutamente jper spostare il cursore verso il basso (passaggio 3), è possibile digitare il numero di riga seguito da Gper selezionare fino a quella riga. Esempio:V150Gd
Ranhiru Jude Cooray


39

Puoi facilmente eliminare grandi blocchi di testo conoscendone la struttura.

Se è un paragrafo, usa: d{(ad esempio puoi aggiungere un prefisso con il numero di paragrafi)

Se è un blocco di codice tra parentesi, utilizzare: d%

Se il testo appare fino alla fine del file, utilizzare: dG

Se sai come finisce, usa: d/e digita il testo finale seguito da Enter(puoi anche usare l'espressione regolare, quindi le possibilità sono infinite).

In alternativa, usa la modalità visiva ( V) e usa i tasti di movimento per selezionare rapidamente il testo (ad es. Con {) e rimuoverlo ( d).

Oppure, come suggerito da Lie Ryan, utilizzare d/search-string/eper eliminare il testo dal cursore corrente alla stringa cercata.

Vedi: :help de :help motionper maggiori informazioni.


2
C'è anche d/search-string/eda eliminare dal cursore corrente fino alla fine della stringa di ricerca inclusa la stringa di ricerca stessa e c/search-queryentrare in modalità inserimento dopo l'eliminazione. L'utilizzo d/con set incsearchè una combinazione accurata in quanto consente di capire in modo interattivo se si sta operando nell'intervallo di testo corretto e aiuta a sapere quando interrompere la digitazione della query di ricerca per evitare di digitare più del necessario.
Lie Ryan,

4
Trovo anche molto utile dcon a(esterno) o i(interno) e un identificatore di oggetti. Oggetti come wper la parola, pper il paragrafo (o bper (...), [per [...], {o Bper la documentazione{...} ecc. Per gli operatori visivi .
Shahbaz,

22

È possibile utilizzare movimenti e / o oggetti di testo. Ad esempio, puoi eliminare tutto dal cursore alla riga vuota successiva con d}. Se il cursore si trova all'interno di un paragrafo, il paragrafo può essere eliminato con dipo dap. Se il cursore si trova all'interno di un tag HTML, è possibile eliminarlo con dito dat.

Buoni mnemonici per questi sono " d elete i nside" e " d elete a round" (paragrafo / tag / parentesi).


11

Di solito lo faccio

:<start>,<end>d

che eliminerà ogni riga tra i numeri di riga iniziale e finale forniti (comprese le righe fornite).

Si noti che entrambi starte endpossono essere numeri di riga assoluti, motivi o offset da un'altra posizione.

Vedi anche il commento di doubleDown sulla visualizzazione della documentazione della gamma di Vim , con alcuni suggerimenti utili.

Esempio:

Supponi di avere il seguente file:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Quindi usando il comando :2,3do :/fox/,/over/do :/quick/+1,/lazy/-1o :+1,+2dse sei sulla prima riga o :-1,.dse sei sulla terza riga, finisci con:

1. The quick brown
4. lazy dog.

Ma questo significa che devi ancora contare le linee? O ho frainteso la tua risposta?
Martin Tournoij,

7
Non è necessario contare le righe, ma è necessario conoscere i numeri delle righe.
jmc

Prima fai :set ruler, poi vai all'inizio e alla fine del testo per trovare starte endnumeri di riga, quindi fallo:<start>,<end>d
roblogic,

1
È inoltre possibile utilizzare i numeri di riga relativi:+12,+24d
rpattabi

2
In realtà, puoi usare una coppia di numeri di riga, una coppia di modelli o una coppia mista per <start>e <end>per questo. Per riferimento, vedere :h [range]. Quindi in realtà è un po 'più flessibile di quanto tu abbia immaginato.
doubleDown,

5

Se si tratta di blocchi delimitati (ad es .: tag di codice o XML / HTML) con cui hai a che fare, puoi posizionare il cursore all'inizio del blocco e utilizzare la modalità visiva insieme %per selezionare rapidamente interi blocchi di codice e quindi premere dper eliminarli.


5
In alternativa, è possibile utilizzare dapper eliminare un paragrafo, da(, da{, da[, per eliminare i blocchi delimeted tra parentesi, bretelle, o parentesi quadre. Per html esiste dat, che elimina un tag da'ed da"elimina le stringhe. C'è anche il dip, di(varianti, ecc, che cancellerà tutto all'interno dei delimitatori, ma lasciare intatti i delimitatori. In alternativa, puoi usare vap(resp vip) per selezionare tutti i paragrafi (resp inner). (E così c'è va(e vi(.) Inoltre c'è cape cip(o ca(e ci() per cancellare e andare in modalità di inserimento (cioè, "cambia"). E yapper strattonare
jmc

Penso che alcuni degli attacchi @jmc descritti nel suo precedente commento provengano dal plugin surround.vim di Tim Pope. È un ottimo plugin che consiglierei di installare, ma significa che questi collegamenti non fanno parte dell'installazione predefinita di vim.
Haegin,

5

Oltre a tutti gli altri buoni consigli, sto aggiungendo d+ Shift+ Lper eliminare tutto dalla posizione corrente del cursore all'ultima riga visibile sullo schermo. La ripetizione del comando ti farà scendere relativamente velocemente.


5

Il plug-in numbers.vim è molto utile per questo. È un modo avanzato per precedere ogni riga con un numero di riga. Come 'number'e 'relativenumber', entrambi sono diventati uno!

È abilitato per impostazione predefinita dopo l'installazione, inoltre si desidera aggiungere set numbera Vimrc se non l'hai già, poiché si comporta in modo strano se non lo hai.

In modalità normale sembra simile a :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

Mostra i numeri di riga relativi, ad eccezione della riga in cui si trova il cursore, in cui mostra il numero di riga assoluto (7 in questo caso).

Se poi passiamo alla modalità di inserimento , si comporterà come se numberfosse impostato mostrando sempre numeri di riga assoluti:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Ci sono alcune opzioni e alcuni comandi (controlla la homepage), ma i valori predefiniti dovrebbero funzionare per la maggior parte delle persone.


All'inizio ho pensato che questa risposta fosse un po 'fuori tema, ma poi ho installato il plugin e devo dire che è un punto di svolta per me. Scambiavo manualmente e il passo mentale in più mi ha impedito di usare quei movimenti. Grazie!
Sukima,

1
Questo suona come qualcosa che un InsertEnter / InsertLeave autocmd per attivare o disattivare la numerazione delle righe relative potrebbe fare. Mi sto perdendo qualcosa?
Ben

Sono MOLTO in ritardo alla festa ma @Ben ha ragione, questo è solo un paio di linee di comando automatico. Ad esempio, nel mio vimrc ho set number, set relativenumberquindi autocmd InsertEnter * :set norelativenumbereautocmd InsertLeave * :set relativenumber
B Layer

4

Un altro approccio è se stai cercando di eliminare uno schema specifico, puoi semplicemente digitare d/delimEnter.


2

È possibile utilizzare la normale procedura di immissione dpiù un movimento (come già spiegato nelle altre risposte). Il plug-in EasyMotion offre nuovi movimenti che è possibile utilizzare per risolvere il problema in modo rapido e semplice.

Supponiamo che tu voglia eliminare dalla posizione corrente del cursore alla fine di una determinata parola sullo schermo, i tasti di movimento sarebbero <Leader><Leader>e(simili al emovimento normale ). Quindi digitare le lettere evidenziate che appaiono alla fine della parola in questione. C'è anche un movimento di linea in modo da poter eliminare la linea corrente fino alla linea in questione <Leader><Leader>j.

Ho la mia <Leader>chiave impostata su ,. Quindi, il comando completo è d<Leader><Leader>e{lettere evidenziate}.

Da :help easymotion:

EasyMotion fornisce un modo molto più semplice di utilizzare alcuni movimenti in vim. Prende il <number>fuori <number>w o <number>F {char}, mettendo in evidenza tutte le scelte possibili e che consente di premere un tasto per saltare direttamente al bersaglio.

Quando viene attivato uno dei movimenti disponibili, tutto il testo visibile che precede o segue il cursore viene sbiadito e gli obiettivi di movimento vengono evidenziati.

Modificare:

Il repository github di EasyMotion è disponibile all'indirizzo https://github.com/Lokaltog/vim-easymotion .

Questo reddit sulle persone che usano easymotion potrebbe essere una lettura divertente.


1

C'è una soluzione semplice che può risolvere il tuo problema.

Posiziona il cursore all'inizio del blocco di testo che desideri rimuovere e fai d50gg.

Ciò eliminerà tutte le righe dalla posizione corrente alla 50a riga del testo.

eq: se il cursore si trova sulla riga 46 , d50ggeliminerà 4 righe.


1
Suggerirei di usare Ggg invece di come funziona anche in vi, e ovviamente :set numberè sempre utile per trovare quale numero di riga è la linea a cui vuoi andare.
Casuale 832,

Il punto centrale di questa domanda è che non sai quante righe vuoi rimuovere.
200_successo

200_successo, non devi sapere quante righe vuoi rimuovere con la risposta che ho pubblicato. Tutto quello che devi sapere è "a quale linea vuoi rimuovere"
Accidenti

1

Usa la modalità visiva con l'evidenziazione della linea.

  1. Posiziona il cursore sulla riga superiore del blocco di testo / codice da rimuovere
  2. Premi Shift+v
  3. Sposta il cursore verso il basso nella parte inferiore del blocco di testo / codice per rimuoverlo
  4. stampa d

Preferisco questo metodo per eliminare blocchi di codice perché elimina intere righe rispetto al semplice utilizzo della modalità visiva in cui è necessario posizionare il cursore nella colonna di destra per eliminare ciò che si desidera.


3
In sostanza, ripeti la risposta con @ 200_success.
Martin Schröder,

1

Non mi piace avere relativenumbertutto il tempo, quindi ho configurato il mio Vim per abilitarlo solo quando sono in modalità Visual:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Questo semplifica il tuo compito:

V49jd

perché dopo aver colpito Vpuoi vedere quanto è lontana la linea di destinazione.

Questo potrebbe rivelarsi fastidioso a lungo termine (il testo si sposta a destra e a sinistra quando il numero relativo è abilitato / disabilitato), ma finora mi sto divertendo molto.


1
Penso che usi v<Esc>d50j?
Martin Tournoij,

Grazie, l'avevo davvero scritto in modo errato. In realtà comincio con Vse so che farò un'operazione di linea, e poi posso lasciare dfino all'ultimo, per una maggiore sicurezza.
Joeytwiddle,

La mia risposta sembra essere l'approssimazione di un uomo povero dei plugin numbers.vim offerti in un'altra risposta. ;-)
joeytwiddle

1

Cosa ha funzionato alla grande con me vi:

  1. :set number per visualizzare il numero della riga fino a dove volevo eliminare;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Torna alla riga in cui doveva iniziare l'eliminazione

  3. Eliminazione utilizzata dalla riga corrente, in modalità normale> d1290G
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.