1

Как я могу удалить значения, связанные со всеми регистрами в vim?

Я нашел этот фрагмент в Интернете:

function! ClearRegisters()
    let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-="*+'
    let i=0
    while (i<strlen(regs))
        exec 'let @'.regs[i].'=""'
        let i=i+1
    endwhile
endfunction

command! ClearRegisters call ClearRegisters()

Это почти работает, но он помещает пустое значение в каждый регистр, а не удаляет регистр. Важно то, что когда вы затем используете команду :registers , все регистры все еще присутствуют, что делает отображение громоздким (хотя стоит отметить, что если вы выйдете из vim и перезагрузите его, регистры будут полностью очищены, даже если viminfo настроен на их сохранение).

Как я могу полностью удалить все регистры, чтобы :registers не отображали их и не нуждались в перезапуске?

2 ответа2

2

В отличие от меток, которые имеют команду :delmarks и специальное значение "не установлено", регистры не могут быть удалены. Пустой регистр ближе всего к "неиспользованному" состоянию, которое вы можете получить. (Однако Vim и команда :registers имеют особое поведение, которое вы наблюдали, когда неинициализированные регистры, которые не были восстановлены из файла viminfo , пропускаются в выходных данных.)

Я думаю, что вы предпочитаете расширенную :Registers пользовательскую команду (вы можете даже присвоить псевдоним этой исходной команде в нижнем регистре с помощью :cmap или плагина cmdalias ), которая пропускает пустые регистры из своего вывода, например так:

function! s:Registers( arguments )
    redir => l:registersOutput
        silent! execute 'registers' a:arguments
    redir END
    for l:line in split(l:registersOutput, "\n")
        if l:line !~# '^"\S\s*$'
            echo l:line
        endif
    endfor
endfunction
command! -nargs=? Registers call <SID>Registers(<q-args>)

В качестве альтернативы вы можете написать патч Vim для введения команды :delregisters . Это не должно быть слишком сложно, чтобы написать; он в основном должен установить для структуры y_regs[i].y_array NULL (см. ops.c в исходном коде Vim).

1

Поместите это в ваш .vimrc:

command! WipeReg for i in range(34,122) | silent! call setreg(nr2char(i), []) | endfor

и очистите все регистры с помощью :WipeReg

Если вы хотите, чтобы это происходило каждый раз при запуске Vim, также добавьте:

autocmd VimEnter * WipeReg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .