我正在编写一个需要进行一些特殊窗口管理的vim插件。我想要的是如下:
启动时,当前窗口将分为两部分,新创建的窗口将用于用户输入和插件输出。我们称之为I / O窗口。
有时需要“替换”I / O窗口。也就是说,一组新内容将替换包含I / O窗口的屏幕部分。将此称为临时窗口。但是,I / O窗口将保留在某处。当用户离开此临时窗口(使用:q或:q!)时,I / O窗口的内容将重新出现在原始位置。
我该如何做这样的事情?我已经在帮助页面上尝试了一段时间并阅读缓冲区和窗口了一段时间,但我似乎无法弄明白。
我认为应该起作用的是:
直到用户从临时窗口执行:q后,这一直有效。顶部完全消失,而不是屏幕保持分裂。尝试从此点退出会导致未保存数据出错。
提前致谢。
答案 0 :(得分:1)
为了不显示有关未保存数据的错误(而不是设置修改标记),请使用setlocal buftype=nowrite
。要在vim离开或缓冲区关闭时实际保存某些内容,请尝试
new
setlocal buftype=nowrite " or even buftype=nofile, if it is possible
let s:iobufnr=bufnr('%')
augroup FooSaveIO
autocmd!
execute "autocmd BufUnload <buffer=".s:iobufnr."> call s:SaveIO()"
augroup END
其中call s:SaveIO()
必须替换为保存此IO的命令。关于不删除窗口的退出缓冲区:尝试bufkill插件及其:BD
命令。另一种方法是捕获BufWipeout事件用于临时窗口并打开第三个窗口放置IO缓冲区(这样当临时缓冲区和关联窗口关闭时,IO窗口将显示在它们的位置),但有太多方法可以解决这个问题。