Vim - 변경되지 않은 경우 숨겨진 버퍼 삭제

Vim - 변경되지 않은 경우 숨겨진 버퍼 삭제

나는 다른 Vim 버퍼에 열려 있는 파일 사이를 전환하는 경향이 있습니다.

파일 간을 빠르게 전환할 때(예: 빠른 수정 목록, 결과 확인, 태그) 파일이 열렸다가 즉시 숨겨지는 경우가 많습니다. 그러나 버퍼는 계속 열려 있어 열려 있는 버퍼 목록이 오염됩니다.

버퍼가 어떤 방식으로든 수정되지 않은 경우 버퍼가 숨겨지지 않고 닫히도록 설정하려면 어떻게 해야 합니까?

답변1

대부분의 경우 단점이 있으므로 이에 대한 훌륭한 해결책은 없습니다.

시도해 볼 수 있습니다 :set bufhidden=delete(참조'bufhidden'자세한 내용을 알아보세요. ) 이것은 당신이 원하는 것과 매우 비슷해 보입니다.

그러나 'bufhidden'설정은 버퍼에 대해 로컬이므로 각각의 새 버퍼에 대해 설정해야 하거나 설명하는 대로 수명이 짧게 유지되도록 해야 합니다. 숨길 때 버퍼를 삭제해야 하는 기준에 따라 이러한 버퍼 중 하나 또는 여러 개에서 autocmd이 작업을 수행 할 수 있습니다.

또한 Vim 문서에서는 이 옵션을 사용하지 말 것을 강력히 권고하고 있습니다!

주의 깊은:unload, delete또는 를 사용하면 wipe버퍼의 변경 사항이 경고 없이 손실됩니다. 또한 이러한 값은 버퍼 간을 일시적으로 전환하는 자동 명령을 중단할 수 있습니다.

그럼 이건 아마도 쓸데없는 시작이겠지...

또한 :set nobuflisted(참조'buflisted', 버퍼가 존재하는 경우 :ls출력에 나열되지 않습니다.

또한 버퍼에 대해 로컬이므로 autocmd새 버퍼에 설정해야 합니다.

이것은 그다지 위험해 보이지 않으며 거의 ​​원하는 대로 작동하는 것 같습니다. 하지만 이건 심지어 목록에서 제외됩니다현재의버퍼 또는 열린 창의 버퍼이므로 기본적으로 :ls항상 비어 있으므로 쓸모가 없게 됩니다. 이 경우 버퍼를 유지하는 것보다 실제로 더 낫습니까?

마지막으로 대규모 작업(예: 관련 또는 빠른 수정) 후에 버퍼를 정리할 수 있으며 :args작업을 완료하고 모든 것을 저장한 후에는 다음을 사용할 수 있습니다.

:%bd

이렇게 하면 모든 버퍼가 닫히고 편집할 수 있는 새 빈 파일이 남습니다. (문서 참조:bdelete.)

이것은 새로운 것으로 전환하고 적은 수의 버퍼만 유지하여 :bnext파일 이름이나 친구의 짧은 하위 문자열을 사용하여 버퍼 간에 빠르게 전환할 수 있기를 원할 때 유용한 명령이 될 수 있습니다.

답변2

이것이 제가 생각해낸 것이며 지금까지는 만족스럽습니다.

" Unlist unchanged buffers if they are hidden
function! BufferUnchanged()
  return exists("b:undo_seq_load") && b:undo_seq_load==changenr()
endfunction
function! UnlistUnchangedBuffer()
  if BufferUnchanged()
    set nobuflisted
  endif
endfunction
" Save the undo sequence position on buffer load
autocmd BufReadPost * let b:undo_seq_load=changenr()
autocmd BufWinLeave * call UnlistUnchangedBuffer()

관련 정보