Come incollare il testo strappato nella riga di comando di Vim


Risposte:


1157

Sì. Hit Ctrl- Rallora ". Se hai caratteri di controllo letterali in ciò che hai strappato, usa Ctrl- R, Ctrl- O," .

Ecco una spiegazione di cosa puoi fare con i registri. Quello che puoi fare con i registri è straordinario, e una volta che sai come usarli non puoi vivere senza di loro.

I registri sono sostanzialmente posizioni di archiviazione per le stringhe. Vim ha molti registri che funzionano in diversi modi:

  • 0 (registro yank: quando lo usi y in modalità normale, senza specificare un registro, il testo strappato va lì e anche al registro predefinito),
  • 1a 9(spostamento dei registri di eliminazione, quando si utilizzano comandi come co d, ciò che è stato cancellato va nel registro 1, ciò che era nel registro 1 va nel registro 2, ecc. ),
  • "(registro predefinito, noto anche come registro senza nome. Qui è dove "entra Ctrl- R," ),
  • aper zper uso personale (capitalizzati Aper Zsono per l'aggiunta ai registri corrispondenti).
  • _(si comporta come /dev/null(Unix) o NUL(Windows), puoi scriverci ma è scartato e quando leggi da esso, è sempre vuoto),
  • - (piccolo registro di cancellazione),
  • /(Ricerca di registrazione del modello, aggiornato quando si guarda per il testo con /, ?, *o #per esempio, è possibile anche scrivere ad esso per cambiare dinamicamente il modello di ricerca),
  • :(memorizza l'ultimo comando digitato VimL tramite Qo :, di sola lettura),
  • + e * (registri degli Appunti di sistema, è possibile scrivere su di essi per impostare gli Appunti e leggere da essi il contenuto degli Appunti)

Vedere :help registers per il riferimento completo.

È possibile, in qualsiasi momento, utilizzare :registersper visualizzare i contenuti di tutti i registri. Sinonimi e shorthands per questo comando sono :display, :rege:di .

In Inserisci o modalità riga di comando, Ctrl- Roltre a un nome del registro, inserisce il contenuto di questo registro. Se si desidera inserirli letteralmente (nessun rientro automatico, nessuna conversione di caratteri di controllo come 0x08backspace, ecc.), È possibile utilizzare Ctrl- R, Ctrl- O, nome registro. Vedere:help i_CTRL-R e paragrafi seguenti per ulteriori riferimenti.

Ma puoi anche fare quanto segue (e probabilmente ho dimenticato molti usi per i registri).

  • In modalità normale, premi ":p. L'ultimo comando che hai usato in vim viene incollato nel tuo buffer.
    Decomponiamo: "è un comando in modalità Normale che consente di selezionare quale registro utilizzare durante la successiva operazione di strappo, cancellazione o incolla. ":Seleziona quindi il registro dei due punti (memorizzando l'ultimo comando). Quindi pè un comando che già conosci, incolla il contenuto del registro.

    cf. :help ",:help quote_:

  • Si sta modificando un file VimL (per esempio il vostro .vimrc) e vuoi eseguire un paio di righe consecutive in questo momento: yj:@"Enter.
    Qui, yjsposta la riga corrente e successiva (questo perché j è un movimento lineare ma questo non rientra nell'ambito di questa risposta) nel registro predefinito (noto anche come registro senza nome). Quindi il :@comando Ex riproduce i comandi Ex memorizzati nel registro indicato come argomento e" è il modo in cui si fa riferimento al registro senza nome. Vedi anche la parte superiore di questa risposta, che è correlata.

    Non confondere "usato qui (che è un nome di registro) con l' "esempio precedente, che era un comando in modalità normale.

    cf. :help :@e:help quote_quote

  • Inserire l'ultimo modello di ricerca nel proprio file in modalità di inserimento, o nella linea di comando, con Ctrl- R, /.

    cf. :help quote_/,help i_CTRL-R

    Corollario: Mantenete il vostro modello di ricerca, ma aggiungere un'alternativa: / Ctrl- R, / \|alternative.

  • Hai selezionato due parole nel mezzo di una riga in modalità visiva, le hai strappate con y, sono nel registro senza nome. Ora si vuole aprire una nuova linea appena al di sotto dove ti trovi, con quelle due parole: :pu. Questa è una scorciatoia per :put ". Il :putcomando, come molti comandi Ex, funziona solo in modo lineare.

    cf. :help :put

    Avresti potuto anche fare: :call setreg('"', @", 'V')allora p. La setregfunzione imposta il registro di cui viene dato il nome come primo argomento (come una stringa), lo inizializza con il contenuto del secondo argomento (e puoi usare i registri come variabili con il nome @xdove xè il nome del registro in VimL), e lo trasforma nella modalità specificata nel terzo argomento, Vper linewise, niente per characterwise e letteralmente ^Vper blockwise.

    cf. :help setreg(). Le funzioni inverse sono getreg()e getregtype().

  • Se hai registrato una macro con qa... q, :echo @ati dirà cosa hai digitato e @ariprodurrà la macro (probabilmente lo sapevi, molto utile per evitare attività ripetitive)

    cf. :help q,help @

    Corollario dell'esempio precedente: se è presente 8gonegli Appunti, @+verrà riprodotto il contenuto degli Appunti come macro e quindi passerà all'ottavo byte del file. In realtà questo funzionerà con quasi tutti i registri. Se l'ultima stringa inserita era ddin modalità Inserisci, allora @.(poiché il .registro contiene l'ultima stringa inserita) eliminerà una riga. (Documentazione Vim è sbagliato in questo senso, in quanto afferma che i registri #, %, :e .sarà solo il lavoro con p, P, :pute Ctrl- R).

    cf. :help @

    Non confondere :@(comando che riproduce i comandi Vim da un registro) e @(comando in modalità normale che riproduce i comandi in modalità normale da un registro).

    Notevole eccezione è @:. Il registro dei comandi non contiene i due punti iniziali né contiene il ritorno a capo finale. Tuttavia, in modalità Normale, @:farà ciò che ti aspetti, interpretando il registro come un comando Ex, non tentando di riprodurlo in modalità Normale. Quindi, se il tuo ultimo comando è stato :e, il registro contiene ema @:ricaricherà il file, non andrà alla fine della parola.

    cf. :help @:

  • Mostrare ciò che si farà in modo normale prima di eseguirlo: @='dd' Enter. Non appena si =preme il tasto, Vim passa alla valutazione dell'espressione: quando si immette un'espressione e si Enterpreme, Vim la calcola e il risultato funge da contenuto del registro. Naturalmente il registro =è di sola lettura e one-shot. Ogni volta che inizi a usarlo, dovrai inserire una nuova espressione.

    cf. :help quote_=

    Corollario: se stai modificando un comando e ti rendi conto che dovresti inserire nella riga di comando una riga dal tuo buffer corrente: non premere Esc! Usa Ctrl- R =getline(58) Enter. Dopodiché tornerai alla modifica della riga di comando, ma ha inserito i contenuti della 58a riga.

  • Definire manualmente un modello di ricerca: :let @/ = 'foo'

    cf. :help :let

    Nota che così facendo, non devi scappare /nel modello. Tuttavia, è necessario raddoppiare tutte le virgolette singole, ovviamente.

  • Copiare tutte le righe che iniziano con foo, e successivamente linee contenenti barda appunti, catena questi comandi: qaq(azzera l' un registro memorizzare una macro vuoto al suo interno),:g/^foo/y A , :g/bar/y A, :let @+ = @a.

    L'uso del nome di un registro di capitale fa funzionare il registro in modalità append

    Meglio, se Qnon è stato rimappato da mswin.vim, avviare la modalità Ex conQ , concatenare quei "comandi di due punti" che in realtà sono meglio chiamati "comandi Ex" e tornare alla modalità normale digitando visual.

    cf. :help :g, :help :y,:help Q

  • Fare doppio spazio il file: :g/^/put _. Questo mette il contenuto del registro del buco nero (vuoto durante la lettura, ma scrivibile, comportandosi come /dev/null) in senso lineare, dopo ogni riga (perché ogni riga ha un inizio!).

  • Aggiungere una riga che contiene fooprima di ogni riga: :g/^/-put ='foo'. Questo è un uso intelligente del registro delle espressioni. Qui, -è sinonimo di .-1(cfr :help :range.). Dal momento che :putinserisce il testo dopo la riga, devi dirlo esplicitamente di agire sul precedente.

  • Copiare l'intero buffer negli appunti di sistema: :%y+.

    cf. :help :range(per la %parte) e :help :y.

  • Se avete misrecorded una macro, è possibile digitare :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'e modificarlo. Ciò modificherà il contenuto della macro memorizzata nel registro ae qui viene mostrato come è possibile utilizzare il registro delle espressioni per farlo.

  • Se lo facessi dddd, potresti farlo uuper annullare. Con pte potresti ottenere l'ultima riga eliminata. Ma in realtà si può anche recuperare fino a 9 elimina con i registri @1attraverso@9 .

    Ancora meglio, se lo fai "1P, allora. in modalità Normale verrà riprodotto "2Pe così via.

    cf. :help .e:help quote_number

  • Se si desidera inserire la data corrente in modalità Inserisci: Ctrl-R=strftime('%y%m%d')Enter .

    cf. :help strftime()

Ancora una volta, cosa può essere fonte di confusione:

  • :@ è un comando da riga di comando che interpreta il contenuto di un registro come vimscript e lo genera
  • @ nel comando in modalità normale che interpreta il contenuto di un registro come sequenze di tasti in modalità normale (tranne quando si utilizza :register, che contiene l'ultimo comando riprodotto senza i due punti iniziali: in questo caso riproduce il comando come se si riscrivessero anche i due punti e la chiave di ritorno finale).

  • " nel comando in modalità normale che ti aiuta a selezionare un registro per yank, incolla, cancella, correggi, ecc.

  • " è anche un nome di registro valido (il registro predefinito o senza nome) e pertanto può essere passato come argomento per i comandi che prevedono nomi di registro

205
Non esiste un badge "Rapporto di lunghezza 100/1 tra risposta e domanda?" :)
Benoit,

8
È un'ottima risposta, ma mancano circa 900 parole a meno di 1400. :)

19
Questa risposta ha cambiato il modo in cui uso vim. Grazie Benoit
P. Myer Nore,

11
Non dimenticare: reg che elencherà tutti i registri insieme al loro contenuto
eugenevd,

3
Nelle versioni recenti di vim, le eliminazioni che sono più piccole di una riga vanno nel "registro delle piccole eliminazioni" invece che nei registri numerati. Riferimenti: Vi e Vim , Vi e Vim , Reddit
Christian Long,

48

Per incollare qualcosa che è negli Appunti di sistema puoi semplicemente usare SHIFT- INS.

Funziona in Windows, ma suppongo che funzioni bene anche in Linux.


7
Sì, funziona anche in Linux. Testato sotto GNOME in Vim e GVim.
Teoulas,

3
Questo in realtà alimenta il pasteboard a Vim come input da tastiera, quindi se sei in modalità normale e incolla :!rm -rf /<cr>, lo eseguirà. Usa invece i registri!
lericson,

4
@lericson Non ho detto nella mia risposta che ciò è utile per qualcosa che si trova nella tastiera di sistema? Non capisco il downvote. E per te, sul serio? Lo hai davvero negli appunti? E non pensi che scrivere shift-inssia più facile di ctrl-R+*? Questo è ovviamente se sei in gvim. Se sei nel terminale collegato a un'altra macchina e vuoi incollare qualcosa dagli appunti, sai qualcosa di meglio di shift-ins? perché i registri non funzionano in quella situazione. Pensa prima di commentare e fare altre cose (come il downvoting).
Skeept,

Penso che sia disinformazione e ho agito su quel giudizio.
lericson,

1
Non funziona per me. Ho appena aggiunto '<S-Insert>' alla mia riga di comando. Forse mi manca qualcosa. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman,

39

"Vorrei incollare il testo strappato nella riga di comando di Vim."

Mentre la risposta più votata è molto completa, preferisco modificare la cronologia dei comandi.

In modalità normale, digitare: q:. Questo ti darà un elenco di comandi recenti, modificabili e ricercabili con normali comandi vim. Inizierai su una riga di comando vuota in fondo.

Per la cosa esatta che l'articolo richiede, incollando una linea strappata (o strappata qualsiasi cosa) in una riga di comando, tira il tuo testo e poi: q:p(entra nella modalità di modifica della cronologia dei comandi, quindi (p) usa il tuo testo strappato in un nuovo comando linea. Modifica a piacere, enterper eseguire.

Per uscire dalla modalità cronologia dei comandi, è l'opposto. Nella modalità normale nella cronologia dei comandi, digitare: :q+enter


1
se stai già modificando un comando esistente e non hai premuto 'q:' premi ctrl + f e si aprirà la possibilità di modificare la cronologia dei comandi.
Clay,

14

Per incollare qualcosa dagli Appunti di sistema nella riga di comando di Vim ("modalità comando"), usa Ctrl+ Rseguito da +. Per me, almeno su Ubuntu, Shift+ Insnon funziona.

PS: Non sono sicuro del motivo per cui Ctrl+ Rseguito da *, che teoricamente è lo stesso di Ctrl+ Rseguito da +non sembra funzionare sempre. Ho cercato e scoperto la +versione e sembra funzionare sempre, almeno sulla mia scatola.


2
La differenza tra Ctrl-r + e Ctrl-r * è che il primo è negli appunti normali, ma in Linux esiste un secondo tipo di appunti chiamato "primario" che rappresenta il testo selezionato più di recente (il pulsante centrale del mouse incolla da esso) . Questo non è disponibile in Windows o MAC
Matias Thayer il

13

Vale la pena notare anche che i registri yank sono gli stessi dei macro buffer. In altre parole, puoi semplicemente scrivere l'intero comando nel documento (incluso lo snippet incollato), quindi "byscriverlo nel bregistro e quindi eseguirlo @b.


1

Stavo avendo un problema simile. Volevo che il testo selezionato finisse in un comando, ma non fare affidamento su incollarlo. Ecco il comando per cui stavo cercando di scrivere una mappatura per:

:call VimuxRunCommand("python")

I documenti per questo plugin mostrano solo l'uso dei valori letterali delle stringhe. Quanto segue verrà interrotto se si tenta di selezionare testo che contiene virgolette doppie:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Per aggirare questo, fai semplicemente riferimento al contenuto della macro usando @:

vnoremap y:call VimuxRunCommand(@")<cr>

Passa il contenuto del registro senza nome e funziona con la mia doppia citazione e le edgecase multilinea.


Penso che al tuo ultimo esempio manchi un ". Forse intendevi VimuxRunCommand (" @ ").
kd8azz,

Ciò invierebbe il @personaggio al comando vimux. pensa @a sfuggire alla seguente doppia citazione e viene trattato come un registro anziché come un carattere normale. L' vnoremapho definito è attivo in modalità visiva, quindi strappa il testo selezionato e quindi lo incolla nel comando vimux, inviandolo a un interprete in esecuzione in un riquadro adiacente. davvero ottimo per lavorare su una sceneggiatura e testarne piccole parti con un paio di battiture.
Conrad.Dean,

1

OS X

Se stai usando Vim in Mac OS X, sfortunatamente viene fornito con una versione precedente e non conforme alle opzioni degli Appunti. Fortunatamente, Homebrew può facilmente risolvere questo problema.

Installa Vim:

brew install vim --with-lua --with-override-system-vi

Installa la versione GUI di Vim:

brew install macvim --with-lua --with-override-system-vi

Riavvia il terminale affinché abbia effetto.


Aggiungi la seguente riga a ~/.vimrc
set clipboard=unnamed

Ora puoi copiare la linea in Vim con yye incollarla a livello di sistema.


1

Per il contesto, queste informazioni provengono da out-of-the-box, nessun plug-in, nessun comportamento .vimrc Vim 7.4 in Linux Mint con le opzioni predefinite.

Puoi sempre selezionare il testo con il mouse (o usando Vo ve posizionando la selezione nel "" registro) e incollarlo nella riga di comando con Shift+ Ctrl+v .

Digitando Ctrl+ rnella riga di comando verrà richiesto un nome registro. quindi digitando :CTRL-r*inserirai il registro dei contenuti * nella riga di comando. Incollerà qualsiasi registro, non solo "*. Vedi :help c_CTRL-R.

Inoltre, il pulsante centrale del mouse verrà incollato nella riga di comando.

Vedere :help->quote-plus una descrizione di come X Window gestisce la selezione. Anche in un Vim semplice e immediato (di nuovo, in Vim 7.4 in Linux Mint, comunque), qualsiasi selezione effettuata con il pulsante sinistro del mouse può essere incollata nella riga di comando con il pulsante centrale del mouse.

Inoltre, il pulsante centrale del mouse incollerà anche il testo selezionato in Vim in molte altre applicazioni X Window, anche quelle della GUI (ad esempio, Firefox e Thunderbird ) e incollando il testo nella riga di comando è possibile anche dove il testo è stato selezionato da altre app .

Vedi: help-> x11-selection per informazioni addl.

tl; dr

Prova prima l'approccio: CTRL-r, quindi usa Shift+ Ctrl+ vo il pulsante centrale del mouse se hai bisogno di qualcos'altro.

È ammesso che può essere fonte di confusione.


0
  1. "[a-z]y: Copia il testo nel registro [az]

  2. Utilizzare :!per andare al comando di modifica

  3. Ctrl+ R: Segui l'identità del registro per incollare ciò che copi.

Era usato per CentOS 7.


Cosa si intende per "Ha usato CentOS 7." ?
Peter Mortensen

0

Se hai due valori inseriti in due diversi registri (ad esempio register ae register b), puoi semplicemente impostare una variabile ced eseguire l'operazione su di essa.

Ad esempio, :set c = str2float(@a) + str2float(@b)quindi puoi incollare il contenuto di cqualsiasi luogo.

Ad esempio mentre si è in modalità INSERT, CTRL + Rquindi digitare =per accedere al registro delle espressioni e digitare semplicemente cdopo il segno di uguale e premere INVIO. Fatto, ora dovresti avere il totale ae i bregistri.

Tutti questi possono essere registrati in una macro e ripetuti!

La str2floatfunzione viene utilizzata se si lavora con float, in caso contrario si otterranno numeri interi.

Non sono sicuro che sia idiomatico, ma ha funzionato nel mio caso in cui dovevo aggiungere 2 numeri di fila e ripeterlo per altre 500 righe.

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.