Vim: Закрийте всі буфери, але цей


Відповіді:


62

Ви можете використовувати цей скрипт від vim.org:

http://www.vim.org/scripts/script.php?script_id=1071

Просто помістіть його у свій .vim/pluginкаталог, а потім скористайтесь :BufOnlyкомандою, щоб закрити всі буфери, крім активного. Ви також можете його скласти в іншому місці .vimrc.

Джерело в Github (через дзеркало vim-script): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


171

Спробуйте це

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>.
lvarayut

11
Документація попереджає, що аргумент :bufdo"не повинен видаляти буфери або додавати буфери до списку буферів". Тож якщо це рішення працює, воно працює випадково ... і воно часто не працює для мене (переходить на інший буфер).
glts

10
Це закриває всі буфери для мене, і це не те, що задаються питаннями. (Версія MacVim 8.0.1207)
Майкл Леонард

1
Ця команда закриває всі буфери. Як я можу залишити поточний відкритим?
h-rai

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
@Finn вам потрібно втекти |:map <leader>o :%bd\|e#<cr>
Halil Özgür

57

Якщо вам не байдуже поточне, простіше зробити щось на зразок (сценарій не потрібен):

1,100bd

4
Він також закриє буфер nerdtree.
Афшин Мехрабані

Коли я включив NERDTree, я зіткнувся з деякими проблемами. Я рекомендую використовувати плагін BufOnly.vim, як згадував @VoY.
moeabdol

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#


В основному це добре працює. але іноді %не може працювати як весь селектор. Не могли б ви щось здогадатися?
Джиньюн Кім

@JinyoungKim (від [1]) У команді ":% bd" діапазон "%" буде замінено на початковий та кінцевий номери рядків у поточному буфері. Замість використання "%" як діапазону, слід вказати числа для діапазону. Наприклад, щоб видалити всі буфери, ви можете скористатися командою ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

Я щойно перевірив документ. Тож діапазон '%' покладається на ряд поточних файлових рядків?
Jinyoung Kim

2
Я знайшов вбудовану функцію, bufnr("$")яка повертає останній номер буфера. але я не маю ідеї інтерполювати в рядок, коли я використовую це :1,bufnr("$")bd. Можливо .. найкращим рішенням було б :1,9999bd.
Jinyoung Kim

2
:help :bdпоказує :%bdelete " delete all buffers. Так що %саме ви хочете. Я використовую варіант вашого рішення: :%bd<CR><C-O>:bd#<CR>Це видалить усі буфери, потім скористайтеся <C-O>для відновлення позиції в поточному файлі, а потім :bd#для видалення немедованого буфера. Це закриває всі буфери та залишає вас у тому самому місці у файлі.
Алехандро

26

Спираючись на відповідь juananruiz.

Потім внесіть невеликі зміни в буфер, який ви хочете зберегти

:1,1000bd

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

Редагувати: Зауважте, що це також видалить ваш NERDTreeBuffer. Ви можете повернути його за допомогою: NERDTree


Ідеальний, короткий і простий! :)
arkod

50
:% bd насправді "все" замість 1-1000.
Джон Тайрі

Це покладається на set nohiddenвстановлення?
Феліпе Альварес

15

За допомогою

:on[ly][!]

і

:h only

29
Це закриває вікна, а не буфери.
ZyX

13
І все-таки корисно, оскільки люди цілком можуть погуглити Google за неправильний термін, і знайдуть це. Тож дякую обом. :)
архігун

1
@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#щоб видалити буфер [No Name], який створюється під час використання %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!. Якщо я щось не
помічаю

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.