Vim:退出分屏时删除缓冲区

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”自编辑开始以来已更改。
有没有办法从缓冲区中删除该文件并关闭垂直分割窗口?
3个回答

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")

...但出于某些原因,它对我不起作用。


好的,谢谢您的评论,它很有帮助,但这不是我要问的问题。问题在于缓冲区似乎与窗口分离。因此,当您退出一个窗口时,您并没有删除它正在编辑的缓冲区。我想知道是否有可能解决这个问题。 - Rafid
你需要使用vim的“autocmd”和事件BufHidden来自动运行“:bw”命令。当缓冲区不再可见时(即,与此缓冲区相关的所有窗口都已关闭),将触发此事件。 - nimrodm

1

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

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

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

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接