我怎么能关闭所有缓冲区在Vim除了一个我目前正在编辑?


当前回答

我把Alejandro的评论和badteeth的评论结合起来:

command! Bonly silent execute "%bd|norm <C-O>"

范数<C-O>跳转到跳转列表中的最后一个位置,这意味着游标在%bd之前的位置。 我用silent代替了silent!这样,如果任何打开的缓冲区被修改,Vim就会打印一条错误消息,这样我就知道发生了什么。修改后的缓冲区在我的测试中保持打开状态。

无关:这是我的第500个答案!

其他回答

票数最高的答案将重新打开缓冲区,它将失去我们正在工作的当前行。 关闭然后重新打开将导致屏幕刷新

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时,之前的代码将生效。它将关闭除当前缓冲区外的所有其他缓冲区。

它迭代所有缓冲区,并关闭所有不等于当前缓冲区数的缓冲区数。

这是一个老问题,但它帮助我为我的项目获得了一些想法。为了关闭除当前使用的缓冲区外的所有缓冲区,请使用;

map <leader>o:execute "%bd\|e#"<CR>

注意:正如注释中提到的,这会关闭窗口而不是缓冲区。

通过使用

:on[ly][!]

and

:h only

有一个插件可以做到这一点,甚至更多!

查看close-buffers.vim

我这样做

:w | %bd | e#

如果我只想打开当前缓冲区,并关闭所有其他缓冲区,这是我的最爱。

它的工作原理:首先写入当前缓冲区的更改,然后关闭所有打开的缓冲区,然后重新打开我当前所在的缓冲区。在Vim中,|将命令的执行链接在一起。如果你的缓冲区是最新的,上面可以缩短为:%bd |e#