我怎么能关闭所有缓冲区在Vim除了一个我目前正在编辑?
你可以从vim.org上使用这个脚本:
http://www.vim.org/scripts/script.php?script_id=1071
只要把它放到你的.vim/plugin目录下,然后使用:BufOnly命令关闭所有的缓冲区,除了活动缓冲区。你也可以在.vimrc中把它映射到你喜欢的其他地方。
.vim/plugin
:BufOnly
.vimrc
来源在Github(通过vim-scripts镜像):https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
请注意:正如注释中提到的,这将关闭窗户和没有缓冲。
通过使用
:on[ly][!]
而且
:h only
如果你不关心当前的,更简单的做法是(不需要脚本):
1,100bd
基于juanruiz的回答。
然后,在想要保留的缓冲区中做一个小更改
:1,1000bd
命令bd(缓冲区删除)将不会删除任何未保存更改的缓冲区。通过这种方式,您可以将当前(已更改的)文件保存在缓冲列表中。
bd
编辑:请注意,这也会删除你的NERDTreeBuffer。你可以用NERDTree把它找回来
试试这个
bufdo bd
Bufdo为所有缓冲区运行命令
http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers
我这样做
:w | %bd | e#
如果我只想打开当前缓冲区,并关闭所有其他缓冲区,这是我的最爱。
它的工作原理:首先写入当前缓冲区的更改,然后关闭所有打开的缓冲区,然后重新打开我当前所在的缓冲区。在Vim中,|将命令的执行链接在一起。如果你的缓冲区是最新的,上面的可以缩短为:%bd | e#
|
:%bd | e#
这样如何:
ctrl-w o
(感谢https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally)
关闭所有打开的缓冲区:
silent! execute "1,".bufnr("$")."bd"
关闭所有打开缓冲区除了现在这个:
function! CloseAllBuffersButCurrent() let curr = bufnr("%") let last = bufnr("$") if curr > 1 | silent! execute "1,".(curr-1)."bd" | endif if curr < last | silent! execute (curr+1).",".last."bd" | endif endfunction
将此函数添加到.vimrc并使用:call CloseAllBuffersButCurrent()调用它。
:call CloseAllBuffersButCurrent()
方便的地图:
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
我可以很容易地做到这一点,像这样:
:%bd|e#
我喜欢1,100bd (由juananruiz建议),这似乎对我有用。
我添加了一个quit!到我的映射给我
quit!
nnoremap <leader>bd :1,100bd<CR> nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
这会杀死所有缓冲区并关闭Vim,这正是我最想要的。
有一个插件函数可以做到这一点,甚至更多!
查看close-buffers.vim .vim
我把它放在。vimrc文件中
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
然后leader + ca (close all)关闭除当前缓冲区外的所有缓冲区。
leader + ca
它的作用是
:w -保存当前缓冲区
%bd -关闭所有缓冲区
e# -打开上次编辑的文件
关闭未命名缓冲区
我是这么做的。所以我喜欢在删除所有缓冲区后保持光标的位置,上面的大多数解决方案都忽略了这个事实。我还认为重新映射命令比键入它更好,所以在这里我使用<leader>bd删除所有缓冲区,并跳回我原来的光标位置。
<leader>bd
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd =删除所有缓冲区。
%bd
e# =打开最后一个缓冲区进行编辑(这是我正在工作的缓冲区)。
e#
bd#来删除使用%bd时创建的[No Name]缓冲区。
bd#
中间的管道只是执行一个又一个命令。你必须使用\|来转义它
\|
'" =保持光标位置。
'"
我将亚历杭德罗的评论和badteeth的评论结合起来:
command! Bonly silent execute "%bd|norm <C-O>"
norm <C-O>
silent
silent!
无关:这是我的第500个答案!
这是一个老问题,但它帮助我为我的项目获得了一些想法。为了关闭除当前使用的缓冲区外的所有缓冲区,请使用;
map <leader>o :execute "%bd\|e#"<CR>
nnoremap <leader>x :execute '%bdelete\|edit #\|normal `"'\|bdelete#<CR>
function! CloseOtherBuffer() let l:bufnr = bufnr() execute "only" for buffer in getbufinfo() if !buffer.listed continue endif if buffer.bufnr == l:bufnr continue else if buffer.changed echo buffer.name . " has changed, save first" continue endif let l:cmd = "bdelete " . buffer.bufnr execute l:cmd endif endfor endfunction let mapleader = ',' nnoremap <leader>o :call CloseOtherBuffer()<CR>
当你在目标缓冲区上并按+ o时,之前的代码将生效。它将关闭除当前缓冲区外的所有其他缓冲区。
它迭代所有缓冲区,并关闭所有不等于当前缓冲区数的缓冲区数。
:%bd then Ctrl-o
:%bd删除所有缓冲区
按Ctrl-o跳转回最后一个缓冲区,这将是“This one”;你刚才提到的。