如何取消已经开始的vim录制,以便它不会覆盖我之前录制的宏?

时间:2014-03-15 01:30:48

标签: vim macros

我不小心点击qq而不是@q,而我的vim现在正在注册q。 如果我再次输入q,它将覆盖以前录制的宏。

有没有办法

  1. 取消录制,以便不覆盖上一个宏或
  2. 还原以前的宏而无需从头开始重新录制吗?

3 个答案:

答案 0 :(得分:7)

您可以将宏备份到另一个寄存器中:

:let @a=@q

然后,前一个宏将存储在寄存器a中,并可以@a运行。

答案 1 :(得分:2)

我刚刚发现了一种不太直接的做同样事情的方法,也是基于观察到直到第二个q才记录宏。

我只是使用"qp将宏粘贴到某处,然后在我取消录制后使用"qyy将其重新拉回来。

答案 2 :(得分:0)

这是一个映射,用于中止当前宏记录并恢复原始寄存器内容。只需使用q!代替q即可结束宏录制。

" 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>