I want to start using Vim as my main editor, as I heard it is really awesome and productive. So I installed a bunch of plugins using Pathogen, and created a nice, long .vimrc
file.
One of the plugins I use (and really like) is NERDTree
, so I copied the following lines into my .vimrc
file from the NERDTree git repository:
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
Now to my question: I want to make it so no matter what, vim won't quit unless I explicitly tell it to (using a special command like :Quit
or using ⌘q on MacVim). So basically, if I only have, say, a buffer containing a file open along with a NERDTree buffer (or even if I just have a single buffer open, no NERDTree), when I :q
or :close
that buffer, I want it to present me with a blank buffer, like when you just open vim. But I am not sure how to script that, so I would love some help on what to add to my .vimrc
TL;DR: How do you make Vim only exit using an explicit command, and not when you quit the last buffer?
(EDIT: Read the comments to @romainl's answer for more clarification about what exactly I'm looking for.
P.S. Here's my full .vimrc
file, just in case:
" => 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
This will delete all buffers and leave you in a blank one.
Or as a mapping:
This will also close all windows and tabs coincidentally because those close automatically if all the buffers are closed. It won't work if you have any unsaved buffers, which is probably what you want. Add a
!
if you're sure you want to close without saving.I usually want to close just the current buffer, but still have the rest open. So I use this. This won't close anything if there is only one buffer left.
Or as a mapping:
EDIT: In response to comment about using
enew
when there is only one buffer left: