Vim: Удалить буфер при выходе из разделенного окна - PullRequest
3 голосов
/ 24 декабря 2010

У меня есть очень полезная функция в моем .vimrc:

function! MyGitDiff()
  !git cat-file blob HEAD:% > temp/compare.tmp
  diffthis
  belowright vertical new
  edit temp/compare.tmp
  diffthis
endfunction

Что он делает, в основном открывает файл, над которым я сейчас работаю, из репозитория в вертикальном окне, а затем сравнивает его с ним. Это очень удобно, так как я могу легко сравнить изменения с исходным файлом.

Однако есть проблема. После окончания сравнения я удаляю разделенное окно, набрав: q. Это, однако, не удаляет буфер из списка буферов, и я все еще могу видеть файл compare.tmp в списке буферов. Это раздражает, потому что всякий раз, когда я делаю новое сравнение, я получаю это сообщение:

Предупреждение. Файл "temp / compare.tmp" изменился с момента начала редактирования.

Есть ли способ удалить файл из буферов, а также закрыть вертикальное разделенное окно?

Ответы [ 3 ]

1 голос
/ 25 декабря 2010

Я обычно определяю следующие вещи для diff-buffers :

  setlocal bt=nofile bh=wipe nobl noswf ro
  nnoremap <buffer> q :bw<cr>

Первая строка - это то, что будет иметь значение в вашем случае (:h 'bh' -> не нужнооднократная автозапуск выполнения), вторая строка - просто ярлык.

Кстати: используйте r! git вместо создания временного файла.Таким образом, вам также не придется очищать этот файл.

1 голос
/ 25 декабря 2010

Вам нужно использовать autocmd winleave bd (удаление буфера).Имейте в виду, что если у вас открыт буфер более чем в одном окне, все они будут удалены.

1 голос
/ 24 декабря 2010

Возможно, вам нужна команда bwipe?

:bw[ipeout][!] N1 N2 ...
            Like |:bdelete|, but really delete the buffer.  Everything
            related to the buffer is lost.  All marks in this buffer
            become invalid, option settings are lost, etc.  Don't use this
            unless you know what you are doing.

Один из вариантов - определить следующее:

function! DelBuf(filename)
     let bname = bufname(filename)
     if l:bname != ""
         let bidx = buffer_number(l:bname)
         exec = "bw " . l:bidx
     endif
endfunction

и добавьте вызов к DelBuf("comapre.tmp") в начале вашей функции.

Теоретически должно быть возможно связать DelBuf с событием `bufhidden следующим образом:

autocmd! bufhidden "compare.tmp" call DelTmp("compare.tmp")

... но по какой-то причине у меня это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...