Come posso visualizzare e modificare la mia registrazione (ovvero macro registrata)?


39

Sto usando ripetizioni complesse per registrare le mie operazioni ( qqper registrare, alcune operazioni , qper interrompere) e ho fatto un errore.

È possibile vedere ciò che ho registrato e correggere l'errore, invece di farlo di nuovo?

Invocare personaggi registrati per @qlavori, ma non riesco a vederlo nei miei mapping ( :map q- No mapping found).

E non ci sono molte informazioni in aiuto digitando: :help recording.

Risposte:


42

Nota: suppongo che tu stia utilizzando il aregistro per l'intera risposta, ma puoi utilizzare qualsiasi registro

Nota2: <1b>è Esc; puoi inserirlo con Ctrl+ve poi Esc. Potrebbe anche apparire come ^[(a seconda displaydell'impostazione).


Non è una mappatura; quindi ha senso che :mapnon funzioni. È registrato in un registro e puoi vederlo e modificarlo come qualsiasi altro registro.

Tutto ciò che qfa è "cancella questo registro e accoda qualsiasi sequenza di tasti" , e tutto ciò che @fa è "valuta un registro come comandi" .

Non c'è niente di "diverso" in una macro, puoi invocare qualsiasi registro come macro.


Per visualizzare basta usare:

:echo @a

Proprio come qualsiasi registro.

È inoltre possibile utilizzare :registersper visualizzare tutti i registri.


Per modificare puoi fare diverse cose:

Il modo più semplice in cui ti devi assegnare @a, in questo modo:

:let @a='iasd<1b>'

Ciò avvierà la modalità di inserimento ( i), l'inserimento asde il ritorno alla modalità normale.

Questo non è molto utile per modifiche estese; potresti usare le funzioni (es. substitute()) o forse aggiungere qualcosa ( :let @a=@a . 'more'), ma cambiare qualcosa nel mezzo non è così facile.

Ho scoperto che il modo migliore per farlo è avviare un nuovo buffer con :splito :tabnewe modificare il registro inserendolo lì, modificandolo e copiandolo nuovamente.

Puoi usare "apquale inserirà il testo nel buffer (dov'è il atuo registro):

iThis is A<1b>

Ora posso solo cambiare la linea in forse:

iThis is an edited macro<1b>

Quindi faccio ^v$"ayper strappare (copiare) questa riga al aregistro:

  • ^ per l'inizio della linea
  • v per la modalità visiva
  • $ per fine linea
  • "ay tira la selezione per registrarti a

Se lo desideri, puoi farlo senza usare la modalità visiva con ^"ay$.

Ora puoi usare @a, come se questo fosse ciò che hai registrato in origine.

Puoi anche solo usare yy, e quindi @", che è un po 'più veloce. Questo copierà anche la nuova riga finale, e potrebbe causare effetti collaterali ... Un altro modo per renderlo più veloce è usare una macro :-)


2
Vorrei notare che inserire un movimento lineare nel registro avrà un effetto collaterale nell'includere un carattere di nuova riga, come se si fosse premuto Enteralla fine della registrazione. In molti casi questo potrebbe essere benigno, ma in scenari in cui hai accuratamente creato la posizione del cursore alla fine della registrazione, ciò può influire sulla ripetibilità.
Tommaso,

@tommcdo Right; puoi semplicemente usare ve selezionare l'intera riga (senza la nuova riga).
Martin Tournoij,

@Carpetsmoker " v^$"ayper copiare (copiare) questa riga nel aregistro." Non dovrebbe ^venire prima del v, e con $non stai ancora copiando la nuova riga? Penso che dovrebbe essere: 0v$h"ay(sì, dolorosamente lungo!)
joeytwiddle,

2
@joeytwiddle no, si $sposta alla fine della riga, ma non include la nuova riga. È la differenza tra 0y$e yy. Mettere hdopo il $significherebbe solo che ti mancherebbe l'ultimo personaggio.
evilsoup,

Una cosa che puoi fare per rendere la modifica: let @ a = type comandi più facilmente modificabili è digitare: <Ctrl-f>, selezionare e modificare la riga in questione (l'ultima riga, di default, se stai modificando il ultima riga inserita) usando vim come al solito. Premi Invio al termine per eseguire la riga o <Ctrl-c> per uscire.

9

Per ottenere qualcosa con cui lavorare ...

qajjjq

Inizierà a registrare una macro nel aregistro.

Puoi vedere molti dei tuoi attuali registri (usati per macro, strappi, cancellazioni, ecc.) Con il :regcomando, oppure puoi specificare un registro da visualizzare fornendo il suo nome. Ad esempio, per mostrare il registro a:

:reg a

i rendimenti

--- Registers ---
"a   jjj

È possibile aggiungere a un registro denominato esistente utilizzando la lettera maiuscola corrispondente. Questo funziona non solo per la registrazione di macro, ma anche per lo strappo. Per esempio:

qAkkkq
:reg a

i rendimenti

--- Registers ---
"a   jjjkkk

Se si desidera utilizzare la sintassi let per modificare una macro esistente, è possibile effettuare:

let @a='<C-r>a'

che si espanderà a

let @a='jjjkkk'

e puoi quindi cambiare i singoli tasti.

Nota che puoi usare <C-r>(cioè control + r) per incollare da qualsiasi registro in modalità riga di comando (o in modalità insert, per quella materia).

Inoltre, quando ci si trova in modalità riga di comando, se si digita <C-f>questo si aprirà la finestra della riga di comando, in cui è possibile visualizzare / modificare i comandi passati emessi e è possibile modificare il comando corrente prima di chiamarlo. Premi Invio sul comando che desideri inviare.

Il vantaggio di questo è che puoi usare i tuoi normali comandi di movimento / sostituzione all'interno di questo buffer per modificare la tua macro. Per esempio:

let @a='<C-r>a'<C-f>

farà apparire:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Se sei al comando 120, puoi fare:

s/kkk/}
<return>
:reg a

i rendimenti

--- Registers ---
"a   jjj}

Ovviamente puoi incollare il contenuto del registro nel tuo buffer e modificarlo lì. Ma puoi fare tutto il necessario senza contaminare il buffer di lavoro.

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.