Vim strappa la gamma di linee


84

Sono uno sviluppatore C # che ha deciso di recente di ampliare la mia conoscenza degli strumenti a mia disposizione. Il primo strumento che ho deciso di imparare è Vi / Vim. Finora è andato tutto bene, ma ci sono un paio di domande a cui non riesco a trovare la risposta:

  1. Diciamo che volevo strappare una serie di linee. So che ci sono molti modi per farlo, ma vorrei farlo per numero di riga. Ho pensato che sarebbe stato simile a come funzionano i comandi sostitutivi, qualcosa di simile 81,91y. C'è un modo per fare questo?

  2. Sono un po 'confuso riguardo al gcomando in modalità normale. Sembra fare una miriade di cose e non posso davvero determinare cosa fa il comando g al suo interno. Sono confuso se si tratta o meno di un comando di movimento o di una sorta di "cattura tutto" per altri comandi eseguiti in modalità normale. Qualcuno può spiegarlo o indicarmi un riferimento che dia una buona spiegazione del gcomando?


1
Conosci il comando ": help" in vim (1)?
Steve Emmerson

Sì, ma non sono riuscito a trovarlo in tutti i riferimenti. Si scopre che stavo pensando di farlo dalla modalità normale, ma hometoast ha mostrato come doveva essere fatto dalla modalità di comando. Per il comando g, trovo solo che l'aiuto non collega tutto insieme come mi aspetterei dagli altri comandi.
jnadro52

3
Per inciso, potresti voler scrivere un post per domanda.
Dana

1
Lo farò in futuro. Ero più preoccupato per la prima domanda, ho pensato all'altra mentre digitavo la prima.
jnadro52

Risposte:


141

Linee Yank 81-91

:81,91y<enter>

Se alle tue dita non piace trovare i tasti :e ,, anche questo funzionerebbe (vai alla riga 81, strappa 11 righe)

81gg11yy 

Il mio unico uso di gè 5gg. Per andare alla 5a riga. 22gg: 22a riga. Come ha detto jimbo, in realtà è solo un modificatore per alcuni altri comandi.

Per completezza, ( http://vim.wikia.com/wiki/Power_of_g ) spiega molto come gfunziona in modalità di comando.


2
Anche l'uso delle lettere maiuscole fornisce delle varianti: ggandrà alla prima riga, mentre Gandrà all'ultima. Inoltre, 5Gva alla riga 5. I contrassegni possono essere utilizzati anche al posto dei numeri di riga (buono per le macro), ad esempio: :'a,52y
NVRAM

1
Se non hai paura del tasto Maiusc, 81G11Yè ancora "più corto".
Jens

1
Lo svantaggio del metodo in modalità normale è che perdi il tuo "posto"; si potrebbe plausibilmente mxprima e 'xdopo, ma poi la versione in modalità di comando diventa molto più succinta. Humm ... non appena ho scritto questo, ho visto la risposta di @Asta.
Eric Smith

1
@WilliamRoss questo mette effettivamente le righe in un buffer per l'uso in vim, non necessariamente negli Appunti del tuo sistema dove potresti incollare, ad esempio, Blocco note con CTRL + V. Vedi domanda correlata: Come copiare / incollare testo da vi a diverse applicazioni
hometoast

1
Questo mi diverte perché l'intera ragione per cui ho cercato la prima soluzione era evitare di contare le righe o di fare una sottrazione nella mia testa.
Paul Parker

23

Puoi anche copiare le righe correnti nella posizione attuale del cursore usando "t".

:81,91t.<enter>

Questo incollerà le righe 81-91 sotto la riga su cui si trova il cursore.

L'ho imparato da http://vimcasts.org che è un'ottima risorsa su VIM.


Cosa t.significa qui?
CivFan

2
Dalla mia comprensione tpuò essere considerato tmalato o to ed .è l'indirizzo della riga corrente.
Asta

1
@CivFan è un sinonimo di:copy
D. Ben Knoble

11

Mi piace anche usare l'opzione relativa al numero di riga di vim, il che significa che posso semplicemente inserire:

:-10,-7ya a

per trascinare il testo nel buffer denominato a.

NB Specificare A aggiungerà ciò che stai strappando al contenuto corrente del buffer a.

Non dimenticare che puoi anche copiare blocchi di testo e spostare blocchi di testo con i comandi simili:

:-10,-7co .

significa copiare le quattro righe di testo 10 righe sopra a sotto la riga corrente, e

:-10,-7mo .

significa spostare le quattro righe di testo 10 righe sopra a sotto la riga corrente.


8

Il Gcomando va a un certo numero di riga, se è accompagnato da un valore di conteggio. 81Gti mette sulla linea 81.

Il ycomando può essere combinato con un movimento, come G. Quindi per tirare tutto fino alla riga 91 puoi usare y91G.

Insieme ottieni:

81Gy91G

Vai alla linea 81, poi strattona mentre vai alla linea 91.


1
Spero di poter votare a favore più di una volta. Qualcosa che mi ha aiutato è stato utilizzare questo per estrarre un registro (nel mio caso, registro + cioè, gli appunti):81G"+y91G
mgarey

1
@mgarey non c'è modo di inserire direttamente un registro usando la sintassi dell'intervallo di riga? 81,91ye in qualche modo mirare al registro?
diplosaurus

1
@diplosaurus Probabilmente, ma non lo so. Sembra una domanda che potresti porre su vi.stackexchange.com, se non è già lì o qui su SO. Sarei interessato. Non sono un esperto di Vim.
mgarey

2
@mgarey Ho dovuto essere creativo con la ricerca su Google, ma l'ho trovato qui: stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus

@diplosaurus :81,91y +non funziona. Funziona per altri registri come :81,91y aad esempio, ma non sembra gradire il +registro. Funziona sicuramente per altre persone?
ojunk

4

gnon fa nulla da solo. È uno dei due meta-comandi che contiene un mucchio di comandi non correlati.

z è ancora un altro comando del genere.


Grazie. Capisco ora che è usato solo per scopi diversi. Quando provo a imparare questi strumenti, cerco di associare i comandi a qualcosa che posso astrarre in modo da ricordare come usarli correttamente. Sembra che il comando g sia solo una di quelle cose che devi memorizzare per usarlo correttamente.
jnadro52

2

Vim's :help indexdescrive gcome:

|g|             g{char}            extended commands, see |g| below

Scorri verso il basso (o :help g) per un elenco.


1
Conoscevo: help ma NON conoscevo: help (comando). Ciò sarà molto utile in futuro. Grazie gentilmente, signore.
jnadro52

2

La soluzione migliore sarebbe entrare in "modalità visuale", premendo v. E dopo aver selezionato le righe copiarle semplicemente premendo y. Quindi incollare le righe copiate premendo p.


Non sono d'accordo, ma solo la modalità visiva bc è così lenta a volte.
D. Ben Knoble,

1

Oltre a ciò :91,96y ache trascina ( y) le righe da 91 a 96 nel registro a, (incollate con "ap), le linee strappate possono essere aggiunte al registro con:

:91,96y A

Cioè la capitalizzazione del Aregistro provoca un'operazione di aggiunta nel registro ainvece di una sovrascrittura. L'uso delle maiuscole nel registro funziona sempre in questo modo, ad esempio :let @A=';'aggiunge una a ;per il registroa .

L'uso del segno più (+) o meno (-) fa riferimento alle linee relative alla posizione corrente del cursore:

:-10,+10y b

Cioè estrarrebbe ( y) 21 linee attorno alla posizione corrente del cursore e le inserirà nel registrob .

L'assenza di input rappresenta in realtà anche la posizione corrente del cursore, il che significa che questo:

:-5,y a

estrarrebbe il testo da 5 righe sopra alla posizione corrente del cursore nel buffer denominato a, e:

:,+5y a

strapperebbe le 5 righe dopo la posizione corrente del cursore nel buffer a .

Nota: se hai una macro in buffer a è stata appena sovrascritta dallo yank precedente, poiché i registri di yank ei registri di macro sono davvero la stessa cosa. Ecco perché, casualmente, puoi incollare una macro, modificarla e poi rimetterla nel registro. Personalmente uso le lettere raggiunte dalla mia mano sinistra per gli strattoni e le lettere raggiunte dalla mia mano destra per le macro.

Spostando blocchi di testo, assomiglia a questo:

:+10,+13m.

il che significa spostare le quattro linee posizionate 10 linee prima del cursore corrente, al di sotto della linea corrente.

Addendum

Ho già confuso yain :91,95ya aessere in qualche modo sinonimo di ya{motion}cui il movimento è stato fornito da 91,95. Questo non era corretto e la "a" in yaè completamente inutile. A mia difesa, il mio help yanknon comunica che yasia un possibile alias di yank.


1
:yaè un'abbreviazione di :yank, quindi non sono sicuro di come mi sento riguardo agli strappi di tutte le linee . Ma un buon lavoro condensando alcune delle informazioni sparse
D. Ben Knoble

Lo pensavo anch'io, finché non l'ho guardato :help yank. Non ci sono alias yaper yank. Hai ragione però, anon sta per "all", tecnicamente sta per "a". Preferisco dire "tutto" comunque, dato che per me ha più senso.
Paul Parker

2
:[range]y[ank] [x] Yank [range] lines [into register x]le parentesi quadre in y[ank]indicano che [ank]sono opzionali. :y, :yaE :yansono implicitamente alias per:yank
D. Ben Knoble

Sono corretto :) La a non è necessaria. Modificherà la risposta per riflettere.
Paul Parker

1
La tua aggiunta è carina, ma mi riferivo alla tua primissima riga, in cui usi il comando ex :yae non il comando normaley
D. Ben Knoble

0

Da molto tempo utente Vi / Vim tendo ad usare "segni" invece di numeri di riga (o "indicatori di riga"). Funziona così: mè il carattere "segno"; quindi utilizzare qualsiasi lettera per identificare / denominare il marchio. Per tornare a un segno anteporre il segno nominato con una virgoletta singola ( 'a) Questi segni possono essere usati come intervallo. Esempi:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

In modalità comando, sposta il cursore sulla riga 2, digita ma. scorrere fino alla riga 4, digitare mb. Per estrarre dal segno a al segno b, digitare:

    :'a,'byank

Per eliminare dal segno a al segno b, digitare:

    :'a,'bdel

Per cercare dal segno a al segno b e sostituire "ine" con "inchiostro":

    :'a,'bs/ine/ink/g

Per copiare un segno di passaggio be incollare sotto la posizione corrente (il 'punto' fa sempre riferimento alla riga in cui è posizionato attualmente il cursore):

    :'a,'bco . 

Spostare le righe di codice, tra il segno a e il segno b , una scheda a destra (usa la freccia opposta,, <per spostarti a sinistra):

    :'a,'b> 

Nella modalità di comando puoi tornare ai segni semplicemente digitando 'a per tornare alla riga contrassegnata a. Digitando'' ti riporta alla posizione precedente (sfortunatamente ricorda solo la posizione precedente, non due indietro).

Puoi estrarre buffer con nome, copiare, eliminare righe, cercare e sostituire solo parti del tuo codice, ecc. Senza bisogno di conoscere i numeri di riga.


0

Per estrarre le linee dalla riga 81 alla 91:

approccio 1: 81gg11yy

non male ma devi fare un po 'di matematica per scoprire quante righe tirare

approccio 2: 81ggallora shift+vpoi 91ggpoiy

IL MEGLIO A MIO PARERE perché questo è semplice, devi solo sapere la cosa ovvia cioè da quale numero di riga a quale numero di riga vuoi estrarre

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.