Vim: закройте все буферы, кроме этого

198

Как я могу закрыть все буферы в Vim, кроме того, который я сейчас редактирую?

Рафид
источник
1
Я нашел эту ссылку
klokop

Ответы:

62

Вы можете использовать этот скрипт с 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

VOY
источник
172

Попробуй это

bufdo bd

bufdo запускает команду для всех буферов

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers

gayavat
источник
Это не закрывает буфер NERDTree.
Ури
2
Возможно, вы захотите закрыть NERDTree перед этим, чтобы bdкоманда не закрывала сам vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>,
Иварают
11
Документация предупреждает, что аргумент :bufdo«не должен удалять буферы или добавлять буферы в список буферов». Так что, если это решение работает, оно работает случайно ... и часто у меня не работает (переключается на другой буфер).
Glts
10
Это закрывает все буферы для меня, а это не то, что задают вопросы. (MacVim версия 8.0.1207)
Майкл Леонард
1
Эта команда закрывает все буферы. Как я могу оставить текущий открытый?
H-Рай
145

Я смог сделать это довольно легко, как это:

:%bd|e#
OldTimeGuitarGuy
источник
4
Это хороший ответ. Это заставляет BufOnly чувствовать себя немного излишним (я имею в виду, целый плагин?), Если вы не используете функцию передачи аргументов в BufOnly. Все, что я действительно хочу сделать, это:%bd|e#
shmup
42
@jorgeh %bd= удалить все буферы. e#= открыть последний буфер для редактирования. Труба между ними просто выполняет одну команду за другой.
OldTimeGuitarGuy
20
@Jared Вы можете использовать, %bd|e#|bd#чтобы удалить [No Name]созданный буфер.
кшеной
12
Чудесно. Тогда здесь у вас есть единственная вещь, для которой я когда-либо использовал плагин BufOnly, отобранный для одной команды:command! BufOnly silent! execute "%bd|e#|bd#"
shmup
4
@ Финн, тебе нужно сбежать |:map <leader>o :%bd\|e#<cr>
Халил Озгюр,
57

Если вам плевать на текущий, проще сделать что-то вроде (сценарий не нужен):

1,100bd
juananruiz
источник
4
Он также закроет буфер ботанического дерева.
Афшин Мехрабани
Я столкнулся с некоторыми проблемами при использовании этой команды, когда NERDTree включен. Я рекомендую использовать плагин BufOnly.vim, как упомянуто @VoY.
моэбдол
1
Я сделал следующее сопоставление, которое объясняет удаление буфера NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
5
Я использовал это в течение долгого времени, но теперь я получаю, E16: Invalid rangeпотому что некоторые из буферов в диапазоне фактически не существуют. До недавнего времени это игнорировалось.
Джон
3
@Jon Проверьте, :lsчтобы увидеть самый большой буфер, который у вас есть на самом деле, и установите для него диапазон (т. Е. Если ваш самый высокий буфер равен 22, тогда :1,22bd). Я получил ту же ошибку, пока я не сделал это.
Nairou
51

я сделаю это

:w | %bd | e#

Мой любимый, если я просто хочу, чтобы мой текущий буфер открывал и закрывал все остальные.

Как это работает: сначала запишите изменения в текущем буфере, затем закройте все открытые буферы, затем снова откройте буфер, в котором я был в данный момент. В Vim |цепочки выполнения команд вместе. Если ваш буфер обновлен, вышеприведенное может быть сокращено до:%bd | e#

iamnotsam
источник
В основном работает нормально. но иногда %не может работать как весь селектор. Можете ли вы угадать что-нибудь?
Jinyoung Ким
@JinyoungKim (из [1]) В команде ":% bd" диапазон '%' будет заменен номерами начальной и конечной строк в текущем буфере. Вместо использования «%» в качестве диапазона, вы должны указать числа для диапазона. Например, чтобы удалить все буферы, вы можете использовать команду ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Я только что проверил документ. Итак, диапазон '%' зависит от количества текущих строк файла?
Jinyoung Ким
2
Я нашел встроенную функцию, bufnr("$")которая возвращает последний номер буфера. но я понятия не имею, интерполировать в строку, когда я использую, как это :1,bufnr("$")bd. Может быть .. лучшее решение будет :1,9999bd.
Jinyoung Ким
2
:help :bdпоказывает :%bdelete " delete all buffers. Так %что именно то, что вы хотите. Я использую вариант вашего решения: :%bd<CR><C-O>:bd#<CR>это удалит все буферы, затем используйте, <C-O>чтобы восстановить позицию в текущем файле, затем :bd#удалить неиспользованный буфер. Это закроет все буферы и оставит вас в том же месте в файле.
Алехандро
26

Опираясь на ответ juananruiz.

Сделайте небольшое изменение в буфере, который вы хотите сохранить, затем

:1,1000bd

Команда bd(удаление буфера) не удалит буферы с несохраненными изменениями. Таким образом, вы можете сохранить текущий (измененный) файл в списке буферов.

Изменить: Обратите внимание, что это также удалит ваш NERDTreeBuffer. Вы можете получить его обратно: NERDTree

cutemachine
источник
Отлично, коротко и просто! :)
аркод
50
:% bd на самом деле "все" вместо 1-1000.
Джон Тайри
Это полагается, set nohiddenчтобы быть установленным?
Фелипе Альварес
15

Используя

:on[ly][!]

и

:h only
klokop
источник
30
Это закрывает окна, а не буферы.
ZyX
13
По-прежнему полезно, так как люди вполне могут погуглить за неправильный термин и найдут это. Так что спасибо вам обоим. :)
Archgoon
2
@archgoon да, но следует указать в ответе.
andho
10

Закрытие всех открытых буферов:

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>
mynyml
источник
Я заметил, что при возобновлении сеансов vim, которые восстанавливают буферы, я больше не мог удалять буферы, используя описанное выше. Вместо этого я должен был использовать:%bd|e#|bd#
shmup
Лучшее решение. Я добавил команду, чтобы открыть NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa
6

Я положил это в мой файл .vimrc

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

тогда вы leader + ca(закройте все) закроете все буферы, кроме текущего.

Что это делает

: w - сохранить текущий буфер

% bd - закрыть все буферы

e # - открыть последний отредактированный файл

bd # - закрыть безымянный буфер

Юлин
источник
4

Есть плагин, который делает именно это и немного больше!

Проверьте close-buffers.vim

Нико Беллик
источник
1

Вот что я делаю. Поэтому мне нравится сохранять свою позицию курсора после удаления всех буферов, и большинство решений выше просто игнорирует этот факт. Я также думаю, что переназначить команду лучше, чем вводить ее, поэтому здесь я использую, <leader>bdчтобы удалить все буферы и вернуться к исходной позиции курсора.

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = удалить все буферы.

e# = открыть последний буфер для редактирования (это буфер, над которым я работаю).

bd#удалить буфер [Без имени], который создается при использовании %bd.

Труба между ними просто выполняет одну команду за другой. Вы должны избежать этого, используя\|

'" = сохранить мою позицию курсора.

0xMH
источник
0

Мне нравится 1,100bd( предложенный juananruiz ), который, кажется, работает для меня.

Я добавил quit!в свое отображение, чтобы дать мне

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

Это убивает все буферы и отключает Vim, что я и искал в основном.

LazyRiverYogi
источник
1
У вас действительно нет причин иметь bdqотображение, которое закрывает все буферы и выходит из vim :q!, когда вместо этого вы можете просто использовать :qa!. Если только я не пропускаю что-то
shmup