Как эффективно очистить регистры 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