Ответы:
Вы можете использовать этот скрипт с 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
Попробуй это
bufdo bd
bufdo запускает команду для всех буферов
bd
команда не закрывала сам vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
,
Я смог сделать это довольно легко, как это:
:%bd|e#
:%bd|e#
%bd
= удалить все буферы. e#
= открыть последний буфер для редактирования. Труба между ними просто выполняет одну команду за другой.
%bd|e#|bd#
чтобы удалить [No Name]
созданный буфер.
command! BufOnly silent! execute "%bd|e#|bd#"
|
:map <leader>o :%bd\|e#<cr>
Если вам плевать на текущий, проще сделать что-то вроде (сценарий не нужен):
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
E16: Invalid range
потому что некоторые из буферов в диапазоне фактически не существуют. До недавнего времени это игнорировалось.
:ls
чтобы увидеть самый большой буфер, который у вас есть на самом деле, и установите для него диапазон (т. Е. Если ваш самый высокий буфер равен 22, тогда :1,22bd
). Я получил ту же ошибку, пока я не сделал это.
я сделаю это
:w | %bd | e#
Мой любимый, если я просто хочу, чтобы мой текущий буфер открывал и закрывал все остальные.
Как это работает: сначала запишите изменения в текущем буфере, затем закройте все открытые буферы, затем снова откройте буфер, в котором я был в данный момент. В Vim |
цепочки выполнения команд вместе. Если ваш буфер обновлен, вышеприведенное может быть сокращено до:%bd | e#
%
не может работать как весь селектор. Можете ли вы угадать что-нибудь?
bufnr("$")
которая возвращает последний номер буфера. но я понятия не имею, интерполировать в строку, когда я использую, как это :1,bufnr("$")bd
. Может быть .. лучшее решение будет :1,9999bd
.
:help :bd
показывает :%bdelete " delete all buffers
. Так %
что именно то, что вы хотите. Я использую вариант вашего решения: :%bd<CR><C-O>:bd#<CR>
это удалит все буферы, затем используйте, <C-O>
чтобы восстановить позицию в текущем файле, затем :bd#
удалить неиспользованный буфер. Это закроет все буферы и оставит вас в том же месте в файле.
Опираясь на ответ juananruiz.
Сделайте небольшое изменение в буфере, который вы хотите сохранить, затем
:1,1000bd
Команда bd
(удаление буфера) не удалит буферы с несохраненными изменениями. Таким образом, вы можете сохранить текущий (измененный) файл в списке буферов.
Изменить: Обратите внимание, что это также удалит ваш NERDTreeBuffer. Вы можете получить его обратно: NERDTree
set nohidden
чтобы быть установленным?
Закрытие всех открытых буферов:
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
Добавьте эту функцию .vimrc
и вызовите ее используя :call CloseAllBuffersButCurrent()
.
Удобная карта:
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Я положил это в мой файл .vimrc
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
тогда вы leader + ca
(закройте все) закроете все буферы, кроме текущего.
Что это делает
: w - сохранить текущий буфер
% bd - закрыть все буферы
e # - открыть последний отредактированный файл
bd # - закрыть безымянный буфер
Есть плагин, который делает именно это и немного больше!
Проверьте close-buffers.vim
Вот что я делаю. Поэтому мне нравится сохранять свою позицию курсора после удаления всех буферов, и большинство решений выше просто игнорирует этот факт. Я также думаю, что переназначить команду лучше, чем вводить ее, поэтому здесь я использую, <leader>bd
чтобы удалить все буферы и вернуться к исходной позиции курсора.
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd
= удалить все буферы.
e#
= открыть последний буфер для редактирования (это буфер, над которым я работаю).
bd#
удалить буфер [Без имени], который создается при использовании %bd
.
Труба между ними просто выполняет одну команду за другой. Вы должны избежать этого, используя\|
'"
= сохранить мою позицию курсора.
Мне нравится 1,100bd
( предложенный juananruiz ), который, кажется, работает для меня.
Я добавил quit!
в свое отображение, чтобы дать мне
nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
Это убивает все буферы и отключает Vim, что я и искал в основном.
bdq
отображение, которое закрывает все буферы и выходит из vim :q!
, когда вместо этого вы можете просто использовать :qa!
. Если только я не пропускаю что-то
Как насчет просто:
ctrl-w o
(спасибо https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally )