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

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

vim a/*.php

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

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

:q

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

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


person Léo Léopold Hertz 준영    schedule 13.08.2009    source источник
comment
Обратите внимание, что вы можете открывать файлы в отдельных окнах Vim, используя vim -o a/*.php (или -O, чтобы использовать вертикальные окна), и избегать навигации по буферу - это отличный метод только для нескольких файлов, но с 23 файлами у них будет только несколько строк. / столбцы каждый.   -  person Cascabel    schedule 13.08.2009
comment
@Jefromi: Спасибо, что указали на это! Я никогда раньше не использовал опцию -o.   -  person Léo Léopold Hertz 준영    schedule 13.08.2009
comment
По поводу разбиения окон. Если вы уже находитесь в Vim и хотите открыть другой файл с разделением: esp для горизонтального: evsp для вертикального.   -  person Lanzafame    schedule 08.12.2014


Ответы (10)


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

Еще из руководств:

:bd

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

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

:bw

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

person hhh    schedule 04.09.2009
comment
Также возможность выполнения ': M, Nbd', чтобы закрыть номера буферов M до N. Или ': bd N1 N2 ...', где N # - номер буфера. - person snowbound; 08.04.2014
comment
В руководстве говорится, что нужно использовать :bw только в том случае, если вы знаете, что делаете, чего я не знаю, поэтому я думаю, что буду использовать :bd. - person jberryman; 23.06.2014
comment
Сначала меня это смутило - я открывал новую вкладку, чтобы закрыть буферы ... но закрытие буфера на вкладке (с использованием прямого :bd) также закрывает вкладку. Вы, вероятно, захотите :bd n .. [m] или :n,mbd для конкретных чисел или диапазона чисел, которые нужно закрыть, что вы можете сделать, не глядя на буферы. - person JonnyRaa; 19.03.2015
comment
w является сокращением от write команды согласно руководству Vim, кроме того, нет упоминания о каком-либо уничтожении. Описание команды (help write) начинается с Записать весь буфер в текущий файл. - person amn; 13.10.2016
comment
Это закрывает все разделения, на которых находится текущий буфер. Есть отличный плагин, который удалит буфер, но не изменит ваш макет vim - person schuess; 04.11.2016
comment
@amn, используя :help bw, вы увидите, что bw означает стирание. - person noark; 28.06.2017
comment
@schuess Скажите, пожалуйста, какой? - person Tom Hale; 31.10.2017
comment
Плагин @TomHale для уничтожения буферов: github.com/qpkorr/vim-bufkill - person schuess; 31.10.2017
comment
@amn Я тоже запутался, но он имел в виду, что w в команде bw означает wipeout, он не говорит о команде w. Он поместил это предупреждение, чтобы люди не думали, что команда bw означает запись в буфер (что не означает очистку буфера). - person John; 24.08.2018
comment
@noark @John Спасибо за разъяснение, это имеет смысл. help bw действительно переводит меня в совершенно не связанный с этим раздел, но help wipeout работает так, как я ожидал. - person amn; 24.08.2018
comment
Если я использую :bd или :bw в последнем открытом буфере, вместо этого он открывает новый буфер. В качестве обходного пути я пишу function! CloseOrQuit, который использует len(getbufinfo({'buflisted':1})) для проверки количества буферов, но это кажется неправильным. - person John P; 06.10.2018
comment
То, что я хочу сделать (и, возможно, OP), - это закрыть буфер, на который я смотрю, И перейти к следующему буферу в списке. Таким образом, 1_ - person Wayne Walker; 04.03.2020

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

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

person RedBlueThing    schedule 13.08.2009
comment
До того, как я нашел: bd, я никогда не понимал, что у людей нет проблем с выполнением: ls - ›сканирование на предмет номера документа -› выгрузка буфера по номеру. Действительно ли люди считают это эффективным? - person Svend; 13.08.2009
comment
@svend для ряда буферов, конечно, но для одинокого a: bd, вероятно, более эффективен. - person Pharaun; 12.08.2011
comment
:bd только закрывает буфер, тогда как (что бы это ни значило), тогда как :bw также очищает все переменные и ДЕЙСТВИТЕЛЬНО удаляет их из ls буфера. - person RedX; 13.03.2013
comment
ххх ответ ниже более подробный ... - person ; 30.01.2014

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

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

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

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

:2bw

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

:1,3bw
person nightingale2k1    schedule 13.08.2009
comment
Вы также можете стереть все буферы с помощью:% bw - person cdleonard; 13.10.2011
comment
сокращение для проверки идентификатора буфера: 2 CTRL-G - person snowbound; 08.04.2014

Вместо того, чтобы просматривать вывод команды: 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.

person guv'    schedule 20.07.2012

Использовать:

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

Примеры:

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

    :bd2
    
person Shaun    schedule 13.08.2009

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

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

из моего vimrc

person Ravi    schedule 17.11.2011

[РЕДАКТИРОВАТЬ: это было глупое предложение с тех пор, как я недостаточно хорошо знал Vim. Пожалуйста, не используйте вкладки вместо буферов; вкладки - это "макеты окон" Vim]

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

vim -p a/*.php открывает те же файлы во вкладках

gt и gT переключают вкладки вперед и назад

:q закрывает только текущую вкладку

:qa закрывает все и выходит

:tabo закрывает все, кроме текущей вкладки

person Leonid Shevtsov    schedule 05.09.2009
comment
Почему вы говорите, что использование вкладок - глупое предложение? Я спрашиваю только потому, что все время использую вкладки ...: ^ / - person Nate; 20.04.2012
comment
@Nate: Я решил подробнее рассказать об этом leonid.shevtsov.me/en/ - person Leonid Shevtsov; 24.04.2012
comment
Это был отличный пост - он вдохновил меня копнуть еще глубже - смотрели ли вы на wildmenu? Он похож на lustyjuggler (хотя и проще), но он встроен (что было хорошо для меня, потому что lustyjuggler нужен +ruby, а vim по умолчанию для ubuntu oneiric отправляется -ruby). - person Nate; 27.04.2012
comment
@Nate: да, я использую wildmenu для открытия файлов, но когда у вас много файлов в проекте, он просто не масштабируется. Также пакет vim-nox от Ubuntu поддерживает Ruby. - person Leonid Shevtsov; 28.04.2012

Как насчет

vim -O a a

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

person Santi    schedule 13.08.2009

Закрыть буфер, не закрывая окно

Если вы хотите закрыть буфер, не разрушая макет окна (текущий макет основан на разделениях), вы можете использовать подключаемый модуль, например до свидания. Исходя из этого, вы можете просто использовать

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

Или просто создайте сопоставление в своем .vimrc для облегчения доступа, например

:nnoremap <Leader>q :Bdelete<CR>

Преимущество перед vim: bdelete и: bwipeout

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

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

: bdelete против: bwipeout

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

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

person Wolfson    schedule 25.05.2020

Тем, кто использует плагин навигации по буферу или дереву, например 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. Вы можете изменить эту функцию для интеграции с вашей собственной конфигурацией.

person New Alexandria    schedule 02.01.2013
comment
для этого идеально подходит подключаемый модуль bbye, который сохраняет макет вашего окна при использовании :bdelete или :bwipeout. См. мой ответ. - person Wolfson; 25.05.2020