vim:撤销最后关闭的buffer
在目前的主流浏览器里面,都可以撤销最后关闭的标签页。
于是我以为vim里面也有这样的功能,但是看完:help buffer后发现,这个真没有 :|
于是只好自己动手,写了个mapping
<ctrl-w>z:撤销最后关闭的buffer
"reopen last closed buffers "{{{ "exclude the buffer closed with :bw :qall :) aug BufList au! au vimenter * let g:bufList=[] au bufwinleave * call AddBufList() aug END nmap <silent> <c-w>z :call OpenBufList()<cr> nmap <silent> <c-w><c-z> <c-w>z function! AddBufList() let b=expand('<abuf>') if b > 0 let g:bufList=add(g:bufList,b) endif endfunction function! OpenBufList() if len(g:bufList) !=0 exec "sb ".remove(g:bufList,-1) endif endfunction "}}}
可以撤销:q :hid :close :only :bun :bd所关闭的buffer('hidden'选项没影响)
不会撤销 :bw :qall 所关闭的buffer
我猜也不需要撤销了吧,嗯……
NOTE:
1.<afile>是当前autocommand执行的对象,<abuf>是其buf number。不一定与“%”相同
还有一个<amatch>,看说明是指 filetype/syntax 的events时所匹配的filetype/syntax的名称
2.buffer events的执行顺序 ,'[]'括号内为'hidden'选项打开的情况。
:new => bufleave
:hid => bufleave -> bufwinleave -> bufhidden
(与:e #相同,'hidden'打开时:q,:close与之相同)
:bun => bufleave -> bufwinleave ->[bufhidden ->]bufunload
('hidden'关闭时:q,:close与之相同)
:bd => bufleave -> bufwinleave ->[bufhidden ->]bufunload -> bufdelete
:bw => bufleave -> bufwinleave ->[bufhidden ->]bufunload -> bufdelete
-> bufwipeout
(!这里的buffer不能被恢复了)
2011年12月01日 12:50
博客换主题了啊,自己写的?
主意不错,就是不太完善。建议参考下 mru.vim,做成一个插件放到 vim.org 上 :-) 我修改过的 mru.vim 在这里: https://github.com/lilydjwg/dotvim/blob/master/plugin/mru.vim
2011年12月01日 13:09
主题是simple.不过把我vim scheme里的颜色填上去了。
我其实想要一个能恢复窗口位置的,但是vim里面太不好辨识位置了。
你的意思是做成将文件列表保存在硬盘上的插件吗?
2011年12月01日 15:07
不是。mru 是保存到硬盘的,和你这个不同。
你这个还不完善,内存占用,用户配置什么的,都没处理呢。
2011年12月01日 17:19
我晕。
如果要配置的话,我的想法就是兼容'hidden'选项,对bun/bd/bw 进行设置。
但是内存占用还要怎么处理?这个只有一个number list啊
2011年12月01日 19:50
这个 list 可能不必要到增长到数百甚至上千。而且我怀疑,在 Vim 的 list 尾端添加数据的时间复杂度是 O(n)。
配置的话,当然是键映射了 ;-)
2011年12月01日 20:18
嗯,好像是有可能上千。那就只保留20个,一般也不会重复打开太多的。