Come posso usare i registri di VIM?


926

Conosco solo un'istanza che utilizza i registri è tramite la CtrlR*quale incollare il testo dagli appunti.

Quali sono gli altri usi dei registri? Come usarli?

Tutto quello che sai sui registri VI (concentriamoci su vi 7.2) - condividi con noi.


22
Ho dato una lunga risposta sull'uso dei registri
Benoit,

Risposte:


1186

I registri in Vim ti consentono di eseguire azioni o comandi sul testo memorizzato al loro interno. Per accedere a un registro, digitare "aprima di un comando, dove si atrova il nome di un registro. Se si desidera copiare la riga corrente nel registro k, è possibile digitare

"kyy

Oppure puoi aggiungere a un registro usando una lettera maiuscola

"Kyy

È quindi possibile spostarsi nel documento e incollarlo altrove utilizzando

"kp

Per incollare dagli Appunti di sistema su Linux

"+p

Per incollare dagli Appunti di sistema su Windows (o dagli Appunti "evidenziazione del mouse" su Linux)

"*p

Per accedere a tutti i registri attualmente definiti digitare

:reg

165
Ed "+è un registro speciale che fa riferimento agli Appunti di sistema.
Aaron McDaid,

17
In Windows, è possibile accedere agli Appunti con "*; così diventa il comando da copiare fino alla fine del file "*yG.
MP Aditya,

44
In X (Linux, forse anche OS-X), *è presente negli Appunti "evidenziazione del mouse", ed +è negli Appunti Ctrl-XCV.
dotancohen,

20
C'è un modo per aggiungere al registro degli appunti (dal momento che non c'è capitale +)?
naitsirhc,

8
@dotancohen Tecnicamente si chiama selezione PRIMARIA, ma immagino che "il mouse higlight" sia più facile da ottenere per le persone :)
kyrias,

783

Mi ha fatto piacere quando ho scoperto il 0registro. Se si strappa il testo senza assegnarlo a un determinato registro, verrà assegnato al 0registro, oltre a essere salvato nel "registro predefinito . La differenza tra i registri 0e "è che 0è popolata solo con il testo strappato, mentre il registro predefinito è anche popolato con il testo cancellato usando i comandi d/ D/ x/ X/ c/ C/ s/ S.

Lo trovo utile quando voglio copiare del testo, eliminare qualcosa e sostituirlo con il testo copiato. I seguenti passaggi illustrano un esempio:

  • Strappi il testo con cui vuoi copiare y[motion]: questo testo viene salvato "e 0registrato
  • Elimina il testo che desideri sostituire d[motion]: questo testo viene salvato nel "registro
  • Incolla il testo strappato con "0p

dov'è "il comando per usare un registro per il comando successivo.

Nel passaggio finale, se dovessi incollare dal registro predefinito (con p), utilizzerebbe il testo che hai appena eliminato (probabilmente non quello che volevi).

Si noti che po Ppaste dal registro predefinito. L'equivalente longhand sarebbe ""p(o ""P) e "0contiene l'ultimo yank, "1contiene l'ultima cancellazione o modifica.

Per maggiori informazioni vedi :help registers.


17
po Ppaste dal registro predefinito. L'equivalente longhand sarebbe ""p(o ""P).
Nelstrom,

186
A proposito, allo stesso modo "0 contiene l'ultimo yank", 1 contiene l'ultimo elimina o modifica.
FireAphis,

6
"è il comando per utilizzare un registro per il comando successivo. Quindi ""puserei il "registro per il comando incolla e "0puserei il 0registro.
Ramon Marco L. Navarro,

5
0psignificherebbe passare al primo carattere della riga corrente e incollare dal contenuto del registro predefinito ( "). "psarebbe un comando incompleto poiché è necessario specificare per quale comando utilizzare il registro p.
Ramon Marco L. Navarro,

15
Allo stesso modo "1 contiene l'ultima eliminazione", 2 contiene la seconda ultima eliminazione, "3 contiene la terza ultima, ecc. Fino a" 9
James,

331

Una delle mie parti preferite sui registri è usarle come macro!

Supponiamo che tu abbia a che fare con un file di valori delimitato da tabulazione in quanto tale:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Ora decidi che devi aggiungere un segno di percentuale alla fine del campo% Dev (a partire dalla seconda riga). Faremo una semplice macro nel mregistro (selezionato arbitrariamente) come segue:

  1. Premere:: qmper avviare la registrazione della macro nel mregistro.

  2. EE: Vai alla fine della terza colonna.

  3. a: Modalità di inserimento da aggiungere alla fine di questa colonna.

  4. %: Digita il segno di percentuale che vogliamo aggiungere.

  5. <ESC>: Torna in modalità comando.

  6. j0: Vai all'inizio della riga successiva.

  7. q: Interrompe la registrazione di macro

Ora possiamo semplicemente digitare @mper eseguire questa macro sulla riga corrente. Inoltre, possiamo digitare @@per ripetere o 100@mper farlo 100 volte! La vita sembra abbastanza buona.

A questo punto dovresti dire: " MA ASPETTA, CHE COSA DOVREBBE FARE CON I REGISTRI ?"

Punto eccellente. Analizziamo cosa c'è nel contenuto del mregistro digitando "mp. Otteniamo quindi quanto segue:

EEa%<ESC>j0

All'inizio sembra che tu abbia aperto accidentalmente un file binario nel blocco note, ma a un secondo sguardo, è l'esatta sequenza di caratteri nella nostra macro!

Sei una persona curiosa, quindi facciamo qualcosa di interessante e modifichiamo questa riga di testo per inserire un !vecchio anziché noioso %.

EEa!<ESC>j0

Quindi inseriamo questo nel nregistro digitando B"nyE. Quindi, solo per i calci, eseguiamo la nmacro su una riga dei nostri dati usando @n....

OMG, AGGIUNTO A !

Essenzialmente, eseguire una macro è come premere l'esatta sequenza di tasti nel registro di quella macro. Se questo non è un bel trucco del registro, mi mangerò il cappello.


65
Questo è totalmente chiave. Fino ad ora non ho notato che i registri sono gli stessi dei buffer di macro. Ciò significa che puoi semplicemente archiviare tutte le tue macro nel testo, strapparle ed eseguirle. Abbastanza bello, e un po 'strano. Molto Vim.
naught101

1
È una nota editoriale minore, ma quel capslock con grassetto ... Potrebbe essere stato corretto. È abbastanza odioso al momento.
ashrasmun,

1
Puoi usare +invece di j0andare al primo carattere non vuoto nella riga successiva.
Gokul,

100

Altri registri utili:

"*oppure "+- il contenuto degli Appunti di sistema

"/ - ultimo comando di ricerca

": - ultimo comando.

Nota con le macro vim, puoi modificarle, poiché sono solo un elenco delle sequenze di tasti utilizzate durante la registrazione della macro. Quindi puoi scrivere in un file di testo la macro (usando "apper scrivere la macro a ) e modificarli e caricarli in un registro con "ay$. Bel modo di memorizzare macro utili.


6
Vim predefinito su OSX non include "* integrazione. Puoi installare una versione da homebrew-alt che lo fa. Verifica con vim --version- -clipboardsignifica che non ce l'hai, +clipboardsignifica che lo fai.
Xavier Shay

15
In X11, "*e "+sono ancora più interessanti: "+incolla l'ultimo testo copiato con ctrl+c(copia buffer), o qualsiasi altra scorciatoia usi (o right-click>copy). "*incolla l'ultimo testo evidenziato con il mouse (buffer di selezione). Quindi se copi qualcosa con ctrl+ce poi evidenzi qualcos'altro con il mouse, puoi scegliere quale incollare. Questo non funziona in Windows, dove questi due registri sono sinonimi.
naught101

1
Ti benedico, ho cercato "*e "+per anni! Pensavo che solo gvim avesse accesso agli Appunti di sistema, ma a quanto pare anche Vim apparentemente regolare!
Tarrasch,

@Tarrasch Se usi la console vim invece di gvim scoprirai molte altre cose. Penso. visita #vim anche su freenode!
trusktr,

1
Come abilitare se uno ha -xterm_clipboardacceso vim --version. Qualche pacchetto semplice da installare? (debian / apt-get). Grazie.
Dr Beco,

77

Il registro del buco nero _ è quello /dev/nulldei registri.

Lo uso nel mio vimrc per consentire l'eliminazione di singoli caratteri senza aggiornare il registro predefinito:

noremap x "_x

e per incollare in modalità visiva senza aggiornare il registro predefinito:

vnoremap p "_dP

Anche la seconda mappatura è molto utile. Vedi qui per una spiegazione: marcorucci.com/blog/#visualModePaste
mrucci

21
la mappatura di xdiventa meno conveniente per trasporre caratteri.
Skeept

Premendo x non si cancella l'ultima cosa che hai strappato, che troverai nel registro 0. Premi xa alcune volte, quindi "0p per incollare le cose che hai strappato.
trusktr,

2
Per espandere l'osservazione di skeept sopra: con questa xmappatura non è più possibile eseguire il xp"comando" per cambiare la corrente con il carattere successivo. Abbastanza utile per le correzioni di errori di battitura. Dobbiamo anche Xpcambiare la corrente con il personaggio precedente.
Daniel Andersson,

56

Se vuoi incollare il contenuto del registro in un comando ex-mode, premi <C-r><registerletter>.

Perché dovresti usare questo? Volevo fare una ricerca e sostituire una stringa longish, quindi l'ho selezionata in modalità visiva, ho iniziato a digitare l'espressione di ricerca / sostituzione :%s/[PASTE YANKED PHRASE]//ge sono andata avanti la mia giornata.

Se vuoi solo incollare una sola parola in modalità ex, puoi assicurarti che il cursore sia su di essa prima di entrare in modalità ex, e quindi <C-r><C-w>premere in modalità ex per incollare la parola.


6
Incollare il testo nella :riga di comando è la cosa migliore che ho imparato oggi
Shahbaz,

1
Puoi anche usare <CR> <registerletter> in modalità insert
Floegipoky il

1
Mi piace scrivere trova / sostituisci regexes prima con just /[write out your regex]<cr>e poi per sostituire just s/<C-R>//replacement/. In questo modo ottieni il vantaggio di un feedback dal vivo sul tuo regex prima di eseguire la sostituzione.
GabeIsman,

44

Penso che il registro del guru segreto sia espressione = registro. Può essere utilizzato per i mapping creativi.

:inoremap  \d The current date <c-r>=system("date")<cr>

Puoi usarlo insieme al tuo sistema come sopra o ottenere risposte da funzioni personalizzate VimL ecc.

o semplicemente cose ad hoc come

<c-r>=35+7<cr>

3
Guarda il video di Derek Wyatt [video sull'uso del registro delle espressioni] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim


39

Un trucco interessante è usare "1pper incollare l'ultima cancellazione / modifica (, e poi usare .ripetutamente per incollare le successive cancellazioni. In altre parole, "1p...è sostanzialmente equivalente a "1p"2p"3p"4p.

Puoi usarlo per invertire una manciata di righe: dddddddddd"1p....


aha questo è fantastico. Quello che voglio davvero è lo stesso comportamento per gli
yank

18

Dalla pagina di aiuto di vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5 registra le modifiche nel registro 5 (il successivo q interrompe la registrazione)
  • : reg mostra tutti i registri e tutti i contenuti in essi contenuti
  • @ 5 esegue la macro del registro 5 (modifiche registrate)

15
Non mi piace il tasto @ per avviare le macro (tre battute). Quindi ho mappato F2 per lanciare la macro memorizzata nel registro q: nmap <F2> @q uso il registro q, perché poi per salvare una macro per la riproduzione di F2, ho appena premuto qq. salvataggio e riproduzione rapida delle macro.
Andrej Panjkov,

16

Uso il registro predefinito per grep per il testo nella mia finestra di vim senza dover raggiungere il mouse.

  1. yank text
  2. :!grep "<CTRL-R>0"<CR>

12

Usa i registri nei comandi con @. Per esempio:

echo @a
echo @0
echo @+

Mettili al comando:

let @a = 'abc'

Ora "apincollerà abc.


8

Una grande fonte di confusione è il registro predefinito ". È importante sapere come funziona. È molto meglio se il registro predefinito viene evitato la maggior parte delle volte. La spiegazione dalla documentazione di Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Quindi il registro predefinito è in realtà un puntatore all'ultimo registro usato. Quando si elimina o si strappa qualcosa, questo registro punta ad altri registri. Puoi verificarlo controllando i registri. C'è sempre un altro registro che è esattamente uguale al registro predefinito: il registro yank ( "0), il primo registro delete ( "1), il piccolo registro register ( "-) o qualsiasi altro registro che è stato usato per cancellare o yank.

L'unica eccezione è il registro del buco nero. Vim doc dice:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Di solito si sta molto meglio utilizzando direttamente: "0, "-e "1-"9registri di default o nei registri di nome.


8

Un registro trascurato è il '.' dot dot che contiene l'ultimo testo inserito, non importa come sia stato inserito, ad es. ct] (cambia fino a]). Quindi ti rendi conto che è necessario inserirlo altrove ma non è possibile utilizzare il metodo di ripetizione punto.

 :reg .
 :%s/fred/<C-R>./

7

Il mio registro preferito è il ':'registro. L'esecuzione @:in modalità normale mi consente di ripetere il comando ex precedentemente eseguito.


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.