3

我的 .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”自编辑开始后已更改。

无论如何要从缓冲区中删除文件以及关闭垂直拆分窗口?

4

3 回答 3

1

您需要使用 autocmd winleave bd(缓冲区删除)。请注意,如果您在多个窗口中打开缓冲区,它们都将被删除。

于 2010-12-25T11:38:03.677 回答
1

我通常为diff-buffers定义以下内容:

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

第一行是什么会在你的情况下有所不同(:h 'bh'-> 不需要单个执行 autcocommand),第二行只是一个快捷方式。

顺便说一句:使用r! git而不是生成临时文件。这样,您也不必清除该文件。

于 2010-12-24T21:58:32.183 回答
1

也许您需要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")

...但由于某种原因,它对我不起作用。

于 2010-12-24T20:01:38.970 回答