Vim 创建一个空白缓冲区而不是退出

Vim create a blank buffer instead of exiting

我想开始使用 Vim 作为我的主编辑器,因为我听说它真的很棒而且很有效率。所以我使用 Pathogen 安装了一堆插件,并创建了一个漂亮的长 .vimrc 文件。 我使用(并且非常喜欢)的插件之一是 NERDTree,因此我将以下行从 NERDTree git 存储库复制到我的 .vimrc 文件中:

autocmd StdinReadPre * let s:std_in = 1
autocmd VimEnter *
      \ NERDTree |
      \ wincmd p
autocmd VimEnter *
      \ if argc() == 0 && !exists("s:std_in") |
      \ NERDTree |
      \ wincmd p |
      \ endif
autocmd VimEnter *
      \ if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") |
      \ exe 'NERDTree' argv()[0] |
      \ wincmd p |
      \ ene |
      \ endif
autocmd BufEnter *
      \ if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) |
      \ q |
      \ endif

现在回答我的问题:我想做到这一点,所以无论如何,vim 不会退出,除非我 明确地 告诉它(使用特殊命令)例如 :Quit 或在 Mac Vim 上使用 q)。所以基本上,如果我只有一个缓冲区,其中包含一个打开的文件和一个 NERDTree 缓冲区(或者即使我只有一个打开的缓冲区,没有 NERDTree),当我 :q:close那个缓冲区,我希望它给我一个空白缓冲区,就像你刚打开 vim 时一样。但我不确定如何编写脚本,所以我希望得到一些帮助,了解如何添加到我的 .vimrc

TL;DR:如何让 Vim 仅使用显式命令退出,而不是在退出最后一个缓冲区时退出?

(编辑:阅读对@romainl 的回答的评论,以更清楚地了解我到底在寻找什么。

P.S。这是我的完整 .vimrc 文件,以防万一:

" => Pathogen and FTPlugins Setup
execute  pathogen#infect()
filetype plugin indent on

let mapleader = "\ "

" => Color Theme Options
colorscheme monokai

" => Custom Commands
""""command W  w
""""command Q  q
""""command Wq wq
""""command WQ wq
""""command B  b
command Tabs   set listchars=tab:\|\ ,trail:~,extends:>,precedes:<
command NoTabs set listchars=tab:\ \ ,trail:~,extends:>,precedes:<
" =*=> Plugin-Related
" =*=> Theme-Related
command Light
      \ set background=light |
      \ colorscheme solarized
command Dark
      \ set background=dark |
      \ colorscheme solarized

" => Custom Mappings
" =*=> Basic Editor Commands
nnoremap '                  :%s/
                                                        " Find and replace
nnoremap !                  :!
                                                        " Run shell command
nnoremap <C-o>    :bprevious<CR>
nnoremap <C-p>    :bnext<CR>
nnoremap <leader> <C-w>
" =*=> Workdir Manipulation
" nnoremap <C-j>    :lcd %:p:h<CR>
" =*=> Plugin-Related
" =*=*=> NERDTree
noremap  <C-f>    :NERDTreeToggle<CR>
noremap  <C-d>    :NERDTreeFind<CR>
" =*=*=> BufExplorer
nnoremap <Tab>    :BufExplorerHorizontalSplit<CR>

" => Settings
syntax on                                               " Enable syntax highlighting
set number                                              " Show line numbers
set ruler                                               " Show row & column number
set splitright                                          " Vertically split to the right by default
set splitbelow                                          " Horizontally split below by default
set ignorecase                                          " Case-insesitive tab completion
set hidden                                              " Allow buffer switching with unwritten changes
set laststatus=2                                        " Always show status bar (even when there's only one window)
set wildchar=<Tab> wildmenu wildmode=full               " Enhanced tab-completion
set listchars=tab:\|\ ,trail:~,extends:>,precedes:<     " Set symbols for hidden characters
set list                                                " Show hidden characters
set autochdir                                           " When opening a file, automatically set workingdir (of the current buffer) to the directory containing that file
set nowrap                                              " Disable line wrapping
" =*=> Tab Settings (commonly overwritten in ftplugins)
set tabstop=4
set shiftwidth=4
set shiftround
set autoindent
set smartindent
set expandtab                                           " Output spaces when pressing <Tab>, not actual tab characters ('\t')
" =*=> Split vertically by default

" =*=> GVim Settings
set guioptions-=r                                       " Remove right-hand scroll bar
set guioptions-=L                                       " Remove left-hand scroll bar
" =*=> Plugin-Related
" =*=*=> NERDTree
let NERDTreeShowHidden = 1                              " Always show hidden files
let NERDTreeShowBookmarks = 1
" =*=*=> NERDCommenter
let g:NERDSpaceDelims = 1                               " Add spaces after comment delimiters by default
let g:NERDCommentEmptyLines = 1                         " Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDTrimTrailingWhitespace = 1                    " Enable trimming of trailing whitespace when uncommenting

" => AutoCommands
autocmd BufEnter * lcd %:p:h                   " When opening a file, automatically set workingdir (of the current buffer) to the directory containing that file
" =*=>Plugin-Related
" =*=*=> NERDTree
autocmd StdinReadPre * let s:std_in = 1
autocmd VimEnter *
      \ NERDTree |
      \ wincmd p
autocmd VimEnter *
      \ if argc() == 0 && !exists("s:std_in") |
      \ NERDTree |
      \ wincmd p |
      \ endif
autocmd VimEnter *
      \ if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") |
      \ exe 'NERDTree' argv()[0] |
      \ wincmd p |
      \ ene |
      \ endif
autocmd BufEnter *
      \ if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) |
      \ q |
      \ endif
                " Up to here, copied from repository's README.md

" => Miscellanea
highlight NonText    guifg=DimGray ctermbg=NONE guibg=NONE
highlight SpecialKey guifg=DimGray ctermbg=NONE guibg=NONE " Set Hidden Characters Color

:quit:close都是windows。

如果您真的想要删除缓冲区,请使用:bdelete:bunload

此命令用新的空缓冲区 (:enew) 替换当前缓冲区并删除以前的缓冲区 (:bdelete#):

:enew|bd#

需要的话可以贴图:

nnoremap <key> :enew\|bdelete#<CR>

这将删除所有缓冲区并将您留在空白缓冲区中。

:%bd

或作为映射:

nnoremap <key> :%bd<CR>

这也会同时关闭所有 windows 和选项卡,因为如果所有缓冲区都关闭,它们会自动关闭。如果您有任何未保存的缓冲区,它就不会工作,这可能是您想要的。如果您确定要关闭而不保存,请添加 !

我通常只想关闭当前缓冲区,但仍要打开其余缓冲区。所以我用这个。如果只剩下一个缓冲区,这不会关闭任何东西。

:bp|bd#

或作为映射:

nnoremap <key> :bp\|bd#<CR>

编辑: 回应关于在只剩下一个缓冲区时使用 enew 的评论:

function! BufferDelete()
    if len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) > 1
        execute "bp|bd#"
    else
        execute "enew|bd#"
    endif
endfunction
nnoremap <key> :call BufferDelete()<CR>