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


当前回答

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

查看close-buffers.vim

其他回答

如果你不关心当前的,更简单的做法是(不需要脚本):

1,100bd

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

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

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

关闭所有打开的缓冲区:

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并使用以下方法调用:

方便的地图:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

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

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

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

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

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

通过使用

:on[ly][!]

and

:h only