webdevqa.jp.net

vimレジスタを効果的にクリアする方法は?

Vimのレジスターは、テキストスニペットを保存し、その中に保存されているテキストに対してコマンドを実行するための優れた機能です。しかし、私はきちんとした人であり、私が終わったときに物事をきれいにする傾向があります。

レジスタaをクリアしたい場合、使用できることを知っています qaq

次のコマンドも実行できます。

:let @a = ''

ただし、これらの解決策は、問題に対する単なる回避策のようです。 :registersを実行しても、リストにはレジスタa(空の値)が表示されますが、使用されたことのないレジスタは表示されません。

このリストからレジスタを削除する副作用があるレジスタをクリアする方法はありますか?

もしそうなら、すべてのレジスタを一度にクリアする方法、つまりそのレジスタのリストをリセットする方法はありますか?

52
Robin Klose

@ romainl でリンクされたメーリングリストでの由緒ある回答なので、レジスタをクリアするsetreg('a', [])があります。

したがって、コードは次のようになります。

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

.viminfoファイルを削除するか、.viminfoファイルのレジスタ行を削除してください。

詳細は Here から取得できます。

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
6
Marslo

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
mMontu