Come incollare il blocco visivo a partire da un'altra riga


10

Mi ci è voluto molto tempo per rendermi conto che mettere (incollare) qualcosa con po con Pcui il blocco visivo seleziona ctrl+ve strappato (copiato) y, preserva il modo precedente, in modo che, quando il testo copiato si trovava nel mezzo di linee, sarà quindi copiato nel mezzo di altri testi ogni volta che è possibile. Al contrario, select-line with Vnon incolla la riga copiata tra altri testi, ma a partire da un'altra riga.

Ad esempio, supponiamo che io abbia ormai:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Quando voglio tagliare Avocadoe Beane Cherry, selezionando (selezione rappresentata come _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

e premendo y, quindi spostare il cursore sulla riga seguente (cursore rappresentato come _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

e premere P. Risulta:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Ma quello che desideravo era:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Questo mi confondeva ogni volta, fino a quando mi sono reso conto che, poiché erano stati copiati nel mezzo della linea, erano così incollati nel mezzo della linea, imitando il modo in cui erano.

Sembra il modo migliore per incollare qualcosa che inizia su un'altra riga, è spostare il cursore all'inizio con 0e giù di 3 righe nella nuova posizione; e inserendo la modalità di inserimento con i, e premendo <return>3 volte, e spostando il cursore indietro di 6 righe e, a destra, di nuovo nella posizione originale; e copiando, quindi spostati di nuovo nel nuovo posto e incollalo, come ho fatto sopra.

Posso salvare qualche colpo? O cosa fai di solito?

(Modifica: quello che ho detto sopra è stato come l'ho capito nel momento in cui l'ho chiesto. Vedi quelle risposte per una spiegazione corretta:)

Risposte:


11

Quando copi del testo, questo viene inserito in un registro. Il testo all'interno di un registro ha un tipo: characterwise, linewiseo blockwise.

Questo tipo determina in che modo verrà inserito il testo.

Nel tuo esempio, hai copiato del testo dalla modalità blocco visivo. Quindi, il testo aveva il tipo blockwiseed era memorizzato nel registro senza nome ".
A causa di questo tipo, quando lo incollerai di nuovo nel buffer, verrà incollato come un blocco.


Se vuoi incollarlo come una sequenza di linee, invece di un blocco, ci sono 3 modi.

  1. Dalla modalità di inserimento, è possibile inserirlo colpendo C-r ".
    Dovrebbe inserire il contenuto del registro senza nome come se il suo tipo fosse lineare.

  1. Dalla riga di comando, è possibile utilizzare il :putcomando.
    :putdovrebbe incollare il testo all'interno di un registro come se il suo tipo fosse lineare, indipendentemente dal tipo originale. Si noti che è possibile passare il nome di un registro come argomento, nonché un indirizzo di riga per specificare sotto quale riga si desidera incollare il registro.

Per esempio:

:42put a

... dovrebbe inserire il contenuto del registro a, sotto la 42riga th.

Senza un nome di registro, Vim supporrà che desideri incollare il registro senza nome (o il +registro se lo hai modificato 'clipboard').
E senza un indirizzo, Vim supporrà che desideri incollarlo sotto la riga corrente.


  1. Dalla riga di comando, è possibile modificare il tipo di registro senza nome con la setreg()funzione:

    :call setreg('"', '', 'al')

Qui, setreg()dovrebbe aggiungere una stringa vuota al registro senza nome (grazie al aflag passato come terzo argomento) e cambiare il suo tipo in linea (grazie al lflag).

Quindi, dalla modalità normale, dovresti essere in grado di incollare il registro, con il pcomando normale, come se il suo tipo fosse lineare.


Non è direttamente collegato al tuo problema, ma quando copi del testo, entra anche nel 0registro. E se hai anteposto il valore unnamedplusall'opzione 'clipboard', viene inserito anche nel +registro.

Puoi controllare qual è il tipo di un registro, usando la getregtype()funzione:

:echo getregtype('"')

Se restituisce una minuscola v, significa che il tipo è in modo caratteristico.
Se restituisce Vlettere maiuscole , significa che il tipo è lineare.
Se ritorna ^V{some number}, significa che il tipo è a blocchi e la larghezza del blocco è {some number}.


3

Avevo bisogno di "trasmettere" i contenuti del registro in una determinata modalità (carattere / linea / blocco) così spesso, ho scritto il plugin UnconditionalPaste per questo. Fornisce gcp, glpecc. Alternative ai comandi incolla incorporati che impongono una certa modalità (e ormai diverse altre varianti su questo tema, come incollare con virgole unite da virgole o caratteri interrogati).

Con esso, puoi semplicemente usare glp/ glPper incollare dopo / prima della riga corrente (come nuove righe), indipendentemente da come hai strappato il testo.


Ti invidio che hai tempo per scrivere una cosa simile QQ Ma sono soddisfatto :put. (Hai anche votato per te)
Violapterin il

@Aminopterin: ho risposto che così spesso, in realtà ho uno snippet di snipMate per il primo paragrafo. Quindi ho solo bisogno di personalizzare un po '. Grazie per aver apprezzato la mia risposta e il voto positivo!
Ingo Karkat,

Oh, ho detto che ti invidio che hai il tempo di scrivere un plugin da solo, come questo, come se fosse fatto con leggerezza .... solo lo scorso sei mesi ho iniziato a scrivere qualche progetto c ++ come progetto hobby per costringermi ad imparare a programmare, e ho iniziato a usare vim ~~
Violapterin il

2
@Aminopterin Ah bene, il plugin è iniziato come un piccolo frammento copiato da Vimtips e lentamente è cresciuto nel tempo. Dato che mi è stato così utile, l'ho gradualmente migliorato notevolmente. Molti piccoli passi sono più potenti di un grande sforzo singolo!
Ingo Karkat,
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.