Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:关闭除此之外的所有缓冲区_Vim - Fatal编程技术网

Vim:关闭除此之外的所有缓冲区

Vim:关闭除此之外的所有缓冲区,vim,Vim,如何关闭Vim中除当前编辑的缓冲区之外的所有缓冲区?您可以使用Vim.org中的以下脚本: 只需将其放入.vim/plugin目录,然后使用:BufOnly命令关闭除活动缓冲区外的所有缓冲区。您还可以在.vimrc中将其映射到您喜欢的其他位置 Github上的源代码(通过vim脚本镜像):注意:如评论中所述,这将关闭窗口,而不关闭缓冲区 利用 :on[ly][!] 及 如果您不关心当前的脚本,那么更简单的做法是(无需脚本): 基于胡安纳鲁伊斯的回答 在你想要保留的缓冲区中做一个小的改变,然后

如何关闭Vim中除当前编辑的缓冲区之外的所有缓冲区?

您可以使用Vim.org中的以下脚本:

只需将其放入
.vim/plugin
目录,然后使用
:BufOnly
命令关闭除活动缓冲区外的所有缓冲区。您还可以在
.vimrc
中将其映射到您喜欢的其他位置


Github上的源代码(通过vim脚本镜像):

注意:如评论中所述,这将关闭窗口,而不关闭缓冲区

利用

:on[ly][!]


如果您不关心当前的脚本,那么更简单的做法是(无需脚本):


基于胡安纳鲁伊斯的回答

在你想要保留的缓冲区中做一个小的改变,然后

:11000BD

命令
bd
(缓冲区删除)不会删除任何未保存更改的缓冲区。这样,您可以将当前(更改的)文件保留在缓冲区列表中

编辑:请注意,这也将删除你的NERDTreeBuffer。你可以用:NERDTree

试试这个

bufdo bd
bufdo为所有缓冲区运行命令

我这样做

:w | %bd | e#
如果我只想打开当前缓冲区并关闭所有其他缓冲区,则为我的最爱

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

如何:

ctrl-w 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

我很容易做到这一点,就像这样:

:%bd|e#

我喜欢
1100bd
(),它似乎适合我

我添加了一个
退出到我的映射以提供给我

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
nnoremap bd:1100BD
nnoremap bdq:1100bd:q!

这会杀死所有的缓冲区并关闭Vim,这正是我一直在寻找的。

有一个插件可以做到这一点,还有更多


检查

我把它放在我的.vimrc文件中

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
nnoremap ca:w%bd e#bd#
然后您的
leader+ca
(全部关闭)关闭除当前缓冲区之外的所有缓冲区

它的作用是

:w-保存当前缓冲区

%bd-关闭所有缓冲区

e#-打开上次编辑的文件


bd#-关闭未命名的缓冲区。因此,我喜欢在删除所有缓冲区后保持光标位置,而上面的大多数解决方案都忽略了这一事实。我还认为重新映射命令比键入命令更好,因此在这里我使用
bd
删除所有缓冲区并跳回原始光标位置

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
noremap-bd:%bd\|e\| bd\|”
%bd
=删除所有缓冲区

e#
=打开最后一个要编辑的缓冲区(我正在处理的缓冲区)

bd#
删除使用
%bd
时创建的[No Name]缓冲区

中间的管道只执行一个又一个命令。您必须使用
\\124;

=保持我的光标位置。

我与:

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
命令!无提示执行“%bd | norm”
  • norm
    跳转到跳转列表中的最后一个位置,这意味着光标位于
    %bd
    之前的位置
  • 我用了
    silent
    而不是
    silent。这样,如果修改了任何打开的缓冲区,Vim将打印一条错误消息,以便我知道发生了什么。修改后的缓冲区在我的测试中保持打开状态

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

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

map o:execute“%bd\| e |”

nnoremap x:execute“%bdelete\”编辑“normal”\“bdelete”#
  • 关闭所有缓冲区(副作用会创建新的空缓冲区)
  • 打开最后一个缓冲区
  • 跳转到缓冲区中的最后一个编辑位置
  • 删除空缓冲区


这会关闭窗口,而不是缓冲区。仍然很有用,因为人们可能会搜索错误的术语,并且会发现这一点。所以感谢你们两位。:@archgoon是的,但应该在答案中指定。我很完美,很简短!:):%bd实际上是“全部”“而是1-1000。这是否取决于要设置的
set nohidden
?这是最好的答案。甚至在您想要保留多个缓冲区时也可以使用。它也将关闭nerdtree缓冲区。启用nerdtree时,我在使用此命令时遇到了一些问题。我建议使用@VoY提到的BufOnly.vim插件进行编译。我制作了以下映射,用于删除NERDTree缓冲区:
nnoremap bd:%bd | NERDTree
我使用了很长时间,但现在我得到了
E16:Invalid range
,因为该范围内的一些缓冲区实际上不存在。直到最近,它一直忽略这个问题。@Jon检查
:ls
以查看实际打开的最大缓冲区,并将范围设置为该值(即,如果最高缓冲区为22,则
:1,22bd
)。在我这么做之前,我也遇到了同样的错误。这不会关闭NERDTree缓冲区。您可能希望在执行此操作之前关闭NERDTree,以防止
bd
命令关闭vim本身
nnoremap c:NERDTreeClosebufdo bd
。文档警告“不得删除缓冲区或将缓冲区添加到缓冲区列表”的参数。因此,如果这个解决方案有效,它会意外地起作用……而且它通常对我不起作用(切换到不同的缓冲区)。这会为我关闭所有缓冲区,这不是问题所问的。(MacVim版本8.0.1207)此命令关闭所有缓冲区。我怎样才能保持当前的一个打开?它大部分工作正常。但有时
%
不能作为所有选择器工作。你能猜到什么吗?@JinyoungKim(来自[1]):%bd“
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
command! Bonly silent execute "%bd|norm <C-O>"
nnoremap <leader>x :execute '%bdelete\|edit #\|normal `"'\|bdelete#<CR>