Як закрити один буфер (із багатьох) у Vim?


445

Я відкриваю кілька файлів у Vim, наприклад, запустивши

vim a/*.php

який відкриває 23 файли.

Потім я вношу свої зміни та запускаю наступні двічі

:q

що закриває всі мої буфери.

Як можна закрити лише один буфер у Vim?


9
Зауважте, що ви можете відкривати файли в окремих вікнах Vim за допомогою vim -o a/*.php(або -Oвикористовувати вертикальні вікна) і уникати навігації по буфері - це чудовий метод лише для декількох файлів, але з 23 файлами вони матимуть лише кілька рядків / стовпців кожен.
Каскабель

1
@Jefromi: Дякую, що вказали на це! Я ніколи не використовував варіант -o раніше.
Лео Леопольд Герц 준영

На предмет розбиття вікна. Якщо ви вже знаходитесь у Vim та хочете відкрити інший файл у розщепленні: esp для горизонталі: evsp для вертикалі.
Ланзафаме

Відповіді:


558

Слово обережності: "w w bw не стоїть для запису, а для wipeout!"

Більше з посібників:

: bd

Вивантажте буфер [N] (за замовчуванням: поточний буфер) та видаліть його зі списку буферів. Якщо буфер був змінений, це виходить з ладу, якщо тільки не вказано [!], В цьому випадку зміни втрачаються. Файл не змінюється.

Якщо ви знаєте, що робите, ви також можете використовувати: bw

: bw

Як |: bdelete |, але справді видаліть буфер.


4
Також можливість робити ": M, Nbd", щоб закрити буферні числа M до N. Або ": bd N1 N2 ...", де N # є буферним номером
снігопад

61
У посібнику написано використовувати лише :bwтоді, коли "ти знаєш, що ти робиш", а я цього не роблю, тому, мабуть, буду використовувати :bd.
jberryman

1
Спочатку мене це збентежило - я відкривав нову вкладку, щоб закрити буфери ..., але закриття буфера у вкладці (за допомогою прямої :bd) також закриває вкладку. Напевно, ви хочете, :bd n .. [m]або :n,mbdзакрити конкретні числа чи діапазон чисел, що можна зробити, не дивлячись на буфери
JonnyRaa

5
wКоротка writeкоманда відповідно до посібника Vim, крім того, жодної згадки про "очищення". Опис команди ( help write) починається з "Записати весь буфер у поточний файл."
амн

3
@amn Я також розгубився, але він мав на увазі, що wв bwкоманді означає wipeout, він не говорить про wкоманду. Він поставив це попередження, щоб люди не думали, що bwкоманда означає буферне записування (це не означає, що буферне стирання.)
Іван

351

Якщо попередні відповіді цього не стають очевидними:

: bd закриє поточний буфер. Якщо ви не хочете схопити список буфера.


4
Перш ніж знайти: bd, мені ніколи не було сенсу, що люди не мали жодних проблем робити: ls -> сканувати номер документа -> вивантажувати буфер за номером. Чи насправді люди вважають це ефективним?
Svend

3
@svend для діапазону буферів впевнений, але для самотнього a: bd, ймовірно, більш ефективний.
Фараун


10
:bdзакриває тільки буфер, тоді як (що б це не означало), тоді як :bwтакож буде очищено всі змінні і дійсно виключає його з lsбуфера.
RedX

1
hhh відповідь нижче є більш багатослівним…

103

Перевірте свій ідентифікатор буфера, використовуючи: буфери

ви побачите список буферів там

1  a.php
2  b.php
3  c.php

якщо ви хочете видалити b.php з буфера

:2bw

якщо ви хочете видалити / закрити всі з буферів

:1,3bw

4
Ви також можете стерти всі буфери з:% bw
cdleonard

7
скорочення для перевірки ідентифікатора буфера: 2 CTRL-G
засніжений

43

Замість того, щоб переглядати вихід команди: ls та видаляти (вивантажувати, стирати ..) буфер, вказуючи його номер, я вважаю, що використання назв файлів часто є більш ефективним.

Наприклад, після того, як я відкрив пару .txt-файлів, щоб оновити свої спогади про якусь точну точку .. скопіюйте та вставте кілька рядків тексту, щоб використовувати їх як сортовий шаблон .. і т. Д., Я б набрав таке:

:bd txt <Tab>

Зверніть увагу, що відповідна рядок не повинна бути на початку імені файлу.

Вище наведено список імен файлів, які відповідають 'txt' у нижній частині екрана, і зберігає команду: bd, яку я спочатку набрав не торкнутою, готовою до завершення.

Ось приклад:

doc1.txt doc2.txt
:bd txt 

Я міг би повернути пробіл над бітом 'txt' і ввести ім'я файлу, яке я хочу видалити, але там, де це стає дуже зручно, це мені не потрібно: якщо я натисну клавішу Tab вдруге, Vim автоматично завершує мою команду з першим матчем:

:bd doc1.txt

Якщо я хочу позбутися цього буфера, мені просто потрібно натиснути Enter.

І якщо буфер, який я хочу видалити, стане другим (третім .. і т. Д.) Збігом, мені потрібно лише продовжувати натискати клавішу Tab, щоб перейти до мого: bd командного циклу через список збігів.

Звичайно, цей метод також може бути використаний для переключення на заданий буфер за допомогою таких команд, як: b ..: sb .. і т.д.

Цей підхід особливо корисний, коли встановлено "прихований" варіант Vim, оскільки список буферів може швидко стати досить великим, охоплюючи кілька екранів, і ускладнює виявлення конкретного буфера, який я шукаю.

Щоб максимально використати цю функцію, можливо, найкраще прочитати наступний файл довідки Vim і відповідно налаштувати поведінку завершення командного рядка Tab, щоб вона найкраще відповідала вашому робочому процесу:

:help wildmode

Поведінка, яку я описав вище, випливає з наступного налаштування, яке я вибрав заради послідовності, щоб імітувати завершення bash:

:set wildmode=list:longest,full

На відміну від використання буферних чисел, заслуга цього підходу полягає в тому, що я зазвичай пам'ятаю принаймні частину даного імені файлу, що дозволяє мені орієнтуватися безпосередньо на буфер, а не спочатку шукати його номер за допомогою команди: ls.


40

Використання:

  • :ls - перелічити буфери
  • :bd#n- закрити буфер, де #n - номер буфера (використовуйте, lsщоб отримати його)

Приклади:

  • для видалення буфера 2:

    :bd2
    

16

Ви також можете відображати наступні та попередні функціональні клавіші, роблячи легкий пробіг по буферах

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

від мого vimrc


2

Як щодо

vim -O a a

Таким чином ви можете редагувати один файл ліворуч і переміщуватися по всьому режиму справа ... Просто думка, а не рішення ...


2

[EDIT: це була дурна пропозиція, коли я не знав Віма досить добре. Будь ласка, не використовуйте вкладки замість буферів; вкладки - це "макети вікон" Vim]

Можливо, перейти на використання вкладок?

vim -p a/*.php відкриває ті самі файли на вкладках

gtі gTперемикати вкладки вперед і назад

:q закриває лише поточну вкладку

:qa закриває все і виходить

:tabo закриває все, крім поточної вкладки


2
Чому ви кажете, що використання вкладок - дурна пропозиція? Я прошу лише тому, що я весь час використовую вкладки ...: ^ /
Нейт

2
@Nate: Я вирішив детальніше зупинитися на тому leonid.shevtsov.me/en/…
Леонід Шевцов,

1
Це був чудовий пост - це надихнуло мене копатися ще глибше - ви подивилися wildmenu? Він схожий на lustyjuggler (хоча і простіший), але він вбудований (що було добре для мене, тому що lustyjuggler потребує +ruby, і vim за замовчуванням для ubuntu oneiric кораблів -ruby).
Нейт

@Nate: так, я використовую wildmenu для відкриття файлів, але коли у вас багато файлів у проекті, він просто не масштабується. Також vim-noxпакет від Ubuntu має підтримку Ruby.
Леонід Шевцов

1

Тим, хто використовує плагін навігації по буфері або дереву, наприклад Buffergator або NERDTree, потрібно буде переключити ці розбивки перед тим, як знищити поточний буфер - інакше ви відправите свої розбивки в winkyville

Я використовую:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Де " NERDTreeToggle" у цьому списку те саме, що вводити текст :NERDTreeToggle. Ви можете змінити цю функцію для інтеграції з власною конфігурацією.


для цього ідеально підходить плагін bbye , який зберігає макет вашого вікна при використанні :bdeleteабо :bwipeout. Дивіться мою відповідь .
Вольфсон

0

Закрийте буфер, не закриваючи вікно

Якщо ви хочете закрити буфер, не руйнуючи макет свого вікна (поточний макет на основі розщеплення), ви можете використовувати плагін типу bbye . Виходячи з цього, ви можете просто використовувати

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

Або просто створіть у вашому відображенні .vimrcдля легшого доступу

:nnoremap <Leader>q :Bdelete<CR>

Перевага над vim's: bdelete та: bwipeout

З документації на плагін :

  • Закрийте та вийміть буфер.
  • Показати ще один файл у цьому вікні.
  • Показуйте порожній файл, якщо у вас немає інших файлів.
  • Не залишайте марні буфери [no file], якщо ви вирішите редагувати інший файл у цьому вікні.
  • Працюйте, навіть якщо файл відкритий у кількох вікнах.
  • Добре працюйте з різними дослідниками буфера та вкладками.

: bdelete vs: bwipeout

З документації на плагін :

Vim має дві команди для закриття буфера: :bdeleteі :bwipeout. Перший видаляє файл зі списку буферів, очищує його параметри, змінні та відображення. Однак він залишається у списку переходів, тому Ctrl-oповертає вас назад і знову відкриває файл. Якщо це не те, що ви хочете, використовуйте :bwipeoutабо еквівалент Bbye там, :Bwipeoutде ви б використовували :bdelete.

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