昔我往矣

VimScript:退出文件时自动关闭各种缓冲区(Buffer)

2022年04月8日

经过调教的vim,肯定有很多插件,比如nerdtree,python-mode等等,很多插件在使用过程中,都通过新建buffer来展示其提供的内容。出于习惯,使用q退出文件,当时vim上还有许多插件的buffer未退出,需要额外的指令执行退出(qa)。怎么在退出文件时,同时退出其它buffer?本文以vim初学者的,编写了一段vimscript实现该功能。

vim pic

问题背景

经过一段时间的vim 调教,写代码时,vim 经常是下面的界面:

vim window

整个窗口分为好几块,分别是:

  • 左上:nerdtree 文件目录列表窗口
  • 下方:代码运行结果窗口
  • 左上:代码编辑窗口
  • 左中:代码检查窗口

除了代码文件编辑窗口,其它窗口都是起辅助作用,因此,当退出代码编辑之后,应该要自动关闭其它窗口。

代码实现

为了实现这个功能,研究了下vimscript,使用如下代码,基本实现了该需求。

autocmd WinEnter * call s:CloseBuffersIfAllFileClosed()

function! s:CloseBuffersIfAllFileClosed()
    let open_count = 0
    let winbufs = winnr("$")

    for buf in getbufinfo()
        let buffertype = getbufvar(buf.bufnr, '&buftype', 'ERROR')
        if empty(buffertype) && buf.loaded == 1
            let open_count += 1
        endif
    endfor

    if open_count == 0
        qa
    endif
endfunction

这段代码逻辑很简单,很像伪代码,功能就是判断buffer的状态,如果没有打开文件的buffer,就执行qa退出所有。

通过 getbufinfo()函数获取所有的buffer信息,遍历所有的buffer,并获取其类型和loaded状态。

  • 如果buffer类型是"" 空字符串,表示buffer对应的是正常文件
  • 如果loaded状态为1,则表明文件已加载。

根据这两个状态识别所有的buffer,从而判断是否有文件在打开,如果没有打开的文件,则vim自动执行qa

将这段代码加入到 ~/.vimrc中,重新打开文件编辑即可生效。

其它相关

vim中其他和buffer相关的基础命令:

  1. vim中使用 buffers 命令也可以在vim中获得buffer列表,使用buffers!,还可以额外获得unloaded状态的buffer情况。
  2. vim中使用help buftype,可以看到所有buffer可能的状态,如nofilehelpquickfix

参考:

vimscript 基础语法:http://blog.chalda.cz/2018/08/07/Vim-script-notes.html

当前暂无评论 »

添加新评论 »