Как эффективно очистить регистры vim?

Регистры в vim - отличная функция для хранения текстовых фрагментов и даже для запуска команд в сохраненном в них тексте. Тем не менее, я аккуратный человек и, как правило, чистить вещи, когда я закончил.

Я знаю, что если бы я хотел очистить регистр a, я могу использовать q a q.

Я также могу выполнить следующую команду:

:let @a = ''

Однако эти решения кажутся просто обходным решением проблемы. Когда я выполняю :registers, список все еще показывает регистр a (с пустым значением), в то время как регистры, которые в противном случае никогда не использовались, не отображаются.

Есть ли способ очистить регистр с побочным эффектом удаления регистра из этого списка?

И если да, существует ли способ очистить сразу все регистры, т.е. до reset того списка регистров?

Ответ 1

AFAIK вы не можете использовать встроенные команды/функции, чтобы регистры исчезли из списка. Это кажется выполнимым только путем удаления их из вашего ~/.viminfo, который звучит немного экстремально.

этот поток в списке рассылки vim имеет команду, которая очищает каждый регистр, но не удаляет их из :reg:

let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"' | let i=0 | while (i<strlen(regs)) | exec 'let @'.regs[i].'=""' | let i=i+1 | endwhile | unlet regs

Ответ 2

Поскольку этот почтенный ответ в списке рассылки, связанный @romainl, у нас есть setreg('a', []), который очищает регистр.

Таким образом, код может стать:

let regs=split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"', '\zs')
for r in regs
  call setreg(r, [])
endfor

Ответ 3

Удалите файл .viminfo или удалите строку регистра в файле .viminfo.

Вы можете получить информацию от Здесь:

The viminfo file is used to store:
- The command line history.
- The search string history.
- The input-line history.
- Contents of non-empty registers.
- Marks for several files.
- File marks, pointing to locations in files.
- Last search/substitute pattern (for 'n' and '&').
- The buffer list.
- Global variables

Ответ 4

Можно установить значение для каждого используемого регистра, похожего на подход romainl:

function! ClearRegisters()
   redir => l:register_out
   silent register
   redir end
   let l:register_list = split(l:register_out, '\n')
   call remove(l:register_list, 0) " remove header (-- Registers --)
   call map(l:register_list, "substitute(v:val, '^.\\(.\\).*', '\\1', '')")
   call filter(l:register_list, 'v:val !~ "[%#=.:]"') " skip readonly registers
   for elem in l:register_list
      execute 'let @'.elem.'= ""'
   endfor
endfunction

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

Ответ 5

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

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

и очистите каждый регистр с помощью :WipeReg

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

autocmd VimEnter * WipeReg

Ответ 6

Другой вариант - никогда не загружать регистры. Как говорили другие, регистры загружаются из .viminfo. Флаг -i используется для указания файла viminfo для использования. Если вы укажете NONE, no viminfo и, следовательно, не будут загружены регистры.

vim -i NONE