Как мне закрыть один буфер (из многих) в Vim?

447

Я открываю несколько файлов в Vim, например, запустив

vim a/*.php

который открывает 23 файла.

Затем я делаю правку и запускаю следующее дважды

:q

который закрывает все мои буферы.

Как вы можете закрыть только один буфер в Vim?

Лео Леопольд Герц 준영
источник
9
Обратите внимание, что вы можете открывать файлы в отдельных окнах Vim, используя vim -o a/*.php(или -Oиспользовать вертикальные окна), и избегать навигации по буферу - это отличный метод только для нескольких файлов, но с 23 файлами у них будет всего несколько строк / столбцов каждый.
Каскабель
1
@Jefromi: Спасибо, что указали на это! Я никогда раньше не использовал опцию -o.
Лео Леопольд Герц 준영
На тему оконных расколов. Если вы уже находитесь в Vim и хотите открыть другой файл в split: esp для горизонтального: evsp для вертикального.
Lanzafame

Ответы:

560

Предостережение: «w в bw означает не запись, а уничтожение!»

Больше из руководств:

: шд

Выгрузите буфер [N] (по умолчанию: текущий буфер) и удалите его из списка буферов. Если буфер был изменен, произойдет сбой, если только не указано [!], И в этом случае изменения теряются. Файл остается без изменений.

Если вы знаете, что делаете, вы также можете использовать: bw

: м.т.

Как |: bdelete |, но действительно удалите буфер.

HHH
источник
4
Также есть возможность сделать ': M, Nbd', чтобы закрыть номера буферов от M до N. Или ': bd N1 N2 ...', где N # - номер буфера
заснеженный
61
В руководстве сказано, что нужно использовать только, :bwесли «ты знаешь, что делаешь», а я нет, поэтому, думаю, я буду использовать :bd.
jberryman
1
Сначала это меня смутило - я открывал новую вкладку, чтобы закрыть буферы ... но закрытие буфера на вкладке (с использованием прямой :bd) также закрывает вкладку. То, что вы, вероятно, хотите, :bd n .. [m]или :n,mbdдля конкретных чисел или диапазона чисел, чтобы закрыть, что вы можете сделать, не глядя на буферы
JonnyRaa
6
wсокращение от writeкоманды в соответствии с руководством Vim, кроме того, нет никакого упоминания о каком-либо "уничтожении". Описание команды ( help write) начинается с «Записать весь буфер в текущий файл».
атп
3
@amn Я тоже запутался, но он имел в виду, что wв bwкоманде означает уничтожение, он не говорит о wкоманде. Он поместил это предупреждение, чтобы люди не думали, что bwкоманда означает запись в буфер (что не означает удаление буфера).
Джон
351

Если это не стало очевидным из предыдущих ответов:

: bd закроет текущий буфер. Если вы не хотите захватить список буферов.

RedBlueThing
источник
4
До того, как найти: bd, для меня никогда не было никакого смысла, что у людей не было проблем с выполнением: ls -> сканирования номера документа -> выгрузки буфера по номеру. Люди действительно находят это эффективным?
Свен
3
@svend для диапазона буферов, конечно, но для одиночного a: bd, вероятно, более эффективен.
Фарон
10
:bdтолько закрывает буфер, тогда как (что бы это ни значило), тогда как :bwтакже очищает все переменные и ДЕЙСТВИТЕЛЬНО удаляет его из lsбуфера.
RedX
1
Ответ hhh ниже более многословен…
103

Проверьте свой идентификатор буфера, используя: buffers

вы увидите список буферов там, как

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

если вы хотите удалить b.php из буфера

:2bw

если вы хотите удалить / закрыть все из буферов

:1,3bw
nightingale2k1
источник
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, чтобы команда my: bd перебирала список совпадений.

Естественно, этот метод также можно использовать для переключения на данный буфер с помощью таких команд, как: b ..: sb .. и т. Д.

Этот подход особенно полезен, когда установлена ​​опция «скрытый» Vim, потому что список буферов может быстро стать достаточно большим, охватывая несколько экранов, и затрудняя поиск нужного буфера.

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

:help wildmode

Поведение, которое я описал выше, вытекает из следующего параметра, который я выбрал для согласованности, чтобы эмулировать завершение bash:

:set wildmode=list:longest,full

В отличие от использования номеров буферов, заслуга этого подхода заключается в том, что я обычно помню, по крайней мере, часть данного имени файла, позволяя мне напрямую ориентироваться на буфер, вместо того, чтобы сначала искать его номер с помощью команды: ls.

дяденька»
источник
40

Использование:

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

Примеры:

  • удалить буфер 2:

    :bd2
    
Shaun
источник
16

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

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

из моего vimrc

Ravi
источник
2

Как насчет

vim -O a a

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

Santi
источник
2

[РЕДАКТИРОВАТЬ: это было глупое предложение от времени, когда я не знал Vim достаточно хорошо. Пожалуйста, не используйте вкладки вместо буферов; Вкладки - это «макеты окон» 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
@Nate: да, я использую wildmenu для открытия файлов, но когда в проекте много файлов, он просто не масштабируется. Также vim-noxпакет от Ubuntu имеет поддержку Ruby.
Леонид Шевцов
1

Тем, кто использует плагин для буферизации или древовидной навигации, например, Buffergator или NERDTree, нужно будет отключить эти разбиения перед уничтожением текущего буфера - иначе вы отправите свои разбиения в wonkyville

Я использую:

"" 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

Из документации плагина :

  • Закройте и удалите буфер.
  • Показать другой файл в этом окне.
  • Показать пустой файл, если у вас нет других открытых файлов.
  • Не оставляйте бесполезные буферы [без файла], если вы решите отредактировать другой файл в этом окне.
  • Работать, даже если файл открыт в нескольких окнах.
  • Работайте хорошо с различными исследователями буфера и панелями вкладок.

: bdelete vs: bwipeout

Из документации плагина :

Vim имеет две команды для закрытия буфера: :bdeleteи :bwipeout. Первый удаляет файл из списка буферов, очищает его параметры, переменные и сопоставления. Тем не менее, он остается в списке переходов, поэтому Ctrl-oвозвращает вас и снова открывает файл. Если это не то, что вы хотите, используйте :bwipeoutили Bbye эквивалент, :Bwipeoutгде вы бы использовали :bdelete.

Wolfson
источник