如何在Vim中关闭除当前编辑的缓冲区以外的所有缓冲区?
我能够轻松地像这样做到:
:%bd|e#
:%bd|e#
。 - shmup%bd
表示删除所有缓冲区。e#
表示打开最后一个缓冲区进行编辑。中间的竖线只是依次执行两个命令。 - OldTimeGuitarGuy%bd|e#|bd#
命令来删除被创建的 [No Name]
缓冲区。 - kshenoycommand! BufOnly silent! execute "%bd|e#|bd#"
。 - shmup|
符号:map <leader>o :%bd\|e#<cr>
。该命令的作用是删除当前缓冲区并重新打开之前关闭的缓冲区。 - Halil Özgürbd
命令关闭 vim 本身之前,您可能需要先关闭 NERDTree。可以使用以下命令实现:nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
。 - lvarayut你可以从vim.org使用这个脚本:
http://www.vim.org/scripts/script.php?script_id=1071
将其放在您的.vim/plugin
目录中,然后使用:BufOnly
命令关闭除当前活动缓冲区之外的所有缓冲区。您还可以在.vimrc
中将其映射到其他位置。Github源代码(通过vim-scripts镜像):https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
- Uri:ls
查看您实际打开的最大缓冲区,并将范围设置为该缓冲区(例如,如果您的最高缓冲区为22,则执行命令:1,22bd
)。在我执行这个命令之前,我也遇到了同样的错误。 - Nairou我这样做。
:w | %bd | e#
如果我只想打开当前缓冲区并关闭所有其他缓冲区,那么这是我的最爱。
工作原理:首先写入当前缓冲区的更改,然后关闭所有打开的缓冲区,最后重新打开我当前正在使用的缓冲区。在Vim中,|
将命令的执行链接在一起。如果您的缓冲区已经更新,则可以将上述内容缩短为:%bd | e#
.
bufnr("$")
,它返回最后一个缓冲区的编号。但是当我像这样使用:1,bufnr("$")bd
时,我不知道如何插入字符串。也许最好的解决方案是:1,9999bd
。 - Jinyoung Kim:help :bd
显示 :%bdelete " delete all buffers
,因此 %
正是你想要的。我使用了你解决方案的一个变体::%bd<CR><C-O>:bd#<CR>
。这将删除所有缓冲区,然后使用 <C-O>
返回到当前文件中的位置,最后使用 :bd#
删除未命名的缓冲区。这会关闭所有缓冲区并让你停留在同一位置。 - Alejandro在 juananruiz 的答案上进行改进。
对你想要保留的缓冲区进行小改动,然后执行:
:1,1000bd
bd
命令(删除缓冲区)不会删除任何存在未保存更改的缓冲区。这样你就可以在缓冲区列表中保留当前(已更改)文件。
编辑:请注意,这也会删除你的 NERDTreeBuffer。你可以使用 :NERDTree 命令恢复它。
set nohidden
? - Felipe Alvarez以下是我的做法。我喜欢在删除所有缓冲区后保持光标位置,而大多数上面介绍的解决方法都忽略了这一点。我认为重新映射命令比输入命令要好,所以我使用<leader>bd
来删除所有缓冲区并跳回原始光标位置。
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd
= 删除所有缓冲区。
e#
= 打开最后一个用于编辑的缓冲区(即我正在使用的缓冲区)。
bd#
可以删除使用 %bd
创建的 [No Name] 缓冲区。
管道符只是一个接一个地执行命令。不过,你必须使用 \|
转义它。
'"
= 保留我的光标位置。
我把这个放在我的 .vimrc 文件中
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
然后你的leader+ca
(关闭所有)会关闭除当前缓冲区之外的所有缓冲区。
它所做的是:
:w - 保存当前缓冲区
%bd - 关闭所有缓冲区
e# - 打开上次编辑的文件
bd# - 关闭未命名缓冲区
nnoremap <silent> <leader>bo :w <bar> %bd <bar> e# <bar> bd# <CR><CR>
- Harrison Cramer:w ...
更改为 :up ...
(更新),只有当前文件发生更改时才会写入。 - SergioAraujo注意: 正如评论中所提到的,这将关闭窗口而不是缓冲区。
通过使用
:on[ly][!]
and
:和:h only
C-W o
来实现这个功能。 - niidsilent! 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()
调用它。nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
:%bd|e#|bd#
命令。 - shmupnmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
。 - Gjaa