8
votes

Comment puis-je annuler l'enregistrement Vim qui a déjà commencé, de sorte qu'il n'écrit pas ma macro enregistrée précédente?

I frappé accidentellement qq au lieu de @q , et mon VIM enregistre maintenant dans le registre q . Si je tape q à nouveau, il écrasera la macro précédemment enregistrée.

Y a-t-il un moyen de

  1. Annuler l'enregistrement de sorte que la macro précédente n'est pas écrasée ou
  2. restaurer la macro précédente sans le ré-enregistré à partir de zéro?

0 commentaires

3 Réponses :


10
votes

Vous pouvez récupérer la macro dans un registre différent: xxx

puis la macro précédente sera stockée dans l'enregistrement A et disponible pour être exécutée sous @a .


0 commentaires

2
votes

Je viens de trouver une façon moins directe de faire la chose la même chose aussi, également basée sur l'observation que la macro n'est pas enregistrée tant que le second q . .

J'utilise simplement "qp pour coller la macro quelque part, puis utilisez " qyy pour y remonter après avoir annulé l'enregistrement.


0 commentaires

1
votes

Voici un mappage qui aborde l'enregistrement de macro actuel et restaure le contenu du registre d'origine. Il suffit d'utiliser q! Code> au lieu de q code> pour mettre fin à l'enregistrement macro.

" q!            Abort macro recording without changing the current one.
function! s:AbortMacroRecording()
    " We don't know which register is being recorded, so save them all and find
    " the one by comparing all values.
    let l:registers = split('abcdefghijklmnopqrstuvwxyz', '\zs')
    let l:savedRegisters = map(copy(l:registers), 'getreg(v:val)')

    " Abort macro recording.
    normal! q

    for l:idx in range(len(l:registers))
        let l:reg = l:registers[l:idx]
        let l:contents = l:savedRegisters[l:idx]
        if getreg(l:reg) !=# l:contents
            call setreg(l:reg, l:contents)
            echo printf('Aborted recording into register %s; macro is: %s', l:reg, strtrans(l:contents))
            return
        endif
    endfor

    echomsg "Couldn't detect recorded register"
endfunction
nnoremap <silent> q! :<C-u>call <SID>AbortMacroRecording()<CR>


0 commentaires