2016-12-29 3 views
0

Я хочу начать использовать Vim в качестве основного редактора, поскольку я слышал, что это действительно потрясающе и продуктивно. Поэтому я установил кучу плагинов с помощью Pathogen и создал хороший длинный файл .vimrc. Один из плагинов, которые я использую (и очень нравится) является NERDTree, поэтому я скопировал следующие строки в моем .vimrc файл из хранилища NERDTree мерзавца:Vim создает пустой буфер вместо выхода

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 

Теперь мой вопрос: Я хочу сделать это так, нет Независимо от того, ВИМ не уйдет, если я не явно сказать ему (с помощью специальной команды, как :Quit или с помощью д на MacVim). Таким образом, в основном, если у меня есть, скажем, буфер, содержащий файл, открытый вместе с буфером NERDTree (или даже если у меня только один открытый буфер, нет NERDTree), когда I :q или :close этот буфер, я хочу, чтобы он представлял я с пустым буфером, например, когда вы просто открываете vim. Но я не знаю, как это сделать, поэтому я хотел бы помочь с тем, что добавить к моему

TL; DR: Как вы делаете Vim только с помощью явной команды, а не при выходе из последнего буфер?

(EDIT: Читать комментарии к @ romainl отвечают за дополнительные пояснения о том, что именно я ищу

PS Вот мой полный .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 
+0

Что бы польза этого? Если вы хотите, чтобы пустой буфер просто делал ': enew'. – romainl

+0

Я знаю, но моя проблема в том, что в любое время я хочу закрыть файл (потому что я закончил его редактирование), я ': q' или': close'. Но большую часть времени это совершенно Вим. Мне нужно поведение, подобное большинству редакторов, где он просто откроет пустой файл – Hexa

+0

': q' для окон, а не для буферов. – romainl

ответ

0

Этот удалит все буферы и оставит вас в пустом поле.

:%bd 

Или как отображение:

nnoremap <key> :%bd<CR> 

Это также закрыть все окна и вкладки, по совпадению, потому что те закрываются автоматически, если все буферы закрыты. Это не сработает, если у вас есть несохраненные буферы, которые, вероятно, вы хотите. Добавьте !, если вы уверены, что хотите закрыть без сохранения.

Обычно я хочу закрыть только текущий буфер, но все еще остаюсь открытым. Поэтому я использую это. Это ничего не закроет, если останется только один буфер.

:bp|bd# 

Или как отображение:

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

EDIT: В ответ на комментарий об использовании 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> 
+0

Удивительный! Есть ли способ сделать это так, если буфер не оставлен, он будет делать:: enew | bd # ', * в противном случае * он будет делать': bp | bd # ', как в том же сопоставлении? – Hexa

1

Оба :quit и :close являются для окон.

Если вы действительно хотите избавиться от буфера, используйте :bdelete или :bunload.

Эта команда заменяет текущий буфер с новым пустым буфером (:enew) и удаляет предыдущий буфер (:bdelete#):

:enew|bd# 

Вы можете отобразить его, если вы хотите:

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

Спасибо! Это именно то, что я искал. Но есть ли способ сделать это так, если там будет открыт другой буфер, он переключится на него, иначе он создаст новый? – Hexa

+0

Кроме того, я должен отметить, в дополнение к тому, что я сказал выше, когда я запускаю команду, если это не единственное * окно * открыто, оно закроет окно? Итак: Если есть только одно окно и один буфер, создайте пустой. Если есть только одно окно и более одного буфера, переключитесь на следующий буфер. Если есть несколько окон, закройте окно. – Hexa

+1

Также, я должен отметить, ': bdelete' отлично работает. Проблема в том, что иногда, когда я использую ее, она дает мне ошибку: 'Ошибка обнаружена при обработке BufEnter Автокоманды для" * ":' 'E37: Нет записи с момента последнего изменения' и существует NERDTree – Hexa

Смежные вопросы