Como posso visualizar e editar minha gravação (ou seja, macro gravada)?


39

Estou usando repetições complexas para registrar minhas operações ( qqpara gravar, algumas operações , qpara parar) e cometi um erro.

É possível ver o que gravei e corrigir o erro, em vez de fazê-lo novamente?

Invocar caracteres gravados por @qobras, mas não consigo vê-los em meus mapeamentos ( :map q- No mapping found).

E não há muita informação na ajuda digitando: :help recording.

Respostas:


42

Nota: Presumo que você esteja usando o aregistro para obter toda a resposta, mas você pode usar qualquer registro

Nota 2: <1b>é Esc; você pode inserir isso com Ctrl+ve então Esc. Também pode aparecer como ^[(dependendo da displayconfiguração).


Não é um mapeamento; então faz sentido que :mapnão funcione. Ele é gravado em um registro e você pode vê-lo e editá-lo como qualquer outro registro.

Tudo o que qfaz é "limpar este registro e acrescentar qualquer pressionamento de tecla" , e tudo o que @faz é "avaliar um registro como comandos" .

Não há nada "diferente" em uma macro; você pode chamar qualquer registro como uma macro.


Para visualizar basta usar:

:echo @a

Assim como qualquer registro.

Você também pode usar :registerspara visualizar todos os registros.


Para editar, você pode fazer várias coisas:

A maneira mais simples de você apenas atribuir @a, da seguinte maneira:

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

Isso iniciará o modo de inserção ( i), inserção asde Escape de volta ao modo normal.

Isso não é muito útil para edição extensa; você pode usar funções (ou seja substitute(),) ou talvez acrescentar algo ( :let @a=@a . 'more'), mas alterar algo no meio não é tão fácil.

Descobri que a melhor maneira disso é iniciar um novo buffer com :splitou :tabneweditar o registro, inserindo-o ali, editando-o e copiando-o novamente.

Você pode usar o "apque irá inserir o texto no buffer (onde aestá o seu registro):

iThis is A<1b>

Agora posso mudar a linha para talvez:

iThis is an edited macro<1b>

Então eu faço ^v$"aypara puxar (copiar) esta linha para o aregistro:

  • ^ para o início da linha
  • v para modo visual
  • $ para fim de linha
  • "ay puxe a seleção para registrar a

Se desejar, você pode fazer isso sem usar o modo visual com ^"ay$.

Agora você pode usar @a, como se isso fosse o que você gravou originalmente.

Você também pode usar yy, e então @", o que é um pouco mais rápido. Isso também copiará a nova linha à direita e poderá causar efeitos colaterais ... Outra maneira de tornar isso mais rápido é usar uma macro :-)


2
Eu observaria que puxar um movimento de linha em seu registro terá o efeito colateral de incluir um caractere de nova linha, como se você tivesse pressionado Enterno final de sua gravação. Em muitos casos, isso pode ser benigno, mas em cenários em que você criou cuidadosamente a posição do cursor no final da gravação, isso pode afetar a repetibilidade.
22415 TommyCdo:

@tommcdo Direito; você pode simplesmente usar ve selecionar a linha inteira (sem a nova linha).
Martin Tournoij 13/02/2015

@Carpetsmoker " v^$"aypara puxar (copiar) esta linha para o aregistro." Isso não deveria ^acontecer antes ve com $você ainda não está copiando a nova linha? Eu acho que deveria ser: 0v$h"ay(sim dolorosamente longo!)
joeytwiddle

2
@joeytwiddle não, $passa para o final da linha, mas não inclui a nova linha. É a diferença entre 0y$e yy. Colocar hapós o $que significa apenas que você sentiria falta do último personagem.
28515 evilsoup

Uma coisa que você pode fazer para tornar a edição: permita que os comandos @ a = type sejam mais editáveis ​​com facilidade, digite: <Ctrl-f>, selecione e edite a linha em questão (a última linha, que é o padrão, se você estiver editando o última linha que você inseriu) usando o vim como de costume. Pressione Enter quando terminar de executar a linha ou <Ctrl-c> para sair.

9

Para conseguir algo para trabalhar ...

qajjjq

Começará a gravar uma macro no aregistro.

Você pode ver muitos dos seus registros atuais (usados ​​para macros, arrancar, excluir etc.) com o :regcomando ou pode especificar um registro para exibir fornecendo seu nome. Por exemplo, para mostrar o registro a:

:reg a

rendimentos

--- Registers ---
"a   jjj

Você pode anexar a um registro nomeado existente usando a letra maiúscula correspondente. Isso funciona não apenas para gravar macros, mas também para puxar. Por exemplo:

qAkkkq
:reg a

rendimentos

--- Registers ---
"a   jjjkkk

Se você deseja usar a sintaxe let para editar uma macro existente, é possível:

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

que será expandido para

let @a='jjjkkk'

e você pode alterar as teclas individuais.

Observe que você pode usar o <C-r>(ou seja, control + r) para colar de qualquer registro no modo de linha de comando (ou no modo de inserção, nesse caso).

Além disso, quando você estiver no modo de linha de comando, se você digitar <C-f>, a janela da linha de comando será exibida, na qual você poderá ver / editar comandos anteriores emitidos e editar seu comando atual antes de chamá-lo. Pressione enter no comando que você deseja enviar.

A vantagem disso é que você pode usar seus comandos normais de movimento / substituição dentro desse buffer para editar sua macro. Por exemplo:

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

trará à tona:

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

Se você estiver no comando 120, poderá:

s/kkk/}
<return>
:reg a

rendimentos

--- Registers ---
"a   jjj}

Obviamente, você pode colar o conteúdo do registro no seu buffer e alterá-lo lá. Mas você pode fazer tudo o que precisa sem contaminar seu buffer de trabalho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.