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


Ответы:


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


172

Попробуй это

bufdo bd

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

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


Это не закрывает буфер 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#

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

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#


В основном работает нормально. но иногда %не может работать как весь селектор. Можете ли вы угадать что-нибудь?
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


Отлично, коротко и просто! :)
аркод

50
:% bd на самом деле "все" вместо 1-1000.
Джон Тайри

Это полагается, set nohiddenчтобы быть установленным?
Фелипе Альварес

15

Используя

:on[ly][!]

и

:h only

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>

Я заметил, что при возобновлении сеансов 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 # - закрыть безымянный буфер



1

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

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

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

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

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

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

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


0

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

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

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.