VimScript:退出文件时自动关闭各种缓冲区(Buffer)
2022年04月8日
经过调教的vim,肯定有很多插件,比如nerdtree,python-mode等等,很多插件在使用过程中,都通过新建buffer来展示其提供的内容。出于习惯,使用q
退出文件,当时vim上还有许多插件的buffer未退出,需要额外的指令执行退出(qa)。怎么在退出文件时,同时退出其它buffer?本文以vim初学者的,编写了一段vimscript实现该功能。
问题背景
经过一段时间的vim
调教,写代码时,vim
经常是下面的界面:
整个窗口分为好几块,分别是:
- 左上: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相关的基础命令:
- vim中使用
buffers
命令也可以在vim中获得buffer
列表,使用buffers!
,还可以额外获得unloaded
状态的buffer情况。 - vim中使用
help buftype
,可以看到所有buffer可能的状态,如nofile
、help
、quickfix
参考:
vimscript 基础语法:http://blog.chalda.cz/2018/08/07/Vim-script-notes.html
当前暂无评论 »